将音频与视频合并

时间:2012-04-27 19:12:12

标签: iphone objective-c

我正在尝试将音频文件与视频文件合并。 这是我的努力:

AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];

AVMutableComposition* mixComposition = [AVMutableComposition composition];

AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                                                                                    preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) 
                                    ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 
                                     atTime:kCMTimeZero error:nil];

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

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                                                                      presetName:AVAssetExportPresetHighestQuality];   

NSString* videoName = @"export.mov";

NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
NSURL    *exportUrl = [NSURL fileURLWithPath:exportPath];

if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}

_assetExport.outputFileType = @"com.apple.quicktime-movie";
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) {      
            // your completion code here
     }       
 }
 ];

一切似乎都运行良好,但我不知道为什么这段代码不起作用! 我也获得音频和视频资产。但我无法创建导出会话。

1 个答案:

答案 0 :(得分:2)

尝试使用AVAssetExportPresetPassthrough

同时检查您是否能够使用完成代码

获得错误
 [_assetExport exportAsynchronouslyWithCompletionHandler:
     ^(void ) { 
         switch (_assetExport.status) 
         {
             case AVAssetExportSessionStatusFailed:
             {
                 NSLog (@"FAIL %@",_assetExport.error);
                 break;
             }
             case AVAssetExportSessionStatusCompleted: 
             {
                 break;
             }
             case AVAssetExportSessionStatusCancelled: 
             {
                 NSLog (@"CANCELED");
                 break;
             }
         }
         NSLog(@"Export Status %d-- %@", _assetExport.status, _assetExport.outputURL);
        }
     ];