我正在尝试将多个视频合并到一个同时播放的视频中。 我的第一个问题是,在服务器或用户电话上进行合并更好吗? 以及如何快速合并视频?我试图通过谷歌搜索找到解决方案,但很快就找不到任何解决方案。任何帮助将不胜感激
答案 0 :(得分:1)
在服务器或用户电话上进行合并更好吗?
这确实取决于。服务器通常很昂贵,但是它们在支持方面给您带来了更多的灵活性,而且您只需要创建一次功能,而不是每个平台一次。如果可能,我会一直在设备上进行操作。因此,就您而言,“设备”似乎是必经之路。
如何在Swift上合并视频?我试图找到解决方案 谷歌搜索它,但我在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
}
玩得开心。