2012-02-01 21 views
7

Esta pregunta está bastante relacionada con AVMutableComposition - Blank/Black frame between videos assets pero como no estoy usando una sesión de AVAssetExportSession las respuestas no se ajustan a mi problema.Marcos negros en AVMutableComposition

Estoy usando una composición de video para crear una composición de video y la estoy leyendo usando un AVAssetReader (necesito tener los datos de marco, no puedo usar un AVPlayer) pero a menudo tengo marcos negros entre mi video trozos (no hay falla notable en el audio).

crear mi composición como

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

también probé para insertar manualmente cada pista en mi composición pero tengo el mismo fenómeno.

Gracias

+0

¿Alguna vez resolvió este problema? Tengo un problema similar. – elprl

+0

@elprl Eché un vistazo a mi código y se mantuvo más o menos igual. Creo que "solucionamos" el problema ajustando (intervalo de fotogramas clave, velocidad de cuadros, ...) la entrada de formato de los videos (podemos controlarlo). Eso fue hace mucho tiempo y no puedo decir con certeza qué parámetro mejoró la situación. – chub

Respuesta

0

intente crear dos pistas de vídeo, y luego se alternan entre los dos cuando la adición de los clips.

19

Pude resolver este problema después de muchas horas de prueba. Hay dos cosas que necesito cambiar. 1) agregue la opción "precisa" al crear el activo.

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

2) no utilizan

CMTime duration3 = [videoAsset3 duration]; 

uso en lugar

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

descubrí esto después de configurar el color de fondo a AVPlayer azul, entonces me di cuenta de marcos azules que aparecen, entonces el problema tenía que ver con los tiempos. Una vez que cambié a las configuraciones anteriores, los diferentes videos se alinearon bien al usar:

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

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

Gracias @elprl .. esto funciona perfecto – MAMN84