2013-03-01 3 views
3

내 응용 프로그램에서 오디오 및 비디오를 병합해야하며 Mediaplayer에서 오디오 파일을 재생해야합니다. IOS에서 오디오와 비디오를 어떻게 병합 할 수 있습니까? 거기에 어떤 소스 코드가있다. 이AVMutableCompositionTrack을 사용하여 오디오 및 비디오를 병합하는 방법

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 
    }  
} 
]; 
+0

예를 들어 WWDC 비디오 + 샘플 코드를 살펴보십시오. –

답변

10

를 사용하여 사전에 몇 가지 아이디어 나에게 오디오 및 비디오 파일

+0

이 코드를 사용해 보았습니다. 그것은 작동하지 않습니다 또한 위의 코딩에 하나의 버그가 있습니다. initWithURL을 URLAssetWithURL로 바꿉니다. – btmanikandan

+0

1 초 오디오 파일과 3 초 비디오 파일로이 코드를 사용했습니다. 그 결과 검은 색 화면의 오디오가 1 초, 검은 색 화면이 2 초, 비디오의 3 초가 뒤 따랐습니다. 이 문제의 원인을 아십니까? 비디오의 처음 부분에 오디오를 추가하기 만하면됩니다. –

+0

하나의 오디오/비디오 파일 만 병합 중입니다. 문제는 저의 비디오 파일은 40 초이고 오디오 파일은 28 초입니다. 나머지 12 (40-28) 초 동안 - 오디오 파일에서 0 초부터 반복하고 싶습니다. 어떻게 그럴 수 있니? 직접 할 수있는 방법이 있습니까? – Hemang

1
+0

[링크 전용 답변] (http://meta.stackoverflow.com/tags/link-only-answers/info)은 권장하지 않으므로 SO 답변은 솔루션 검색의 종점이어야합니다 (시간이 지남에 따라 부실 해지는 경향이있는 참조의 또 다른 중간 기착). 링크를 참조 용으로 유지하면서 독립형 시놉시스를 여기에 추가하는 것을 고려해보십시오. – kleopatra

2

당신은 변경 가능한 구성을 만들어 비디오를 병합 할 수 있습니다 병합에 대한이 튜토리얼을

감사를 제안하십시오.

AVMutableComposition* composition = [[AVMutableComposition alloc]init]; 
AVURLAsset* video1 = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:path1]options:nil]; 

NSArray *pathComponents = [NSArray arrayWithObjects: 
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],@"MyAudio.m4a",nil]; 

    NSURL *outputFileURL = [NSURL fileURLWithPathComponents:pathComponents]; 
AVAsset *audioAsset = [AVAsset assetWithURL:outputFileURL]; 

//Create mutable composition of audio type 
AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

[audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,video1.duration) 
ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

    AVMutableCompositionTrack* composedTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

[composedTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, video1.duration) 
ofTrack:[[video1 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
atTime:kCMTimeZero error:nil]; 


AVAssetExportSession*exporter = [[AVAssetExportSession alloc]initWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; 

[exporter exportAsynchronouslyWithCompletionHandler:^{ 
      case AVAssetExportSessionStatusFailed: 
       NSLog(@"Failed to export video"); 
       break; 
      case AVAssetExportSessionStatusCancelled: 
       NSLog(@"export cancelled"); 
       break; 

} 

비디오 병합의 경우이 자습서를 방문하십시오. http://iosbucket.blogspot.in/2015/04/mp4-conversion-and-video-merging-in-ios.html

비디오를 병합하는 샘플 프로젝트를 찾을 수도 있습니다.

관련 문제