2012-09-13 40 views
8

que estoy tratando de hacer girar un vídeo a su orientación correcta usando una AVAssetExportSession y siempre me sale el siguiente error:girar una AVAsset con AVAssetExportSession

Error Domain=AVFoundationErrorDomain Code=-11841 "The operation couldn’t be completed. (AVFoundationErrorDomain error -11841.)" 

Eso se traduce en AVErrorInvalidVideoComposition pero no puedo ver nada malo con mi composición de video. Aquí está el código:

AVAssetTrack *sourceVideo = [[avAsset tracksWithMediaType:AVMediaTypeVideo] lastObject]; 
AVAssetTrack *sourceAudio = [[avAsset tracksWithMediaType:AVMediaTypeAudio] lastObject]; 
CGAffineTransform preferredTransform = [sourceVideo preferredTransform]; 

AVMutableComposition *composition = [[AVMutableComposition alloc] init]; 

AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo 
                      preferredTrackID:kCMPersistentTrackID_Invalid]; 

AVAssetExportSession *exporter = [[[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality] autorelease]; 

[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) 
           ofTrack:sourceVideo 
           atTime:kCMTimeZero 
           error:nil]; 

if(!CGAffineTransformIsIdentity(preferredTransform)) { 

    AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 
    videoComposition.renderSize = CGSizeMake([avAsset naturalSize].height, [avAsset naturalSize].width); 
    videoComposition.frameDuration = CMTimeMake(1, compositionVideoTrack.naturalTimeScale); 

    AVMutableVideoCompositionLayerInstruction *instruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:sourceVideo]; 
    [instruction setTransform:preferredTransform atTime:kCMTimeZero]; 

    AVMutableVideoCompositionInstruction *videoTrackInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
    videoTrackInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, avAsset.duration); 
    videoTrackInstruction.layerInstructions = [NSArray arrayWithObject:instruction]; 

    [videoComposition setInstructions:[NSArray arrayWithObject:videoTrackInstruction]]; 

    exporter.videoComposition = videoComposition; 
} 

AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio 
                      preferredTrackID:kCMPersistentTrackID_Invalid]; 

[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) 
           ofTrack:sourceAudio 
           atTime:kCMTimeZero 
           error:nil]; 

exporter.outputURL = tempPathUrl; 
exporter.outputFileType = AVFileTypeQuickTimeMovie; 
[exporter exportAsynchronouslyWithCompletionHandler:^{ }]; 

¿Qué podría estar mal con la composición? He revisado la documentación y no puedo ver nada malo hasta el momento.

+1

¿Alguna vez descubrió por qué estaba recibiendo ese error? – shabbirv

+0

bien, entonces parece que la mitad de la recompensa va para GingerBreadMane, para una respuesta que no funciona. Parece que no hay realmente una comunidad de desarrolladores de iOS en StackOverflow. Es una pena. –

+0

Sufriendo de un problema similar en iOS 7.0.3 ... mi código que es similar funciona cuando uso un video recién grabado, pero falla cuando elijo un video de la biblioteca. Tiene muy poco sentido para mí. Te avisaré cuando encuentre una solución. Puede tener que no usar AVExportSession. – DogpatchTech

Respuesta

0

Podría tener que ver con la duración de su cuadro. Está usando CMTimeMake(1, naturalTimeScale)
Debe verificar el naturalTimeScale ya que no siempre es igual a los fps. Consulte AVFoundation Programming Guide 'Representaciones del tiempo' para obtener más información.

+0

¿sabes cómo obtener el FPS para un activo de video? – Crashalot

0

Creo que es porque el orden de los argumentos de ancho y alto es incorrecto. Usted tiene:

videoComposition.renderSize = CGSizeMake([avAsset naturalSize].height, [avAsset naturalSize].width); 

¿No debería ser

videoComposition.renderSize = CGSizeMake([avAsset naturalSize].width, [avAsset naturalSize].height); 

en su lugar?

0

El error es de cómo configuró instruction.

... videoCompositionLayerInstructionWithAssetTrack:sourceVideo] 

sourceVideo no es un miembro de la composición. En su caso, esto debería ser compositionVideoTrack.