मैं एक ऐसा एप्लिकेशन लिख रहा हूं जो AVFoundation का उपयोग करके वीडियो के साथ काम करता है।AVAssetExportSession त्रुटि -11820
मेरे आवेदन का व्यवहार सरल है: मैं कैमरा रोल से एक वीडियो लेता हूं, फिर मैं कुछ ऑडियो ट्रैक के साथ एक AVMutableComposition बनाते हैं। मिश्रण संरचना के साथ मैं एक AVAssetExportSession शुरू करता हूं जो वीडियो ऐप को मेरे ऐप की दस्तावेज़ निर्देशिका में संग्रहीत करता है।
इस बिंदु तक यह सब कुछ ठीक है: मेरा वीडियो संग्रहीत है और मैं इसे किसी अन्य नियंत्रक में चलाने में सक्षम हूं। अगर मैं वीडियो लेता हूं जिसे मैंने अपने दस्तावेज़ फ़ोल्डर में कुछ संपादन करने के लिए अभी संग्रहीत किया है (उसी समय AVmutableComposition, AVAssetExportSession) उसी तरह ठीक है।
लेकिन तीसरी बार संपादन एक वीडियो AVAssetExportSession स्थिति बन जाता है "असफल" और इस त्रुटि के साथ करने के लिए इस प्रक्रिया को कार्य करें:
"Domain=AVFoundationErrorDomain Code=-11820 "Cannot Complete Export" UserInfo=0x1a9260 {NSLocalizedRecoverySuggestion=Try exporting again., NSLocalizedDescription=Cannot Complete Export}"
मैंने पढ़ा है कि एक सामान्य त्रुटि जहां सत्र नहीं हो सकता है निर्यात किया। इसका क्या अर्थ है? केवल तीसरी बार मैंने संपादन प्रक्रिया क्यों की? क्या यह स्मृति प्रबंधन गलती हो सकती है? एक दोष?। यह मेरा AVAssetExportSession का कोड है:
_assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
_assetExport.shouldOptimizeForNetworkUse = YES;
///data odierna
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"ddMMyyyyHHmmss"];
NSDate *now = [[NSDate alloc] init];
NSString *dateString = [format stringFromDate:now];
[now release];
[format release];
NSString* ext = @".MOV";
NSString* videoName=[NSString stringWithFormat:@"%@%@", dateString, ext];
///data odierna
NSString *exportPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:videoName];
if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath])
{
[[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}
_assetExport.outputFileType = AVFileTypeQuickTimeMovie;
[_assetExport setTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)];
NSURL *exportUrl = [NSURL fileURLWithPath:exportPath] ;
_assetExport.outputURL = exportUrl ;
[_assetExport exportAsynchronouslyWithCompletionHandler:^
{
switch (_assetExport.status)
{
case AVAssetExportSessionStatusFailed:
{
NSLog (@"FAIL %@",_assetExport.error);
if ([[NSFileManager defaultManager] fileExistsAtPath:[_assetExport.outputURL path]])
{
[[NSFileManager defaultManager] removeItemAtPath:[_assetExport.outputURL path] error:nil];
}
[self performSelectorOnMainThread:@selector (ritenta)
withObject:nil
waitUntilDone:NO];
break;
}
case AVAssetExportSessionStatusCompleted:
{
NSLog (@"SUCCESS");
[self performSelectorOnMainThread:@selector (saveVideoToAlbum:)
withObject:exportPath
waitUntilDone:NO];
break;
}
case AVAssetExportSessionStatusCancelled:
{
NSLog (@"CANCELED");
break;
}
};
}];
मैं वेब पर कई खोजों किया है, कुछ लोगों को सत्र के outputURL में एक समस्या थी, लेकिन मैं कोशिश की और मेरी कोड में सब ठीक लगता है। फ़ाइल में एक अद्वितीय नाम असाइन करने के लिए मैं एक NSDate का उपयोग करता हूं। डीबगिंग उद्देश्यों के लिए मैंने मानक स्ट्रिंग नाम को पुनर्स्थापित करने का प्रयास किया है लेकिन समस्या बनी हुई है। कोई विचार? क्या कोई मुझे दस्तावेज फ़ोल्डर में निर्यात करने का एक वैकल्पिक तरीका सुझा सकता है, एसेटवाइटर के साथ एक संपत्ति AVSSetExportSession को स्थापित करती है?
जब आप सही AVMutableComposition प्रदान नहीं करते हैं तो निर्यातक अक्सर विफल रहता है, इसलिए आप AVMutableComposition ऑब्जेक्ट को तीसरे बार डीबग करें। – BhushanVU