2012-05-23 11 views
16

को प्रगति करना बंद कर देता है मुझे AVAssetExportSession के साथ समस्या हो रही है जहां प्रगति बढ़ती रहती है लेकिन स्थिति अभी भी कहती है कि यह निर्यात कर रहा है। यह वास्तव में एक बहुत ही दुर्लभ घटना है, यह लगभग 99.99% समय के बिना काम करता है, लेकिन मैं वैसे भी समस्या को ठीक करना चाहता हूं।AVAssetExportSession

exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality]; 
    exportSession.videoComposition = videoComposition; 
    exportSession.outputFileType = @"com.apple.quicktime-movie"; 
    exportSession.outputURL = outputURL; 
    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     ... 
    }]; 

तब प्रगति की जाँच एक टाइमर है:

तो मैं निर्यात शुरू

AVAssetExportSessionStatus status = [exportSession status]; 
    float progress = 0; 
    if (status == AVAssetExportSessionStatusExporting) { 
     progress = [exportSession progress]; 
    } else if (status == AVAssetExportSessionStatusCompleted) { 
     progress = 1; 
    } 
    NSLog(@"%d %f", status, progress); 
    [delegate processor:self didProgress:progress]; 

और उत्पादन की तरह लग रही समाप्त होता है:

2012-05-23 14:28:59.494 **********[1899:707] 2 0.125991 
2012-05-23 14:28:59.994 **********[1899:707] 2 0.185280 
2012-05-23 14:29:00.494 **********[1899:707] 2 0.259393 
2012-05-23 14:29:00.994 **********[1899:707] 2 0.326093 
2012-05-23 14:29:01.494 **********[1899:707] 2 0.400206 
2012-05-23 14:29:01.995 **********[1899:707] 2 0.481729 
2012-05-23 14:29:02.495 **********[1899:707] 2 0.541019 
2012-05-23 14:29:02.997 **********[1899:707] 2 0.622542 
2012-05-23 14:29:03.493 **********[1899:707] 2 0.681832 
2012-05-23 14:29:03.995 **********[1899:707] 2 0.763355 
2012-05-23 14:29:04.494 **********[1899:707] 2 0.822645 
2012-05-23 14:29:04.994 **********[1899:707] 2 0.880082 
2012-05-23 14:29:05.493 **********[1899:707] 2 0.880082 
2012-05-23 14:29:05.994 **********[1899:707] 2 0.880082 
... 
2012-05-23 14:43:22.994 **********[1899:707] 2 0.880082 
2012-05-23 14:43:23.493 **********[1899:707] 2 0.880082 
2012-05-23 14:43:23.994 **********[1899:707] 2 0.880082 
2012-05-23 14:43:24.494 **********[1899:707] 2 0.880082 

(नोट: यह हर बार एक ही प्रतिशत पर नहीं रुकता है, इसकी पूरी तरह से यादृच्छिक)

जैसा कि आप टाइमस्टैम्प से देख सकते हैं, पहले 88% करने में 5 सेकंड लग गए, और फिर मैंने इसे 13 मिनट तक चलाया (पूर्ण वीडियो प्रसंस्करण में आमतौर पर 10 सेकंड नहीं लगते) बिना किसी बदलाव के प्रगति।

वर्तमान में मेरा एकमात्र विकल्प यह जांचना है कि पिछले एक्स सेकंड में प्रगति नहीं बदली है और बस उपयोगकर्ता को यह असफल होने और फिर से प्रयास करने के लिए कहें।

किसी के पास कोई विचार है?

+0

निर्यात सत्र पर आप किस प्रकार का डेटा लिखने की कोशिश कर रहे हैं, यह –

+0

जानने के लिए उपयोगी हो सकता है, एक वीडियो को दूसरे के अंत में जोड़ना और ऑडियो फ़ाइल के दूसरे भाग के साथ ऑडियो का हिस्सा बदलना उपयोगी हो सकता है। अपने प्रारंभिक समय में वीडियो के पसंदीदा परिवर्तनों को सेट करने के लिए वीडियो कॉम्पोजिशन का उपयोग करना। –

+0

एक ही समस्या होने के साथ भी। इस पर कोई प्रगति? –

उत्तर

3

मुझे वह मिला है!

आप सही layerInstructions निर्धारित करने की आवश्यकता:

AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 


AVMutableVideoCompositionLayerInstruction * layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:track]; 


AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, allTime); 
MainInstruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 

अन्यथा यह सिर्फ अटक।

+0

यह वही है जो मेरे लिए था। मेरा निर्यात 0.005 (मूल रूप से कुछ भी नहीं) पर अटक गया था और कॉलबैक कभी गोलीबारी नहीं कर रहा था। धन्यवाद! –

2

मुझे आश्चर्य है कि यह थ्रेडिंग के साथ कोई समस्या है - यदि टाइमर और निर्यातक विभिन्न धागे में समाप्त होता है। (एवीफाउंडेशन गाइड का कहना है कि निर्यातक को किसी विशेष थ्रेड पर चलाने की गारंटी नहीं है।)

क्या आपने टाइमर के बजाए महत्वपूर्ण मूल्य का उपयोग करने का प्रयास किया है?

Barebones उदाहरण:

// register for the notification 
[exportSession addObserver:someProcessor forKeyPath:@"progress" options:NSKeyValueObservingOptionNew context:NULL]; 

फिर अपने प्रोसेसर में:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    // add some checks here 
    NSNumber *processNumber = [change objectForKey:NSKeyValueChangeNewKey]; 
    float process = [processNumber floatValue]; 
    [delegate processor:self didProgress:progress]; 
} 
+2

इस दृष्टिकोण का उपयोग नहीं किया जाना चाहिए, क्योंकि यह दस्तावेज में कहा गया है कि "प्रगति" संपत्ति कुंजी-मूल्य देखने योग्य नहीं है। – aumanets

+0

@umumets आप अन्य तरीके से मिला है? –

+0

@PayalManiyar, खेद है कि यह बहुत समय पहले था और मुझे वास्तव में याद नहीं है कि मैंने इस समस्या को कैसे बेचा है। – aumanets

4

मेरे मामले में इस समस्या mp4s कि असामान्य विन्यास के साथ इनकोडिंग गया से उपजी। लेकिन आखिरकार ऐप्पल के कोड में एक बग मुद्दे का कारण बनता है।

विशेष रूप से मैं फेसबुक पर एमपी 4 के साथ काम कर रहा था। ऐसा लगता है कि जब फेसबुक वीडियो एन्कोड करता है तो यह वीडियो ट्रैक के पहले फ्रेम को छोड़ देता है या बदल देता है। ffprobe के साथ वीडियो की जांच से पता चला है:

 "r_frame_rate": "722/25", 
     "avg_frame_rate": "722/25", 
     "time_base": "1/28880", 
     "start_pts": 1000, 
     "start_time": "0.034626", 

0,034626 बिल्कुल फ्रेम 2. ऑडियो ट्रैक के लिए समय है, तथापि, 0. पर शुरू कर दिया

दुर्भाग्य से एप्पल के API सही ढंग से करने के लिए इस शुरू करने का समय रिपोर्ट नहीं करते धावन पथ। AVAsset से AVAssetTrack प्राप्त करने और उसके समय की जांच करने के बाद रेंज ने शुरुआती समय को 0 के रूप में रिपोर्ट किया। यह संभव है कि मैं ट्रैक और संपत्ति समय की प्रकृति को गलत समझ रहा हूं, लेकिन यह एक बग की तरह लगता है।

बेशक

, जब निर्यात सत्र के लिए वीडियो रचना का निर्माण मैं ट्रैक समय सीमा जो गलत था इस्तेमाल किया। मुझे संदेह है कि जब निर्यात सत्र समय 0 पर ट्रैक में डेटा की तलाश करता है और कुछ भी नहीं मिलता है तो यह भ्रमित हो जाता है, और फिर जैसा हमने देखा है, बस लटकता है और एक त्रुटि की रिपोर्ट भी नहीं करता - एक और बग। यहां तक ​​कि VideoCompositionWithPropertiesOfAsset के साथ संयोजन भी बना रहा है: मदद नहीं करता है।

मैं अभी तक AVAssetReader और AVAssetWriter उपयोग करने के लिए AVAssetExportSession के बजाय तो मैं अगर तुम एक ही स्थिति वहाँ मुठभेड़ होगा पता नहीं है प्रयास नहीं किया है।

ट्रैक प्रविष्टि और वीडियो निर्देश के लिए इस्तेमाल किया समय सीमा रीसेट में 1 या 2 तख्ते पर शुरू करने के लिए:

CMTimeRange videoTimeRange = videoTrack.timeRange; 
videoTimeRange.start = CMTimeMake(1, ceil(videoTrack.nominalFrameRate)); 
जब तक मैं पता लगाने के लिए और अधिक समय है कि मैं एक समाधान के रूप में इस हैक कर आए हैं है

स्पष्ट रूप से यह हैक केवल उस विशेष स्थिति पर लागू होता है जहां वीडियो ट्रैक प्रारंभ समय 0 नहीं है। मुझे लगता है कि सामान्य रूप से यह बग असामान्य मीडिया एन्कोडिंग से उत्पन्न होता है जो AVAssetExportSession और इसके संबंधित वर्ग अपेक्षा नहीं कर रहे हैं।

+0

क्या आपको कभी इसके लिए बेहतर समाधान मिला है? मैंने ऐसा करने की कोशिश की, लेकिन मुझे यकीन नहीं है कि आप कहां से शुरुआती स्थिति को बदलना चाहते थे। ट्रैक में अपनी संपत्ति जोड़ते समय, मैं '[ट्रैक डालने का समय सीमा का उपयोग कर रहा हूं: सीएमटीम रेंजमेक (केसीएमटाइमेज़रो, परिसंपत्ति। अवधि) ... संपत्ति ..] 'अपने CMTimeRange-method का उपयोग करने का प्रयास करते समय, यह काम नहीं कर रहा है। असल में, यह बदतर हो जाता है, क्योंकि बाद में मैं किसी कारण से ट्रैक के प्राकृतिक आकार को पुनः प्राप्त नहीं कर सकता। लेकिन मैं फ्रेम को गलत जगह पर डाल सकता हूं? वैसे भी, इस त्रुटि का एक उचित समाधान बहुत बेहतर होगा। – Sti

+0

इससे बेहतर काम मिलने से पहले इस पर मेरा काम बंद हो गया। इस बात की कोई गारंटी नहीं है कि यह आपके मामले में काम करेगा, और आम तौर पर AVFoundation के साथ काम करते समय कई नुकसान होते हैं। लेकिन आप ट्रैक प्रविष्टि के लिए उपयोग करने के लिए समायोजित श्रेणी बनाने के लिए उपरोक्त पंक्तियों का उपयोग करेंगे। उदाहरण के लिए: '[ट्रैक डालेंटाइमेंज: समायोजित वीडियोटाइम रेंज ऑफ़ट्रैक: वीडियोट्रैक एटटाइम: केसीएमटाइम ज़ीरो त्रुटि: और त्रुटि] ' – kball

+0

जैसा कि मैंने लिखा था, मैंने कोशिश की कि बिना किसी किस्मत के। यह अभी भी हो रहा है। अजीब चीज यह है कि AVAssetWriter का उपयोग करके, मैं जिस वीडियो-फाइल का उपयोग कर रहा हूं वह ऐप में ही बनाई गई है। मुझे यकीन नहीं है कि मुझे एक ही समस्या का सामना करना पड़ रहा है। अब मैं असफल फाइलों में से किसी एक पर ffprobe का उपयोग/चलाने का प्रयास कर रहा हूं, लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाए। चलते समय (ओएसएक्स/टर्मिनल पर) './ffprobe test.mp4' मैं केवल फ़ाइल के बारे में कुछ मेटाडेटा देखता हूं। प्रलेखन अजीब अजीब है, क्या कोई परिणाम है जिसका उपयोग मुझे अपना परिणाम प्राप्त करने के लिए करना चाहिए? – Sti

संबंधित मुद्दे