2012-11-15 37 views
8

के लिए MediaCodec का उपयोग करें मैं वर्तमान में एंड्रॉइड को स्काइप एंडपॉइंट के रूप में उपयोग करने का प्रयास कर रहा हूं। इस स्तर पर, मुझे वीडियो को H.264 में एन्कोड करने की आवश्यकता है (क्योंकि यह स्काइप द्वारा समर्थित एकमात्र प्रारूप है) और स्ट्रीमिंग कार्य करने के लिए इसे आरटीपी के साथ encapsulate।H264 स्ट्रीमिंग

जाहिर है MediaRecorder विभिन्न कारणों से इसके लिए बहुत उपयुक्त नहीं है। एक ऐसा इसलिए है क्योंकि यह समाप्त होने के बाद एमपी 4 या 3 जीपी हेडर जोड़ता है। दूसरा यह है कि विलंबता को कम से कम करने के लिए, हार्डवेयर त्वरण आसान हो सकता है। यही कारण है कि मैं ढांचे में हाल के निम्न-स्तर के जोड़ों का उपयोग करना चाहता हूं, MediaCodec, MediaExtractor, आदि

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

अब मैं पहले से ही चरण एक के साथ अटक गया हूं। चूंकि कैमरे का उपयोग करने के बारे में इंटरनेट पर सभी दस्तावेज MediaRecorder का उपयोग करते हैं, इसलिए मुझे एन्कोडिंग से पहले अपने कच्चे डेटा को बफर में स्टोर करने का कोई तरीका नहीं मिल रहा है। addCallbackBuffer इस के लिए उपयुक्त है? किसी के पास एक उदाहरण के साथ एक लिंक है?

अगला, मुझे मीडियाकोडेक के बारे में बहुत से दस्तावेज नहीं मिल रहे हैं (क्योंकि यह काफी नया है)। कोई भी जिसके पास ठोस ट्यूटोरियल है?

अंत में: आरटीपी पुस्तकालयों पर कोई सिफारिशें?

बहुत पहले से धन्यवाद!

उत्तर

5

मुझे अभी तक मीडियाकोडेक या मीडिया एक्स्ट्रेक्टर के बारे में कुछ भी पता नहीं है, लेकिन मैं MediaRecorder से काफी परिचित हूं और SpyDroid के आधार पर एक आरटीएसपी सर्वर सफलतापूर्वक कार्यान्वित किया है, जो MediaRecorder से H264/AMRNB आउटपुट को कैप्चर करता है। मूल विचार यह है कि कोड स्थानीय सॉकेट जोड़ी बनाता है और जोड़ी में सॉकेट में से किसी एक को आउटपुट लिखने के लिए MediaRecorder के setOutputFile का उपयोग करता है। फिर, कार्यक्रम अन्य सॉकेट से वीडियो या ऑडियो स्ट्रीम पढ़ता है, इसे पैकेट में पार्स करता है, और उसके बाद प्रत्येक पैकेट को एक या अधिक आरटीपी पैकेट में लपेटता है जो यूडीपी पर भेजे जाते हैं।

यह सच है कि MediaRecorder एमओवीवी हेडर को समाप्त होने के बाद जोड़ता है, लेकिन यदि आप आरटीपी प्रारूप में H264 वीडियो की सेवा कर रहे हैं तो यह कोई समस्या नहीं है। असल में, वीडियो स्ट्रीम की शुरुआत में एक "mdat" शीर्षलेख है। इसमें हेडर की लंबाई के लिए 4 बाइट्स हैं, इसके बाद 4 बाइट्स "एमडीएटी" है। यह जानने के लिए लंबाई पढ़ें कि हेडर कितना समय है, सत्यापित करें कि यह mdat हेडर है, और उसके बाद शेष शीर्षलेख डेटा छोड़ दें। वहां से, आपको एनएएल इकाइयों की एक धारा मिलती है, जो यूनिट की लंबाई के लिए 4 बाइट से शुरू होती है। छोटे एनएएल इकाइयों को एक आरटीपी पैकेट में भेजा जा सकता है, और बड़ी इकाइयां एफयू पैकेट में टूट जाती हैं। आरटीएसपी के लिए, आपको स्ट्रीम का वर्णन करने वाले एसडीपी हेडर की भी आवश्यकता है। SpyDroid फ़ाइल के लिए एक बहुत ही छोटी फिल्म लिखकर एसडीपी शीर्षलेख में जानकारी की गणना करता है, और फिर अंत में MOOV शीर्षलेख निकालने के लिए इस फ़ाइल को पढ़ता है। मेरे ऐप्स को हमेशा एक ही आकार, स्वरूप, और बिट दर का उपयोग करता है, तो मैं बस एक स्थिर स्ट्रिंग की सेवा:

public static final String SDP_STRING = 
     "m=video 5006 RTP/AVP 96\n" 
       + "b=RR:0\n" 
       + "a=rtpmap:96 H264/90000\n" 
       + "a=fmtp:96 packetization-mode=1;profile-level-id=428028;sprop-parameter-sets=Z0KAKJWgKA9E,aM48gA==;\n" 
       + "a=control:trackID=0\n" 
       + "m=audio 5004 RTP/AVP 96\n" 
       + "b=AS:128\n" 
       + "b=RR:0\n" 
       + "a=rtpmap:96 AMR/8000\n" 
       + "a=fmtp:96 octet-align=1;\n" 
       + "a=control:trackID=1\n"; 

640x480x10fps के लिए मेरे शीर्ष लेख, H264 वीडियो है यही कारण है, 8000/16/1 AMRNB ऑडियो के साथ।

एक बात जो मैं आपको चेतावनी दे सकता हूं: यदि आप MediaRecorder का उपयोग कर रहे हैं, तो आपका पूर्वावलोकन कॉलबैक कभी नहीं बुलाया जाएगा। यह केवल कैमरा मोड में काम करता है, न कि जब आप वीडियो रिकॉर्ड कर रहे हों। वीडियो रिकॉर्डिंग करते समय मैं असम्पीडित प्रारूप में पूर्वावलोकन छवि तक पहुंच प्राप्त करने का कोई तरीका नहीं ढूंढ पा रहा हूं।

मैं अत्यधिक SpyDroid के लिए कोड को देखने की सलाह देते हैं। यह कुछ खुदाई करता है, लेकिन मैं शर्त लगाता हूं कि आप पहले से ही क्या चाहते हैं।

+0

मुझे पता है कि यह टिप्पणी बहुत देर हो चुकी है (सुनिश्चित नहीं है कि यह अनुमति है या नहीं), लेकिन अब यह 3 साल बीत चुका है, क्या यह अभी भी प्रासंगिक है या अब ऐसा करने के बेहतर तरीके हैं? –

0

जो आप योजना बनाते हैं वह निश्चित रूप से व्यवहार्य है। आप एक कैमरा पंजीकृत कर सकते हैं। पूर्वावलोकनवॉलबैक जो तस्वीर डेटा लेता है और इसे मीडियाकोडेक में रखता है। आप आउटपुट पढ़ते हैं और इसे आरटीपी के रूप में भेजते हैं। आम तौर पर यह आसान है, लेकिन विभिन्न उपकरणों पर अनियंत्रित रंग रिक्त स्थान और विभिन्न मीडियाकोडिक व्यवहार के रूप में विभिन्न नुकसान हैं, लेकिन यह निश्चित रूप से संभव है।

8

अद्यतन
मैं अंत में h264 फ्रेम से उचित आरटीपी संकुल बनाने के लिए कर रहा था। आपको यह ध्यान में रखना है कि यह ध्यान में रखना है (यह वास्तव में काफी सरल है):

एन्कोडर प्रत्येक फ्रेम के लिए एनएएल शीर्षलेख बनाता है। लेकिन यह प्रत्येक फ्रेम को H264 bytestream के रूप में देता है। इसका मतलब है कि प्रत्येक फ्रेम तीन 0-बाइट्स और 1-बाइट से शुरू होता है। आपको बस इतना करना है कि उन प्रारंभिक उपसर्गों को हटा दें, और फ्रेम को आरटीपी पैकेट में रखें (या उन्हें एफयू-एएस का उपयोग करके विभाजित करें)।

अब

अपने प्रश्नों के:

मैं एन्कोडिंग से पहले एक बफर में अपने कच्चे डेटा स्टोर करने के लिए एक तरह से नहीं मिल रहा। क्या AddCallbackBuffer इसके लिए उपयुक्त है?

आपको कैमरा.सेटप्रवेव कॉलबैक (...) का उपयोग करना चाहिए, और प्रत्येक फ्रेम को एन्कोडर में जोड़ना चाहिए।

मुझे मीडियाकोडेक के बारे में बहुत से दस्तावेज नहीं मिल रहे हैं (क्योंकि यह काफी नया है)। कोई भी जिसके पास ठोस ट्यूटोरियल है?

मीडियाकोडेक कैसे काम करता है यह एक अच्छा परिचय होना चाहिए। http://dpsm.wordpress.com/2012/07/28/android-mediacodec-decoded/

अंत में: आरटीपी पुस्तकालयों पर कोई सिफारिशें?

मैं jlibrtp का उपयोग कर रहा हूं जो काम पूरा हो जाता है।

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

  • कोई संबंधित समस्या नहीं^_^