多个音轨的 AVMutableAudioMix 音量无法正常工作

Posted

技术标签:

【中文标题】多个音轨的 AVMutableAudioMix 音量无法正常工作【英文标题】:AVMutableAudioMix volume of multiple tracks not working correctly 【发布时间】:2015-10-14 19:31:19 【问题描述】:

我有一个简单的编辑器,它可以连接本地视频文件并在其上添加来自本地文件的音乐。

我正在创建一个合成和合成轨道,并将视频 a/v 轨道添加到它们:

NSMutableArray *audioInputParams = [NSMutableArray array];
AVMutableComposition *composition = [NSMutableComposition composition];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

for (AVURLAsset *asset in assets) 
    AVAssetTrack *audioTrack = [asset compatibleTrackForCompositionTrack:compositionAudioTrack];
    AVAssetTrack *videoTrack = [asset compatibleTrackForCompositionTrack:compositionVideoTrack];

    // compositionAudioTrack insert audioTrack
    // compositionVideoTrack insert videoTrack

这一切都很好。生成的视频完美地切入了声音和视频。

UI 中有一个滑块,可以在原始视频声音和音乐声音之间进行交叉渐变。滑块从 0 变为 1,AV 音量也是如此。

对于每个视频音量,我使用滑块值减一,对于音乐,我使用它的值。

    AVMutableAudioMixInputParameters *audioMixParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
    [audioMixParameters setVolume:1.0 - [slider value] atTime:kCMTimeZero];
    [audioInputParams addObject:audioMixParameters];


AVMutableCompositionTrack *compositionMusicTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
AVURLAsset *musicAsset;
AVAssetTrack *musicTrack = [musicAsset compatibleTrackForCompositionTrack:compositionMusicTrack];

[compositionMusicTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [composition duration])
                               ofTrack:musicTrack
                                atTime:kCMTimeZero
                                 error:nil];

AVMutableAudioMixInputParameters *musicInputParameter = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:musicTrack];
[musicInputParameter setVolume:[slider value] atTime:kCMTimeZero];

[audioInputParams addObject:musicInputParameter];

AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
[audioMix setInputParameters:audioInputParams];

当我现在使用音频混合进行播放或渲染时,音频混合不起作用。当我将视频音量设置为 1 时,它是听不见的。设置为零时,我能听到。

无论我为音乐设置什么值,输出都是满的。

我也尝试设置 trackID,但也没有。另外,这不是滑块的问题,我尝试对各种浮点值进行硬编码,结果发现它不起作用。

现在我不明白为什么会这样。这很奇怪,我无法解释。

【问题讨论】:

【参考方案1】:

我不确定您是否将音频混合添加到正确的对象中,audiomix 不会添加到合成本身。要查看音频混合的效果,您需要在播放时将其添加到 AVPlayerItem 的实例中,或者在导出时将其添加到 AVAssetExportSession 中。看看AVFoundation Programming Guide

【讨论】:

“当我现在使用音频混合进行播放或渲染时,[...]”请正确阅读问题。它必须对订单左右做点什么,但我已经解决了,所以我要删除问题 对不起,我错过了。但请提供有关您如何解决此问题的答案,AVFoundation 非常复杂,这个问题可能对包括我在内的其他人有用,因为我就是这样回答您的问题的首先,我在使用 audiomix 时遇到了类似的问题。 会更好,你是对的。我需要查找实际问题,这很奇怪。给我一点时间;) 我能得到你的答案吗?拜托。我也有同样的问题。

以上是关于多个音轨的 AVMutableAudioMix 音量无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Monster Audio 使用教程 发送音轨的设置

请问怎么在Guitar Pro 5.2里把两个音轨的内容叠加进第三个音轨?

如何填充音轨的开头?

guitar pro 7怎么切换音轨的音色

在 ffmpeg 中混合音轨的文件上添加另一个音频

是否有相当于 android 的音轨的 iOS?