2012-02-01 14 views
7

Questa domanda è abbastanza correlata a AVMutableComposition - Blank/Black frame between videos assets ma poiché non sto utilizzando una AVAssetExportSession, le risposte non corrispondono al mio problema.Cornici nere in AVMutableComposition

Sto usando una composizione AVMutable per creare una composizione video e la sto leggendo utilizzando un AVAssetReader (ho bisogno di avere i dati del frame, non posso usare un AVPlayer) ma spesso ho dei fotogrammi neri tra il mio video pezzi (non è presente alcun problema nell'audio).

Creo il mio Composizione come

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

Ho anche cercato di inserire manualmente ciascuna traccia nella mia composizione ma ho lo stesso fenomeno.

Grazie

+0

Hai mai risolto questo problema? Sto avendo un problema simile. – elprl

+0

@elprl Ho dato un'occhiata al mio codice ed è rimasto più o meno lo stesso. Penso che abbiamo risolto il problema modificando (intervallo di fotogrammi chiave, framerate, ...) l'input del formato video (possiamo controllarlo). È stato tanto tempo fa e non posso dire con certezza quale parametter abbia migliorato la situazione. – chub

risposta

0

provare a creare due tracce video, e poi si alternano tra i due quando si aggiungono i clip.

19

Sono riuscito a risolvere questo problema dopo molte ore di test. Ci sono due cose che dovevo cambiare. 1) aggiungere l'opzione 'preciso' durante la creazione della risorsa.

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

2) non utilizzare

CMTime duration3 = [videoAsset3 duration]; 

uso invece

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

Ho trovato questo dopo ho impostato il colore di sfondo AVPlayer Blue, poi ho notato telai blu che appaiono, quindi il problema riguardava i tempi. Una volta che ho cambiato le impostazioni sopra, i diversi video allineati bene quando si utilizza:

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

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

Grazie a @elprl .. funziona perfettamente – MAMN84

Problemi correlati