使用多个音频类型的 AVAsset 轨道切换 AVURLAsset 的音轨

Posted

技术标签:

【中文标题】使用多个音频类型的 AVAsset 轨道切换 AVURLAsset 的音轨【英文标题】:Switch audio trakcs for AVURLAsset with multiple AVAssetTracks of type audio 【发布时间】:2011-09-12 18:21:05 【问题描述】:

我有一个带有多个音频类型的 AVAssetTracks 的 AVURLAsset。我希望能够允许用户通过触摸按钮在这些不同的音轨之间切换。它正在打开和关闭第一首曲目的音量,但在音量设置为 1.0 时听不到其他曲目。

这里是调整音轨音量的代码(sender 是一个 UIButton,标签设置为 audioTracks 中的资产索引)。

AVURLAsset *asset = (AVURLAsset*)[[player currentItem] asset];
NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];


NSMutableArray *allAudioParams = [NSMutableArray array];
int i = 0;
NSLog(@"%@", audioTracks);
for (AVAssetTrack *track in audioTracks) 
    AVMutableAudioMixInputParameters *audioInputParams =    [AVMutableAudioMixInputParameters audioMixInputParameters];
    float volume = i == sender.tag ? 1.0 : 0.0;
    [audioInputParams setVolume:volume atTime:kCMTimeZero];
    [audioInputParams setTrackID:[track trackID]];
    [allAudioParams addObject:audioInputParams];
    i++;

AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix];
[audioZeroMix setInputParameters:allAudioParams];

[[player currentItem] setAudioMix:audioZeroMix];

我是否需要做一些事情才能使所需的曲目成为活跃的曲目?

【问题讨论】:

【参考方案1】:

好的,发现问题。与上述代码无关,因为它工作正常。问题是没有启用除第一轨以外的音频的 AVAssetTracks。为了使他们必须使用 AVMutableComposition 重新创建资产:

NSURL *fileURL = [[NSBundle mainBundle]
                  URLForResource:@"movie" withExtension:@"mp4"];

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];

AVMutableComposition *composition = [AVMutableComposition composition];

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

[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) 
                               ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] 
                                atTime:kCMTimeZero
                                 error:&error];

NSArray *allAudio = [asset tracksWithMediaType:AVMediaTypeAudio];
for (int i=0; i < [allAudio count]; i++) 
    NSError* error = NULL;
    AVAssetTrack *audioAsset = (AVAssetTrack*)[allAudio objectAtIndex:i];

    AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) 
                                   ofTrack:audioAsset
                                    atTime:kCMTimeZero
                                     error:&error];

    NSLog(@"Error : %@", error);


【讨论】:

非常感谢!这帮助很大! 谢谢谢谢谢谢!这非常有帮助!

以上是关于使用多个音频类型的 AVAsset 轨道切换 AVURLAsset 的音轨的主要内容,如果未能解决你的问题,请参考以下文章

更改 AVAsset 的首选数量

为啥 AVAsset 轨道对于同一个视频文件有不同的 timeRange?

iOS开发:AVPlayer实现流音频边播边存

如何使用 expo-av 在本机反应中播放背景音频?

FFMPEG - 转换具有多个音频和字幕的视频

无法正确反转 AVAsset 音频。唯一的结果是白噪声