2

1 つのビデオ アセットと 1 つのオーディオ アセットを に追加し、AVMutableComposition使用後に再生可能な mov ファイルを取得することに問題はありませんAVAssetExportSession。ただし、最初のビデオ トラックの直後に別のビデオ トラックを追加しようとすると、問題が発生します。1) 最初のビデオが再生され、その最後のフレームが mov ファイルの間フリーズされます (2 番目のビデオは決して再生されません)。2) 2 番目のビデオが完全に再生されるまで表示される黒いフレームがあります。3) セッションはまったくエクスポートされません。

それぞれinsertTimeRange:ofTrack:の .. メソッドでビデオ アセットの時間範囲を調整することで、これらのさまざまな結果が得られます。

AVURLAsset *firstAsset = [AVURLAsset URLAssetWithURL:vidPathURL options:nil];
AVURLAsset *secondAsset = [AVURLAsset URLAssetWithURL:audPathURL options:nil];   
AVURLAsset *thirdAsset = [AVURLAsset URLAssetWithURL:vidPathURL2 options:nil]; 

AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];

AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

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

CMTime nextClipStartTime = CMTimeAdd(kCMTimeZero, firstAsset.duration);
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, thirdAsset.duration);
AVAssetTrack *secondVideoTrack = [[thirdAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
[firstTrack insertTimeRange:timeRange ofTrack:secondVideoTrack atTime:nextClipStartTime error:nil];

AVMutableCompositionTrack *secondTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

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

CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(M_PI_2);
firstTrack.preferredTransform = rotationTransform;
    // export session

ここで何を調整する必要があるかについて、誰かが考えを持っていますか?

ありがとう。

4

2 に答える 2

0

私の推測は:
[secondTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];

に置き換える必要があります
[secondTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:firstAsset.duration error:nil];

次に、AVMutableVideoCompositionLayerInstructionオブジェクトの不透明度を設定する必要があります。このハウツーをお勧めします。

于 2012-11-30T13:00:18.910 に答える
0

追加する 2 番目のビデオ トラックと共にオーディオ トラックを追加します。または、追加する 2 つのビデオ クリップの長さと同じ長さのオーディオ トラックを 1 つ追加します。アイデアは、オーディオ/ビデオ トラックの両方を同じ長さにすることです。

于 2012-09-08T21:37:36.007 に答える