3

iPhoneでavcompositionを使用して、2つのビデオを次々に表示するビデオを作成しようとしています。このコードは機能しますが、新しく作成されたビデオの全期間で 1 つのビデオしか表示できません

- (void) startEdit{

 AVMutableComposition* mixComposition = [AVMutableComposition composition];

 NSString* a_inputFileName = @"export.mov";
 NSString* a_inputFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:a_inputFileName];
 NSURL*    a_inputFileUrl = [NSURL fileURLWithPath:a_inputFilePath];

 NSString* b_inputFileName = @"output.mov";
 NSString* b_inputFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:b_inputFileName];
 NSURL*    b_inputFileUrl = [NSURL fileURLWithPath:b_inputFilePath];

 NSString* outputFileName = @"outputFile.mov";
 NSString* outputFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:outputFileName];
 NSURL*    outputFileUrl = [NSURL fileURLWithPath:outputFilePath];

 if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
  [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];



 CMTime nextClipStartTime = kCMTimeZero;

 AVURLAsset* a_videoAsset = [[AVURLAsset alloc]initWithURL:a_inputFileUrl options:nil];
 CMTimeRange a_timeRange = CMTimeRangeMake(kCMTimeZero,a_videoAsset.duration);
 AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
 [a_compositionVideoTrack insertTimeRange:a_timeRange ofTrack:[[a_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];

 nextClipStartTime = CMTimeAdd(nextClipStartTime, a_timeRange.duration);

 AVURLAsset* b_videoAsset = [[AVURLAsset alloc]initWithURL:b_inputFileUrl options:nil];
 CMTimeRange b_timeRange = CMTimeRangeMake(kCMTimeZero, b_videoAsset.duration);
 AVMutableCompositionTrack *b_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    [b_compositionVideoTrack insertTimeRange:b_timeRange ofTrack:[[b_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];



 AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetLowQuality];   
 _assetExport.outputFileType = @"com.apple.quicktime-movie";
 _assetExport.outputURL = outputFileUrl;

 [_assetExport exportAsynchronouslyWithCompletionHandler:
  ^(void ) {
   [self saveVideoToAlbum:outputFilePath]; 
  }       
  ];

}


- (void) saveVideoToAlbum:(NSString*)path{
 if(UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path)){
  UISaveVideoAtPathToSavedPhotosAlbum (path, self, @selector(video:didFinishSavingWithError: contextInfo:), nil);
 }
}

- (void) video: (NSString *) videoPath didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo {
 NSLog(@"Finished saving video with error: %@", error);
} 

他の誰かを助けるかもしれないので、コード全体を投稿しました。

すべきではない

nextClipStartTime = CMTimeAdd(nextClipStartTime, a_timeRange.duration);

[b_compositionVideoTrack insertTimeRange:b_timeRange ofTrack:[[b_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];

最初の動画の最後に 2 番目の動画を追加する

乾杯

4

2 に答える 2

3

理解した。AVMutableCompositionTrack は 1 つだけである必要があります。

そのようです:

CMTime nextClipStartTime = kCMTimeZero;

    AVURLAsset* a_videoAsset = [[AVURLAsset alloc]initWithURL:a_inputFileUrl options:nil];
    CMTimeRange a_timeRange = CMTimeRangeMake(kCMTimeZero,a_videoAsset.duration);
    AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    [a_compositionVideoTrack insertTimeRange:a_timeRange ofTrack:[[a_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];

    nextClipStartTime = CMTimeAdd(nextClipStartTime, a_timeRange.duration);

    AVURLAsset* b_videoAsset = [[AVURLAsset alloc]initWithURL:b_inputFileUrl options:nil];
    CMTimeRange b_timeRange = CMTimeRangeMake(kCMTimeZero, b_videoAsset.duration);
    [a_compositionVideoTrack insertTimeRange:b_timeRange ofTrack:[[b_videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];
于 2010-10-14T19:52:42.557 に答える
1

私はまだ欠陥を発見していませんが、いくつかの提案があります。

最初に、insertTimeRange およびその他すべての機会でエラーをキャプチャし、検査します。

第 2 に、ビデオを追加する単純なケースの場合、トラックをあまりいじらずに AVMutableComposition を使用できます。ファイルから初期化された AVAssets で "insertTimeRange:ofAsset:atTime:error:" を使用すると、コードが大幅に簡素化されます。クロスフェードなど、より複雑なことを行う必要がある場合は、ビデオ構成とオーディオ ミックスも使用する必要があり、その時点で複雑なトラックに対処できます。

于 2010-10-14T19:55:10.103 に答える