2012-02-01 4 views
7

Этот вопрос довольно связан с AVMutableComposition - Blank/Black frame between videos assets, но поскольку я не использую AVAssetExportSession, ответы не подходят моей проблеме.Черные кадры в AVMutableComposition

Я использую 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]; 

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

Благодаря

+0

Вы когда-нибудь решают эту проблему? У меня такая же проблема. – elprl

+0

@elprl Я посмотрел на свой код, и он остался почти таким же. Я думаю, что мы «исправили» проблему путем настройки (интервал ключевого кадра, частота кадров, ...) входного формата видео (мы можем его контролировать). Это было давно, и я не могу точно сказать, какой параметр улучшил ситуацию. – chub

ответ

0

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

19

Мне удалось решить эту проблему после многих часов тестирования. Мне нужно изменить две вещи. 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]; 
+2

Спасибо @elprl .. это работает отлично – MAMN84

Смежные вопросы