AVMutableComposition - 是不是可以有 2 个并行音轨?

Posted

技术标签:

【中文标题】AVMutableComposition - 是不是可以有 2 个并行音轨?【英文标题】:AVMutableComposition - are 2 parallel audio tracks possible?AVMutableComposition - 是否可以有 2 个并行音轨? 【发布时间】:2010-11-01 20:59:11 【问题描述】:

我成功地将视频和音轨混合在一起,并将其导出为新的 .m4v 文件。

我现在的问题是,我想将相同的视频文件和 2 个音频文件混合在一起,它们是两个 AVAssetTrack 并且具有相同的时间线。就像您在音频编辑器中执行此操作一样,您可以在其中混合两个或多个声音文件,然后得到一个合并文件。

这可能吗?如果是,我必须如何进行?

目前我在继续后只听到一个声音文件,而不是两个。

顺便说一句:我的目标是“简单地”在已经有声音的视频中包含一个额外的声音文件,并将它与新的声音文件混合在一起。但似乎 AVAssetTrack 只允许音频或视频,因此我从原始视频中制作了一个新的音频 AVAssetTrack。也许这是错误的......

提前谢谢你!

【问题讨论】:

【参考方案1】:

没有看到你的代码很难帮助你。也许这段代码可以提供帮助:

    AVMutableComposition* composition = [AVMutableComposition composition];

    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoURL options:nil];
    AVURLAsset* audioAsset1 = [[AVURLAsset alloc]initWithURL:audioURL1 options:nil];
    AVURLAsset* audioAsset2 = [[AVURLAsset alloc]initWithURL:audioURL1 options:nil];

    AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

        NSError* error = NULL;

        [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,videoAsset.duration) 
                                       ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] 
                                        atTime:kCMTimeZero  
 AVMutableCompositionTrack *compositionAudioTrack1 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

        [compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero,audioAsset1.duration) 
                                       ofTrack:[[audioAsset1 tracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0] 
                                        atTime:kCMTimeZero
                                         error:&error];

 AVMutableCompositionTrack *compositionAudioTrack2 = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

        [compositionAudioTrack2 insertTimeRange:CMTimeRangeMake(kCMTimeZero,audioAsset2.duration) 
                                       ofTrack:[[audioAsset2 tracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0] 
                                        atTime:kCMTimeZero
                                         error:&error];

现在只需使用 AVExportSession 导出此合成。并且不要忘记释放资产。

【讨论】:

嗨史蒂夫,我尝试了关于代码。当我尝试执行“[[audioAsset1 trackingWithMediaType:AVMediaTypeAudio]objectAtIndex:0]”时,它给出了错误(空数组的索引 0 超出范围)。但是当我尝试在控制台中打印 audioAsset1 时,它正在打印“”。我检查了路径,那个文件在那里。我的错误是什么?请告诉我。 当我加载到资产的文件没有支持的数据类型时出现这些错误,如果该类型,请尝试检查文件 但在我的应用程序中,.m4a 文件正在使用 AVAudioPlayer 播放。所以请告诉我这段代码我的错误是什么。 我已将其发布在以下网址中。 ***.com/questions/4398764/… @jfalexvijay 我面临同样的问题。我检查了史蒂夫提供的链接,但没有成功。正如 jfalexvijay 提到的,我得到了同样的错误,比如(索引 0 超出范围),我得到了 jfalexvijay 提到的路径。请如果你能够解决它,请帮助我。谢谢

以上是关于AVMutableComposition - 是不是可以有 2 个并行音轨?的主要内容,如果未能解决你的问题,请参考以下文章

AVMutableComposition 调整大小问题

AVMutableComposition - 只播放第一首曲目 (Swift)

使用 AVPlayer 音频播放 AVMutableComposition 会不同步

AVFoundation - 视频没有在 AVplayer 的 AVMutablecomposition 中播放

使用 AVMutableComposition 组合视频和音频

使用 AVMutableComposition 导出镜像视频会导致调整大小问题