2015-03-12 6 views
9

यह वास्तव में एक प्रश्न नहीं है जितना कि यह सबसे चुनौतीपूर्ण कार्यक्षमताओं में से एक को हल करने के मेरे सभी प्रयासों की प्रस्तुति है।एंड्रॉइड: एक ही समय में रिकॉर्डिंग और स्ट्रीमिंग

मैं रीयलटाइम वीडियो को Wowza Server पर स्ट्रीम करने के लिए libstreaming लाइब्रेरी का उपयोग करता हूं और मुझे इसे एसडी कार्ड के अंदर एक ही समय में रिकॉर्ड करने की आवश्यकता है। मैं समुदाय से नए विचारधाराओं को इकट्ठा करने के लिए अपने सभी प्रयासों के नीचे प्रस्तुत कर रहा हूं। एक mp4 फ़ाइल

विकास

को धारा libstreaming से

कॉपी बाइट्स हम पुस्तकालय libstreaming एक mp4 फाइल करने के लिए सभी भेजी गई बाइट प्रतिलिपि करने के लिए में एक अवरोधन बनाया। Libstreaming बाइट्स को स्थानीय सॉकेट के माध्यम से Wowza सर्वर पर भेजता है। यह उपयोगकर्ता MediaRecorder को कैमरे और डिवाइस के माइक तक पहुंचने के लिए और आउटपुट फ़ाइल को स्थानीय सॉकेट की इनपुट स्ट्रीम के रूप में सेट करता है। हम इनपुट इनपुट से विस्तारित इस इनपुट स्ट्रीम के चारों ओर एक रैपर बनाते हैं और इसके अंदर एक फ़ाइल आउटपुट स्ट्रीम बनाते हैं। इसलिए, हर बार libstreaming LocaSocket की इनपुट स्ट्रीम पर एक पठन निष्पादित करता है, हम एक वैध एमपी 4 फ़ाइल बनाने की कोशिश कर, सभी डेटा आउटपुट स्ट्रीम में कॉपी करते हैं।

बाधा

जब हम फ़ाइल को पढ़ने की कोशिश की, यह दूषित है। हमने महसूस किया कि MP4 फ़ाइल से मेटा जानकारी गायब है। विशेष रूप से moov परमाणु। हमने इस हेडर को भेजने के लिए समय देने के लिए स्ट्रीमिंग को बंद करने में देरी करने की कोशिश की (यह अभी भी अनुमान लगा रहा था) लेकिन यह काम नहीं किया। इस डेटा के सुसंगतता का परीक्षण करने के लिए, हमने हेडर समेत वीडियो को पुनर्प्राप्त करने का प्रयास करने के लिए एक सशुल्क सॉफ्टवेयर का उपयोग किया। यह बजाने योग्य बन गया, लेकिन यह ज्यादातर हरी स्क्रीन थी। तो यह एक भरोसेमंद समाधान बन गया। हमने "untrunc" का उपयोग करने का भी प्रयास किया, एक मुक्त ओपन सोर्स कमांड लाइन प्रोग्राम और यह वसूली भी शुरू नहीं कर सका, क्योंकि वहां कोई मूव परमाणु नहीं था।

उपयोग संकलित ffmpeg कैमरा

विकास

FFMPEG एक जावा इंटरफेस के साथ एक Gradle प्लगइन एंड्रॉयड ऐप्स के भीतर इसका इस्तेमाल करने की है का उपयोग करने के लिए Android के लिए। हमने सोचा कि हम कमांड लाइन के माध्यम से कैमरे तक पहुंच सकते हैं (यह शायद "/ dev/video0" में है) और इसे मीडिया सर्वर पर भेज दिया गया है।

बाधा

हमारे पास त्रुटि "अनुमति अस्वीकृत" जब कैमरे को एक्सेस करने की कोशिश कर रहा। कामकाज डिवाइस तक पहुंचने के लिए रूट करना होगा, लेकिन यह फोनों को उनकी वारंटी खो देता है और उन्हें ईंट कर सकता है।

उपयोग संकलित ffmpeg MediaRecorder

विकास

के साथ संयुक्त Android के लिए हम FFMPEG एक mp4 फ़ाइल MediaRecorder

के माध्यम से फोन के अंदर रिकॉर्ड किया जा रहा

बाधा स्ट्रीम करने की कोशिश की

एफएफएमपीईजी एमपी 4 फाइलों को स्ट्रीम नहीं कर सकता है जो अभी तक रिकॉर्डिंग के साथ नहीं किए गए हैं।

उपयोग ffmpeg libstreaming

विकास के साथ Android के लिए संकलित

Libstreaming एप्लिकेशन और सर्वर के बीच कनेक्शन के रूप में LocalServerSocket का उपयोग करता है, इसलिए हमने सोचा कि हम कॉपी करने के लिए LocalServerSocket स्थानीय पते के साथ जुड़े हुए ffmpeg इस्तेमाल कर सकते हैं सीधे एसडी कार्ड के अंदर एक स्थानीय फाइल स्ट्रीमिंग। स्ट्रीमिंग शुरू होने के ठीक बाद, हमने फ़ाइल को डेटा रिकॉर्ड करना शुरू करने के लिए ffmpeg कमांड भी चलाया। Ffmpeg का उपयोग करके, हम मानते थे कि यह एक एमपी 4 फ़ाइल को उचित तरीके से बनाएगा, जिसका अर्थ है मूव परमाणु हेडर के साथ।

बाधा

"पता" बनाया फ़ोन के अंदर एक स्थानीय पते के रूप में, कमांड लाइन के माध्यम से पढ़ने योग्य नहीं है। तो कॉपी संभव नहीं है।

उपयोग OpenCV

विकास

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

बाधा

हम पता चला कि पुस्तकालय वास्तव में यह करने के लिए निर्धारित नहीं है, लेकिन छवि गणितीय हेरफेर के रूप में ज्यादा है। हमें libstreaming (जो हम पहले से ही करते हैं) का उपयोग करने की सिफारिश भी प्राप्त की है।

उपयोग Kickflip एसडीके

विकास

Kickflip एक मीडिया स्ट्रीमिंग सेवा है कि एंड्रॉयड और आईओएस में विकास के लिए अपने स्वयं के एसडीके प्रदान करता है। यह आरटीएमपी के बजाय एचएलएस का भी उपयोग करता है, जो एक नया प्रोटोकॉल है।

बाधा

उनके एसडीके की आवश्यकता है कि हम कैमरे का मानना ​​है कि, इस उपकरण के पूरे स्क्रीन पर रहता हमारे एप्लिकेशन की उपयोगिता को तोड़ने के साथ एक गतिविधि पैदा करते हैं।

उपयोग एडोब एयर

विकास

हम अनुप्रयोग के अन्य डेवलपर्स परामर्श शुरू कर दिया, प्ले स्टोर में पहले से ही उपलब्ध है पहले से ही सर्वर के लिए कि धारा।

बाधा

उन डेवलपर्स के साथ संपर्क में हो रही है, वे आश्वस्त है कि संभव है इस तकनीक का उपयोग कर एक ही समय में रिकॉर्ड और स्ट्रीम में नहीं होगा। और भी, हमें एडोब एयर का उपयोग करके पूरे ऐप को स्क्रैच से फिर से करना होगा।

अद्यतन

WebRTC

विकास

हम WebRTC निम्नलिखित this great project उपयोग शुरू कर दिया। हमने हमारे NODEJS सर्वर में सिग्नलिंग सर्वर शामिल किया और सॉकेट के माध्यम से मानक हैंडशेक करना शुरू कर दिया। हम अभी भी webrtc के माध्यम से स्थानीय रिकॉर्डिंग और स्ट्रीमिंग के बीच टॉगलिंग कर रहे थे।

बाधा

WebRTC हर नेटवर्क विन्यास में काम नहीं करता। इसके अलावा, कैमरा अधिग्रहण सभी मूल कोड है, जो बाइट्स को कॉपी करने या इसे अवरुद्ध करने की कोशिश करने के लिए बहुत कठिन बनाता है।

+0

cine.io बनाया Kickflip के समान लगता है। हालांकि अभी तक परीक्षण किया गया है। – sirvon

+0

इस बारे में आपके सभी निष्कर्ष पोस्ट करने के लिए धन्यवाद। मैं वही काम करने की कोशिश कर रहा हूं जो आपने अपने एंड्रॉइड ऐप में किया था। आपके अनुभव के आधार पर, अधिकांश दृष्टिकोणों का अपना मुद्दा होता है। मैं सोच रहा था कि क्या आपको एक साथ वीडियो स्ट्रीम करने और रिकॉर्ड करने का समाधान मिला है? यदि हां, तो क्या आप कुछ स्पष्टीकरण या उदाहरण प्रदान कर सकते हैं? – shahins

+0

अब मैं वेबस्टीसी को लाइवस्ट्रीम में माइग्रेट कर चुका हूं, लेकिन यह अभी तक एक ही समय में रिकॉर्डिंग नहीं कर रहा है। मैं इस अतिरिक्त जानकारी के साथ सूची अद्यतन करूंगा! –

उत्तर

0

जैसे ही OpenCV 3.0 उपलब्ध है (RC1 डाउनलोड किया जा सकता here), हम इस सूची में एक और विकल्प जोड़ सकते हैं:

का उपयोग OpenCV के दशक में Motion-JPEG encoder

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