2012-09-13 16 views
8

sto cercando di ruotare un video per il corretto orientamento utilizzando un AVAssetExportSession e ho sempre ottenere il seguente errore:Ruotare un AVAsset con AVAssetExportSession

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

Questo si traduce in AVErrorInvalidVideoComposition ma non riesco a vedere nulla di sbagliato con la mia composizione video. Ecco il codice:

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:^{ }]; 

Cosa potrebbe esserci di sbagliato nella composizione? Ho letto la documentazione e non riesco a vedere nulla di sbagliato finora.

+1

Hai mai scoperto perché stavi ottenendo quell'errore? – shabbirv

+0

ok, quindi sembra che metà della taglia vada a GingerBreadMane, per una risposta che non funziona. Sembra che non ci sia davvero una comunità di sviluppatori iOS su StackOverflow. È un peccato. –

+0

Soffrendo di un problema simile su iOS 7.0.3 ... il mio codice che è simile funziona quando uso un video appena registrato, ma fallisce quando scelgo un video dalla libreria. Ha molto poco senso per me. Ti farò sapere quando trovo una soluzione. Potrebbe non dover utilizzare AVExportSession. – DogpatchTech

risposta

0

Potrebbe avere a che fare con la durata del frame. Si sta utilizzando CMTimeMake(1, naturalTimeScale)
Si dovrebbe verificare il naturalTimeScale in quanto non sempre equivale ai fps. Vedi il AVFoundation Programming Guide "Rappresentazioni di tempo" per maggiori informazioni.

+0

sai come ottenere l'FPS per un asset video? – Crashalot

0

Penso che sia perché l'ordine degli argomenti di larghezza e altezza non è corretto. Hai:

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

non dovrebbe essere

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

invece?

0

L'errore deriva da come è stato impostato instruction.

... videoCompositionLayerInstructionWithAssetTrack:sourceVideo] 

sourceVideo non è un membro della composizione. Nel tuo caso questo dovrebbe essere compositionVideoTrack.

Problemi correlati