2012-02-19 16 views
6

मैं अपने आवेदन में डिवाइस और सेटिंग्स के आधार पर, एक वीडियो को एक विशिष्ट वीडियो प्रारूप में ट्रांसकोड करना चाहता हूं। उदाहरण के लिए, यदि उपयोगकर्ता के पास आईफोन 4 एस है और मेरे एप्लिकेशन में मध्यम सेटिंग्स चुनता है तो मैं प्रसंस्करण शुरू करने से पहले वीडियो को 540p में बदलना चाहता हूं। अगर वह उच्च चुनता है तो मैं 720p पर ट्रांसकोड करना चाहता हूं।उद्देश्य-सी (आईओएस) में एक वीडियो ट्रांसकोड करने का सबसे अच्छा तरीका क्या है?

मैं फ्रेम, आकार बदलने और डिस्क पर सहेजकर वीडियो फ्रेम पढ़ सकता हूं लेकिन यह बहुत प्रभावी प्रतीत नहीं होता है। एक वीडियो ट्रांसकोड करने का सबसे आसान और तेज़ तरीका क्या होगा जिसे मैं अपने वीडियो प्रोसेसिंग लाइब्रेरीज़ में खिला सकता हूं?

मैं अपने UIImagePickerController पर videoQuality सेटिंग्स का उपयोग कर की कोशिश की लेकिन जैसे कि यह काम नहीं कर रहा है के रूप में भी जब मैं इसे सेट UIImagePickerControllerQualityTypeIFrame960x540 करने के लिए अपने वीडियो 720p के रूप में बाहर आता है (640x480 काम कर रहा है, लेकिन मैं भी अधिक विस्तृत होने की जरूरत है) लगता है।

+0

मुझे यकीन है कि आप इसे जानते हैं लेकिन हार्डवेयर समर्थन के बिना ट्रांसकोडिंग सबसे अच्छा विचार नहीं हो सकता है, बैटरी के अनुसार। –

+0

हाँ, मुझे पता है। सामने वाले कैमरे के साथ एक वीडियो रिकॉर्ड करते समय आपके पास UIImagePickerController ट्रांसकोडिंग 560p हो सकता है, जो वास्तव में तेज़ी से करता है। लाइब्रेरी से चुने गए वीडियो के लिए काम नहीं करता है। कुछ इसी तरह की तलाश में है (यानी आपकी लाइब्रेरी में किसी भी वीडियो के लिए ऐसा करने के लिए एक सीधी एपीआई कॉल)। – Michel

उत्तर

3

आप AVAssetExportSession को देखना चाहते हैं, जो इसे वीडियो को फिर से एन्कोड करने के लिए उचित रूप से सरल बनाता है। मुझे लगता है कि यह भी हार्डवेयर-समर्थित जब संभव AVFoundation के बाकी की तरह है:

https://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/AVFoundationPG/Articles/01_UsingAssets.html

ध्यान दें कि यह, वीडियो बड़ा यह पहले से ही है की तुलना में कर कभी नहीं होगा तो आप उत्पादन आकार आप की गारंटी नहीं कर रहे हैं निवेदन। निम्नलिखित कोड आप क्या चाहते हैं के लिए एक शुरुआत हो सकता है, यह सोचते हैं आप ALAsset का एक उदाहरण है:

- (void)transcodeLibraryVideo:(ALAsset *)libraryAsset 
     toURL:(NSURL *)fileURL 
     withQuality:(NSString *quality) { 
    // get a video asset for the original video file 
    AVAsset *asset = [AVAsset assetWithURL: 
    [NSURL URLWithString: 
     [NSString stringWithFormat:@"%@", 
     [[libraryAsset defaultRepresentation] url]]]]; 
    // see if it's possible to export at the requested quality 
    NSArray *compatiblePresets = [AVAssetExportSession 
    exportPresetsCompatibleWithAsset:asset]; 
    if ([compatiblePresets containsObject:quality]) { 
    // set up the export 
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] 
     initWithAsset:asset presetName:quality]; 
    exportSession.outputURL = fileURL; 
    exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
    // run the export 
    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     switch ([exportSession status]) { 
     case AVAssetExportSessionStatusFailed: 
      //TODO: warn of failure 
      break; 
     case AVAssetExportSessionStatusCancelled: 
      //TODO: warn of cancellation 
      break; 
     default: 
      //TODO: do whatever is next 
      break; 
     } 
     [exportSession release]; 
    }]; 
    } 
    else { 
    //TODO: warn that the requested quality is not available 
    } 
} 

आप उदाहरण के लिए, 720p के लिए 540p और AVAssetExportPreset1280x720 के लिए AVAssetExportPreset960x540 की गुणवत्ता पारित करने के लिए चाहते हैं।

+0

AVAssetExportSession पर फ़्रेमेट सेट करने का कोई तरीका है। ऐसा लगता है कि मैं किस फ्रेम को चुनता हूं उसके आधार पर मुझे अलग-अलग फ्रेम दर मिलती हैं। यदि मैं कम चुनता हूं तो मुझे 15fps मिलते हैं और 720p के लिए मुझे 30p मिलता है। मैं अपने 60 पी फुटेज को बनाए रखना चाहता हूं लेकिन ऐसा लगता है कि कोई प्रीसेट नहीं है जो 60 एफपीएस करता है। – Michel

+0

@ user1219167: मैं सोच रहा था कि आप AVAssetExportSession की वीडियो कॉम्पोजिशन प्रॉपर्टी के साथ ऐसा करने में सक्षम हो सकते हैं, लेकिन फिर मैं इस पर दौड़ गया: http://stackoverflow.com/questions/9725193/setting-avmutablecompositions-frameduration –

+0

हाय, क्या हम मेमोरी स्पेस को कम करें कि वीडियो गुणवत्ता UIImagePickerControllerQualityTypeIFrame960x540 वाला वीडियो (16: 9 पहलू अनुपात के साथ) लेता है? –

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