2

以下のコードを使用して、ドキュメント フォルダーに保存されている 2 つの m4v ファイルをマージしようとしています。

CMTime insertionPoint = kCMTimeZero;
NSError * error = nil;

AVMutableComposition *composition = [AVMutableComposition composition];

AVURLAsset* asset = [AVURLAsset URLAssetWithURL: [assetURLArray objectForKey:kIntroVideo] options:nil];

if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
                          ofAsset:asset 
                           atTime:insertionPoint 
                            error:&error]) 
{
    NSLog(@"error: %@",error);
}

insertionPoint = CMTimeAdd(insertionPoint, asset.duration);

AVURLAsset* asset2 = [AVURLAsset URLAssetWithURL: [assetURLArray objectForKey:kMainVideo] options:nil];

if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset2.duration) 
                          ofAsset:asset2 
                           atTime:insertionPoint 
                            error:&error]) 
{
    NSLog(@"error: %@",error);
}

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

NSString *exportVideoPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/FinishedVideo.m4v"];

NSURL *exportURL = [NSURL fileURLWithPath:exportVideoPath];
exportSession.outputURL = exportURL;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
    switch (exportSession.status) {
        case AVAssetExportSessionStatusFailed:{
            NSLog (@"FAIL");
            break;
        }
        case AVAssetExportSessionStatusCompleted: {
            NSLog (@"SUCCESS");
}
};
 }]; 
}

問題は、2 つのビデオが正しくマージされないことです。結合されたムービーの長さの合計は正しいですが、ビデオが 2 番目のムービーに遷移することはなく、最初のムービーの最後のフレームが引き続き表示されます。奇妙なことに、2 番目のビデオの音声がバックグラウンドで再生されているのが聞こえます。

誰が何が間違っているのか考えていますか?

編集 - 奇妙なことに、まったく同じ長さの 2 つのクリップをマージすると機能します。

編集 - 同じ問題でファイル拡張子を .mov に変更しようとしました。

4

2 に答える 2

2

コンポジションを exportSession に設定していません。

行の後:

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

この行を追加

exportSession.videoComposition = composition;

これで問題が解決するはずです。

于 2015-03-03T14:41:30.203 に答える
1

わかりました-最終的に、個々のAVMutableCompositionトラックを使用して、オーディオ用とビデオ用の可変コンポジションを設定することで、これが機能するようになりました。

于 2012-04-25T18:10:55.837 に答える