Черные рамки в AVMutableComposition - PullRequest
       20

Черные рамки в AVMutableComposition

7 голосов
/ 01 февраля 2012

Этот вопрос очень связан с 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];

Я также пытался вставить каждую композицию вручную в мою композицию, но у меня есть такое же явление.

Спасибо

Ответы [ 2 ]

21 голосов
/ 10 октября 2013

Мне удалось решить эту проблему после многих часов тестирования. Есть две вещи, которые мне нужно было изменить. 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];
0 голосов
/ 20 августа 2012

Попробуйте создать две видеодорожки, а затем чередуйте их при добавлении клипов.

...