使用AVAssetReader和AVAssetWriter合并*.mp3和*.mov文件

3
我使用AVAssetWriter创建了一个*.mov文件。我使用了来自AVCaptureSession的截图和音频CMSampleBuffer,并将其传递给AVAssetWriter的输入,这样就可以工作了。
现在我想将*.mov文件与iPod / iPhone音乐库中的音乐(很可能是*.mp3)合并。因此,我的初始想法是使用AVAssetReader从*.mp3和*.mov文件中获取样本,并将样本传递到AVAssetWriter。这样行吗?仅通过阅读文档,我认为这是可能的。
我尝试了一下这个想法,但没能让它起作用。
我的第一次尝试是使用2个AVAssetReaders,每个文件一个。我使用AVAssetReaderAudioMixOutput作为第1个读取器的输出,然后使用AVAssetReaderVideoCompositionOutput作为第2个读取器的输出。问题是,使用AVAssetReaderVideoCompositionOutput需要您传递一个AVVideoComposition。我无法创建AVVideoComposition / AVMutableVideoComposition,所以我放弃了这个解决方案。我不明白为什么需要传递AVVideoComposition,我只想获取电影的样本。
因此,我的第二次尝试类似,但我使用2个AVAssetReaderTrackOutput而不是AVAssetReaderVideoCompositionOutput作为第2个读取器的输出。所以现在我有2个读取器,总共有3个输出,我尝试使用输出中的样本,并将其传递给AVAssetWriter创建一个*.mov文件。我能够运行它,没有错误/崩溃。但我无法播放结果为*.mov的文件。其播放时间为0。因此,使用AVAssetReader + AVAssetWriter的想法又失败了。
那么我的问题是:您可以使用AVAssetReader和AVAssetWriter合并两个文件吗?有人尝试过这样做并使其起作用吗?我应该只使用AVMutableVideoComposition吗?
如果需要,我将发布我的代码。
1个回答

2
您可以使用AVAssetReader和AVAssetWriter来合并这两个文件,但这可能比您需要的控制/能力曲线更远。
使用AVAssetExportSession可能更适合,因为您可以在几行代码中合并音频和视频轨道:
1. 创建一个包含mp3和mov作为AVCompositionTracks的AVComposition。 2. 使用AVAssetExportSession导出AVComposition。

感谢您的回复。只是为了明确。通过将mp3与电影合并,我指的是使mp3成为电影的背景音乐。使用AVAsset+AVAssetWriter可以做到这一点吗?我认为可以使用AVComposition完成。 - calampunay
可以用两种方式来实现,但是使用AVAssetWriter比较困难。 - Rhythmic Fistman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接