2012-09-13 11 views
8

मैं एक AVAssetExportSession का उपयोग कर अपने सही ओरिएंटेशन के लिए एक वीडियो को घुमाने के लिए कोशिश कर रहा हूँ और मैं हमेशा निम्न त्रुटि प्राप्त के साथ एक AVAsset रोटेट करें:AVAssetExportSession

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

कि AVErrorInvalidVideoComposition करने के लिए अनुवाद, लेकिन मैं के साथ कुछ भी गलत नहीं देख सकते हैं मेरी वीडियो संरचना। यहां कोड है:

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

संरचना के साथ क्या गलत हो सकता है? मैं प्रलेखन के माध्यम से किया गया है और अब तक इसके साथ कुछ भी गलत नहीं देख सकता।

+1

क्या आपको कभी पता चला कि आपको यह त्रुटि क्यों मिल रही है? – shabbirv

+0

ठीक है, तो ऐसा लगता है कि आधा हिस्सा गिंजरब्रेडमेन में जाता है, जो उत्तर नहीं देता है। ऐसा लगता है कि वास्तव में StackOverflow पर आईओएस डेवलपर्स का एक समुदाय नहीं है। यह शर्मनाक है। –

+0

आईओएस 7.0.3 पर इसी तरह की समस्या से पीड़ित ... मेरा कोड जो समान काम करता है जब मैं सिर्फ रिकॉर्ड किए गए वीडियो का उपयोग करता हूं, लेकिन जब मैं लाइब्रेरी से वीडियो चुनता हूं तो विफल रहता है। यह मेरे लिए बहुत कम समझ में आता है। जब मुझे समाधान मिल जाए तो आपको बताएगा। AVExportSession का उपयोग नहीं करना पड़ सकता है। – DogpatchTech

उत्तर

0

इसे आपकी फ्रेम अवधि के साथ करना पड़ सकता है। आप CMTimeMake(1, naturalTimeScale)
का उपयोग कर रहे हैं, आपको प्राकृतिक टाइम्सस्केल की जांच करनी चाहिए क्योंकि यह हमेशा एफपीएस के बराबर नहीं होती है। अधिक जानकारी के लिए AVFoundation Programming Guide 'समय का प्रतिनिधित्व' देखें।

+0

क्या आप जानते हैं कि वीडियो संपत्ति के लिए एफपीएस कैसे प्राप्त करें? – Crashalot

0

मुझे लगता है कि ऐसा इसलिए है क्योंकि चौड़ाई और ऊंचाई तर्कों का क्रम गलत है। आपके पास:

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

यह

videoComposition.renderSize = CGSizeMake([avAsset naturalSize].width, [avAsset naturalSize].height); 
बजाय

हो नहीं करना चाहिए?

0

त्रुटि यह है कि आप instruction कैसे सेट करते हैं।

... videoCompositionLayerInstructionWithAssetTrack:sourceVideo] 

sourceVideo संरचना का सदस्य नहीं है। आपके मामले में यह compositionVideoTrack होना चाहिए।