2012-09-13 10 views
8

próbuję obrócić film do jego prawidłowej orientacji za pomocą AVAssetExportSession i zawsze pojawia się następujący błąd:Obracanie AVAsset z AVAssetExportSession

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

To przekłada się AVErrorInvalidVideoComposition ale nie widzę niczego złego w moim skład wideo. Oto kod:

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

Co może być nie tak z kompozycją? Przeszedłem przez tę dokumentację i do tej pory nie widziałem niczego złego.

+1

Czy kiedykolwiek dowiedziałeś się, dlaczego dostałeś ten błąd? – shabbirv

+0

ok, więc wydaje się, że połowa nagrody trafia do GingerBreadMane, ponieważ odpowiedź nie działa. Wygląda na to, że nie ma społeczności programistów iOS na StackOverflow. Szkoda. –

+0

Cierpienie z podobnego problemu na iOS 7.0.3 ... mój kod, który jest podobny działa, gdy używam właśnie nagranego wideo, ale nie działa, gdy wybieram wideo z biblioteki. To ma dla mnie niewielki sens. Poinformuję Cię, kiedy znajdę rozwiązanie. Może nie korzystać z AVExportSession. – DogpatchTech

Odpowiedz

0

Może to mieć związek z czasem trwania ramki. Używasz: CMTimeMake(1, naturalTimeScale) Powinieneś sprawdzić naturalTimeScale, ponieważ nie zawsze jest to równe fps. Aby uzyskać więcej informacji, zobacz "Reprezentacje czasu" AVFoundation Programming Guide.

+0

czy wiesz, jak uzyskać FPS dla zasobu wideo? – Crashalot

0

Myślę, że to dlatego, że kolejność argumentów width i height jest niepoprawna. Masz:

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

Nie powinno to być

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

zamiast?

0

Błąd wynika z ustawienia instruction.

... videoCompositionLayerInstructionWithAssetTrack:sourceVideo] 

sourceVideo nie jest członkiem kompozycji. W twoim przypadku powinno to być compositionVideoTrack.