ios - 如何并排合并多个视频 swift 4

标签 ios swift

我正在尝试将多个视频合并到一个同时播放的视频中。 我的第一个问题是,在服务器上还是在用户手机上进行合并更好? 我怎样才能在 swift 上合并视频?我试图通过谷歌搜索找到解决方案,但我无法快速找到任何解决方案。任何帮助将不胜感激

最佳答案

Is it better to do the merging on server or on user's phone?

这真的取决于。服务器通常很昂贵,但它们在支持方面给你更多的灵 active ,而且你只需要为每个平台创建一次功能而不是一次。如果可能的话,我总是会在设备上进行。因此,在您的情况下,“设备”似乎是可行的方法。

How can i merge videos on Swift? I tried to find the solution by googling it but i couldn't find any on Swift.

Swift 本身将无法完成您的要求。您将需要允许此类事情的工具/框架。您可以在 iOS 上找到它们。

首先,您应该尝试具体说明您在做什么。单个视频(在大多数情况下)由视频和音频轨道组成。从标题中我可以推断出视频轨道应该并排放置,而没有关于音频的信息。此外,还有一个问题是如何为不具有相同视频分辨率的视频完成“并排”。有几种可能性。还有一个问题是,当并非所有视频的长度都相同时会发生什么情况?

您案例中的视频部分可能应该归结为特定帧速率的图像。对于应该在给定时间为每个视频获取 UIImage 的 iOS,将图像拼接在一起,将新图像插入拼接的视频文件中。所以你在找什么:

  • 在特定时间从视频中获取UIImage(尝试this)
  • 将图像合并在一起看起来很有希望 here
  • UIImage 创建视频可能需要更多工作,但请查看 this

当然,您仍然需要决定选择哪种输出视频。不同大小的视频怎么办,不同长度的视频怎么办。但这些都只是决定,都可以在 UIImage 的层面上完成。

您需要决定使用什么帧速率。我想没有理由不只使用像 30FPS 这样的固定帧,这意味着你正在迭代时间 CMTimeMake(i, 30) 其中 i 范围内[0, videoDuration*30].

唯一剩下的就是音频部分,您可能会从中找到一些线索 here .

所以整体的高级代码应该是这样的:

func mergeVideos(urls: [URL]) -> URL {
    let overallSize: CGSize = sizeForStichedVideos(urls: urls)
    let overallDuration: TimeInterval = longestVideoFrom(urls: urls)
    let frameRate: Int = decideFrameRateForVideos(urls: urls)

    let stichedVideo: VideoObject = VideoObject(size: overallSize, duration: overallDuration, frameRate: frameRate)

    for frameIndex in 0..<Int(ceil(overallDuration))*frameRate {
        let time = CMTime(value: frameIndex, timescale: frameRate)
        let images: [UIImage?] = imagesFromVideos(urls: urls, at: time)
        let stichedImage: UIImage = stitchImages(images)
        stichedVideo.appendVideoSample(withImage: stichedImage, at: time)
        // TODO: append audio samples
    }
    stichedVideo.finalize()

    return stichedVideo.outputURL
}

玩得开心。

关于ios - 如何并排合并多个视频 swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53205913/

相关文章:

ios - SwiftUI 中是否有 .onReappear 等价物

ios - 未调用自定义单元格 didSelectRowAtIndexPath

ios - 应用在 UIButtonLabel defaultAttributes 上崩溃

ios - 将父容器的平移手势传递给嵌套的 UICollectionView

ios - Snapkit,将 UILabel 粘到底部

ios - JSTileMap(.tmx) 与 Xcode SKTileMapNode

iphone - 在 canAuthenticateAgainstProtectionSpace 中检查公钥

ios - 获取上个月的天数

ios - 检查文本字段是否为空导致 Swift 2 中的错误

swift - 如何在执行 navigationLink 之前执行操作