9

この質問はAVMutableComposition - ビデオ アセット間のブランク/ブラック フレームにかなり関連していますが、私は AVAssetExportSession を使用していないため、答えは私の問題に適合しません。

AVMutableComposition を使用してビデオ コンポジションを作成し、AVAssetReader を使用してそれを読み取っています (フレーム データが必要です。AVPlayer は使用できません)。オーディオに目立ったグリッチはありません)。

コンポジションを次のように作成します

AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

NSMutableArray* durationList = [NSMutableArray array];
NSMutableArray* videoList= [NSMutableArray array];
NSMutableArray* audioList= [NSMutableArray array];

for (NSInteger i = 0; i < [clips count]; i++)
{
    AVURLAsset *myasset = [clips objectAtIndex:i];
    AVAssetTrack *clipVideoTrack = [[myasset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    [videoList addObject:clipVideoTrack];

    AVAssetTrack *clipAudioTrack = [[myasset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    [audioList addObject:clipAudioTrack];

    CMTime clipDuration = [myasset duration];
    CMTimeRange clipRange = CMTimeRangeMake(kCMTimeZero, clipDuration);
    [durationList addObject:[NSValue valueWithCMTimeRange:clipRange]];
}

[compositionVideoTrack insertTimeRanges:durationList ofTracks:videoList atTime:kCMTimeZero error:nil];
[compositionAudioTrack insertTimeRanges:durationList ofTracks:audioList atTime:kCMTimeZero error:nil];

また、作曲に各トラックを手動で挿入しようとしましたが、同じ現象が発生します。

ありがとう

4

3 に答える 3

25

何時間ものテストの末、この問題を解決することができました。変更する必要があったことが 2 つあります。1) アセットの作成時に「正確」オプションを追加します。

 NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey:@YES};
 AVURLAsset *videoAsset3 = [AVURLAsset URLAssetWithURL:clip3URL options:options];

2) 使わない

CMTime duration3 = [videoAsset3 duration];

代わりに使用

AVAssetTrack *videoAsset3Track = [[videoAsset3 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CMTime duration3 = videoAsset3Track.timeRange.duration;

これは、AVPlayer の背景色を青に設定した後にわかりました。その後、青いフレームが表示されることに気付きました。問題はタイミングに関係していました。上記の設定に変更すると、次を使用すると、さまざまなビデオがうまく調整されます。

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

[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration3)
                        ofTrack:videoAsset3Track
                         atTime:kCMTimeZero error:&error];
于 2013-10-10T12:31:21.720 に答える
0

2 つのビデオ トラックを作成してみて、クリップを追加するときに 2 つを交互に使用します。

于 2012-08-20T12:27:43.493 に答える