Переключите звуковые дорожки для AVURLAsset с несколькими AVAssetTracks типа аудио
У меня есть AVURLAsset с несколькими AVAssetTracks типа аудио. Я хотел бы иметь возможность позволить пользователю переключаться между этими различными звуковыми дорожками, касаясь кнопки. Он работает для включения и выключения громкости 1-го трека, но другие треки не слышны, когда громкость установлена на 1.0.
Вот код для регулировки громкости треков (отправителем является UIB-кнопка с тегом, установленным на индекс актива в 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 для аудио, отличного от 1-го трека, не были включены. Чтобы включить их, пришлось воссоздать ресурс с помощью 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);
}