2012-02-17 9 views
3

私の質問は、ほぼ同じ期間を持つビデオとオーディオファイルをマージする方法ですか?ビデオとオーディオファイルをマージするにはどうすればいいですか?

私はこの質問を検索して回答しました。しかし、彼らが与えたコードを試してみると、 "ゼロ以外のバイト"のムービーは生成されません。

あなたはそれを見て、それが間違っていた場所を見ることができますか?

-(void)putTogether 
{ 
NSLog(@"Starting to put together all the files!"); 

AVMutableComposition *mixComposition = [AVMutableComposition composition]; 

NSString *audioPath = @"/Users/admin/Documents/Sound.caf"; 
NSURL *audioUrl = [NSURL fileURLWithPath:audioPath]; 
//AVURLAsset *audioasset = [AVURLAsset URLAssetWithURL:audioUrl options:nil]; 
AVURLAsset *audioasset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil]; 

NSString *videoPath = @"/Users/admin/Documents/video.mp4"; 
NSURL *videoUrl = [NSURL fileURLWithPath:videoPath]; 
//AVURLAsset *videoasset = [AVURLAsset URLAssetWithURL:videoUrl options:nil]; 
AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil]; 

NSString *moviepath = @"/Users/admin/Documents/fmovie.mov"; 
NSURL *movieUrl = [NSURL fileURLWithPath:moviepath]; 

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

AVMutableCompositionTrack *compositionTrackB = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVAssetTrack *clipVideoTrackB = [[videoasset tracksWithMediaType:AVMediaTypeVideo] lastObject]; 
[compositionTrackB insertTimeRange:CMTimeRangeMake(  kCMTimeZero, videoasset.duration) ofTrack:clipVideoTrackB atTime:kCMTimeZero error:nil]; 

AVMutableCompositionTrack *compositionTrackA = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVAssetTrack *clipAudioTrackA = [[audioasset tracksWithMediaType:AVMediaTypeAudio] lastObject]; 
[compositionTrackA insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioasset.duration) ofTrack:clipAudioTrackA atTime:kCMTimeZero error:nil]; 

AVAssetExportSession *exporter =[[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; 
//AVAssetExportSession *exporter =[AVAssetExportSession exportSessionWithAsset:mixComposition presetName:AVAssetExportPresetLowQuality]; 
NSParameterAssert(exporter!=nil); 
exporter.outputFileType=AVFileTypeQuickTimeMovie; 
exporter.outputURL=movieUrl; 
CMTime start=CMTimeMake(0, 600); 
CMTime duration=CMTimeMake(600, 600); 
CMTimeRange range=CMTimeRangeMake(start, duration); 
exporter.timeRange=range; 
[exporter exportAsynchronouslyWithCompletionHandler:nil]; 
} 
+0

thanks @ user1192409この投稿は私にとってとても役に立ちます。 書き込みが終了したらいつでも1つの質問だけがあります。 – KDeogharkar

+0

こんにちは、私を助けてもらえますか?このコードを使用しましたが、ファイルをマージする際にビデオを取得できません。 assetSessionのAVAssetExportSessionStatusCompletedステータスを取得できますが、ビデオを見ることはできません。私は私のビデオファイルをチェックして、それは適切です..私のオーディオファイルも適切です...しかし、両方のビデオが表示されていない合併しています....あなたは何が問題になるか教えていただけますか? – DShah

答えて

0

(。。問題の編集によってOPで回答コミュニティのwikiの答えに変換Question with no answers, but issue solved in the comments (or extended in chat)を参照してください)

OPは書きました:

を、私は私の問題を解決しました。

a.Delete次のコード::私がやったのと同じ問題を抱えているもののため

は、ここでは簡単な解決策である。

CMTime start=CMTimeMake(0, 600); 
CMTime duration=CMTimeMake(600, 600); 
CMTimeRange range=CMTimeRangeMake(start, duration); 
exporter.timeRange=range; 

B(別売)書き換え完了ハンドラ:

[exporter exportAsynchronouslyWithCompletionHandler:^{ 
    switch ([exporter status]) { 
     case AVAssetExportSessionStatusFailed: 
      NSLog(@"Export failed: %@", [[exporter error] localizedDescription]); 
      break; 
     case AVAssetExportSessionStatusCancelled: 
      NSLog(@"Export canceled"); 
      break; 
     default: 
      break; 
    } 
}]; 

c。プログラムの書き込みが完了するまで待ってください。

関連する問題