我正在尝试将多个视频合并到一个同时播放的视频中。 我的第一个问题是,在服务器上还是在用户手机上进行合并更好? 我怎样才能在 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
的层面上完成。
您需要决定使用什么帧速率。我想没有理由不只使用像 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/