2012-04-25 9 views
14

मैं कैमरे से आरजीबीए फ्रेम डेटा प्राप्त करने में सक्षम हूं, और मैं इसे H.264 प्रारूप में एन्कोड करना चाहता हूं। मैंने H.264 वीडियो को एन्कोड और डीकोड करने के लिए FFmpeg का उपयोग किया है, लेकिन 640x480 के फ्रेम आकार पर यह मेरी आवश्यकताओं के लिए बहुत धीमा है।स्ट्रीमिंग के लिए मैं हार्डवेयर-त्वरित एच.264 एन्कोडिंग और डिकोडिंग कैसे कर सकता हूं?

मैं एन्कोडिंग और डिकोडिंग तेजी लाने के लिए हार्डवेयर त्वरण का उपयोग करना चाहते हैं, तो मुझे लगता है कि कैसे करना होगा?

इसके अलावा, मुझे नेटवर्क में एन्कोडेड वीडियो स्ट्रीम करने और इसे दूसरे छोर पर डीकोड करने में सक्षम होना चाहिए। यह कैसे किया जा सकता है?

+0

प्रश्न का शीर्षक "..विडियो डिकोडिंग" है, लेकिन वास्तविक प्रश्न एन्कोडिंग के बारे में है, है ना? शायद, आपको शीर्षक संपादित करना चाहिए? – Anastasia

+0

एक लाइब्रेरी है जो कच्चे फ्रेम को H.264 में एन्कोड करने की अनुमति देती है: http://www.foxitsolutions.com/iphone_h264_sdk.html। यह पुस्तकालय हार्डवेयर एन्कोडर का उपयोग करता है और अलग H.264 फ्रेम देता है। कृपया यह प्रश्न देखें और उत्तर दें: http://stackoverflow.com/questions/7979842/video-encoding- पुस्तकालय-for-ios/ – Anastasia

+0

शायद एक डुप्लिकेट: http://stackoverflow.com/questions/25197169/how-to- डीकोड-एएच -264-फ्रेम-ऑन-आईओएस-बाय-हार्डवेयर-डिकोडिंग –

उत्तर

18

आप हार्डवेयर-त्वरित वीडियो एन्कोडिंग और iOS पर H.264 वीडियो की डिकोडिंग करना चाहते हैं, जाने के लिए एक ही रास्ता AVFoundation है। एन्कोडिंग या डिकोडिंग के लिए तीसरे पक्ष के पुस्तकालयों का उपयोग न करें, क्योंकि वे वर्तमान में सीपीयू-बाध्य हैं, और AVFoundation से प्राप्त होने वाली चीज़ों की तुलना में बहुत धीमे हैं। किसी तृतीय-पक्ष एन्कोडर या डिकोडर का उपयोग करने का एक कारण यह होगा कि यदि आप डिफ़ॉल्ट रूप से आईओएस में समर्थित प्रारूप के साथ काम नहीं कर रहे हैं।

हार्डवेयर-त्वरित डिकोडिंग के लिए, आप एक AVAssetReader उदाहरण (या शुद्ध प्लेबैक के लिए खिलाड़ी वर्गों में से एक) का उपयोग करना चाहते हैं। एक AVAssetReader के साथ, मुझे H.264-एन्कोडेड वीडियो पढ़ने के लिए नियमित रूप से 2X या उच्च प्लेबैक गति मिलती है, इसलिए आईओएस डिवाइस इसके लिए कुछ अच्छे हार्डवेयर त्वरण का उपयोग करते हैं।

इसी प्रकार, त्वरित एन्कोडिंग के लिए, आप एक AVAssetWriter का उपयोग करेंगे। AVAssetWriter को सर्वश्रेष्ठ गति पर एन्कोड करने के लिए कुछ युक्तियां मिलती हैं (ओपनजीएल ईएस से पढ़ते समय आईओएस 5.0 बनावट कैश का उपयोग करके, पिक्सेल बफर पूल का उपयोग करके, बीजीआरए फ्रेम में भोजन करना), जिसे मैं this answer के भीतर विस्तार से वर्णित करता हूं।

आप कुछ कोड सबसे तेजी से पथ मैं त्वरित एन्कोडिंग और डिकोडिंग के लिए मिल गया है का उपयोग करता है देखने के लिए चाहते हैं, आप मेरी खुला स्रोत GPUImage ढांचा है, जो, अनास्तासिया से जुड़े हुए के विपरीत, वह पूरी तरह से उपयोग करने के लिए नि: शुल्क है देख सकते हैं ।

+1

आपके स्रोत कोड के लिए धन्यवाद और किसी न किसी तरह से देखा गया, लेकिन डेटा के एन्कोडिंग या डिकोडिंग तक पहुंच के फ़ंक्शन या पैरामीटर नहीं मिला, मुझे नेटवर्क पर भेजे गए डेटा का एन्कोडिंग, और फिर टर्मिनल उपकरण डिकोडिंग के दूसरे छोर पर, यदि आपके पास पहले से इंटरफ़ेस या फ़ंक्शन है, लेकिन मुझे आपकी सहायता प्राप्त करने की आशा नहीं मिली, तो आपको बहुत धन्यवाद – king

+1

आपका lib बहुत अच्छा है लेकिन यह फ़िल्टर लगाने और कच्चे वीडियो को संसाधित करने के लिए है, लेकिन यह हार्डवेयर एन्कोडिंग के वास्तविक प्रश्न के साथ कुछ भी मदद नहीं करता है। यदि उपयोगकर्ता नेटवर्क पर संपीड़ित डेटा भेजना चाहता है तो उपर्युक्त एपीआई (संपत्ति पाठक और संपत्ति लेखक) में से कोई भी मदद नहीं करेगा। –

+0

@king - यह विवरण हो सकता है कि आप प्रश्न में जोड़ना चाहते हैं, क्योंकि आपने यह निर्दिष्ट नहीं किया था कि आप नेटवर्क पर स्थानांतरण के लिए कच्चे इनपुट और आउटपुट स्ट्रीम तक पहुंच चाहते थे। मेरा जवाब फाइलों के एन्कोडिंग और डिकोडिंग पर लागू होता है, जहां AVAssetReader और AVAssetWriter स्पष्ट रूप से जाने का तरीका हैं। फिर भी, आप यहां अपने एन्कोडिंग करने के लिए AVFoundation का उपयोग करेंगे, जैसा कि मोहनसेर द्वारा वर्णित है: http://stackoverflow.com/a/3484950/19679। –

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