2013-08-07 2 views
2

Я пытаюсь сшить кучу видео вместе, а затем добавить музыку поверх видео в iOS. Аудио добавляется с использованием AVMutableAudioMix. Однако, когда видео окончательно экспортируется, аудиомикс отсутствует. Вот как выглядит код:Смешивание аудио в iOS с использованием AVFoundation не работает

- (void)mergeVideos:(NSArray *)videos{ 
    AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init]; 
    AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
                     preferredTrackID:kCMPersistentTrackID_Invalid]; 
    AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                     preferredTrackID:kCMPersistentTrackID_Invalid]; 
    CMTime currentTime = kCMTimeZero; 
    for (AVAsset *asset in videos) { 
     // 2 - Video track 
     [videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
          ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:currentTime error:nil]; 
     [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
          ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:currentTime error:nil]; 
     currentTime = CMTimeAdd(currentTime, asset.duration); 
    } 
     // 4 - Get path 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent: 
          [NSString stringWithFormat:@"mergeVideo-%d.mp4",arc4random() % 1000]]; 
    NSURL *url = [NSURL fileURLWithPath:myPathDocs]; 
    // 5 - Create exporter 
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:mixComposition]; 
    NSString *quality = AVAssetExportPresetHighestQuality; 
    //load the audio 
    AVMutableAudioMix *audioMix = nil; 
    NSURL *audioURL = [self loadAudioFile];// gives a url for a .caf file from the bundle 
    if (audioURL) { 
     AVURLAsset *audioAsset = [AVURLAsset assetWithURL:audioURL]; 
     AVAssetTrack *aTrack = (AVAssetTrack *)[[audioAsset tracksWithMediaType:AVMediaTypeAudio] firstObject]; 

     AVMutableAudioMixInputParameters *trackMix = 
     [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:aTrack]; 

     [trackMix setVolumeRampFromStartVolume:0 toEndVolume:1 timeRange: 
     CMTimeRangeMake(CMTimeMakeWithSeconds(0, 1), CMTimeMakeWithSeconds(3, 1))]; 
     [trackMix setVolume:1.0 atTime:kCMTimeZero]; 
     AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
     audioMix.inputParameters = [NSArray arrayWithObject:trackMix]; 
    } 

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                     presetName:quality]; 
    if (audioMix) { 
     exporter.audioMix = audioMix; 
    } 
    exporter.outputURL=url; 
    exporter.outputFileType = AVFileTypeMPEG4; 
    exporter.shouldOptimizeForNetworkUse = YES; 
    [exporter exportAsynchronouslyWithCompletionHandler:^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self exportDidFinish:exporter]; 
     }); 
    }]; 
} 

Ошибка при выполнении. Только то, что музыка, содержащаяся в файле .caf, не смешивается с экспортированным файлом. Любая идея, что происходит?

ответ

3

Вы не ввели звук из файла .caf в любой номер AVMutableCompositionTrack, поэтому аудио-соединение, связанное с aTrack, не будет настраивать том для файла .caf. Если вы хотите, чтобы звук из .caf файла, который будет включен в видео с соответствующей аудио миксе, создать другой AVMutableCompositionTrack провести аудио из .caf файла:

AVMutableCompositionTrack *audioTrackCAF = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                    preferredTrackID:kCMPersistentTrackID_Invalid]; 

(с диапазонов времени набора по своему вкусу):

[audioTrackCAF insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) 
          ofTrack:aTrack atTime:kCMTimeZero error:nil] 

Дополнительно, полезно пройти NSError * (вместо nil) для insertTimeRange:ofTrack:atTime:error, чтобы убедиться, что вы имели действительные временные диапазоны и ваши средства массовой информации была вставлена.

 Смежные вопросы

  • Нет связанных вопросов^_^