2012-02-01 24 views
7

To pytanie jest dość związane z AVMutableComposition - Blank/Black frame between videos assets, ale ponieważ nie używam AVAssetExportSession odpowiedzi nie pasują do mojego problemu.Czarne ramki w AVMutableComposition

Używam AVMutableComposition do tworzenia kompozycji wideo i czytam ją za pomocą AVAssetReader (potrzebuję danych ramek, nie mogę używać AVPlayer), ale często mam czarne ramki pomiędzy filmami kawałki (nie ma zauważalnego usterki w dźwięku).

tworzę moje skład jak

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]; 

Próbowałem też wstawić każdą ścieżkę ręcznie w mojej kompozycji, ale mam to samo zjawisko.

Dzięki

+0

Czy kiedykolwiek rozwiązałeś ten problem? Mam podobny problem. – elprl

+0

@elprl Spojrzałem na mój kod i pozostał prawie taki sam. Myślę, że "naprawiliśmy" problem, poprawiając (częstotliwość klatek, częstotliwość klatek, ...) format wejściowy wideo (możemy to kontrolować). To było dawno temu i nie mogę powiedzieć na pewno, jaki parametr poprawił sytuację. – chub

Odpowiedz

0

Spróbuj utworzyć dwie ścieżki wideo, a następnie zastępcy między nimi podczas dodawania klipów.

19

Udało mi się rozwiązać ten problem po wielu godzinach testów. Są dwie rzeczy, które muszę zmienić. 1) dodaj "dokładną" opcję podczas tworzenia zasobu.

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

2) nie używać

CMTime duration3 = [videoAsset3 duration]; 

użycie zamiast

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

Znalazłem się po tym, jak ustawić AVPlayer kolor tła na niebieski, a potem zauważyłam niebieskie ramki pojawiające się, więc problem dotyczył czasu. Po zmianie powyższych ustawień różne filmy były wyrównane w porządku:

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

[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration3) 
         ofTrack:videoAsset3Track 
         atTime:kCMTimeZero error:&error]; 
+2

Dzięki @elprl .. to działa idealnie – MAMN84