10

पर एक परिपत्र बफर मैं सबसे अच्छा तरीका है के लिए देख रहा हूँ (यदि हो तो ...) के लिए रिकॉर्डिंग एसडी कार्ड पर एक परिपत्र बफर के लिए निरंतर वीडियो पर कब्जा करने, उपयोगकर्ता घटनाओं पर कब्जा करने के बाद वे हुआ है की इजाजत दी।वीडियो एंड्रॉयड

मानक वीडियो रिकॉर्डिंग API आपको सीधे फ़ाइल पर लिखने की अनुमति देता है, और जब आप सीमा तक पहुंचते हैं (उपयोगकर्ता द्वारा सेट किया गया है, या एसडी कार्ड की क्षमता) तो आपको रिकॉर्डिंग को रोकना और पुनरारंभ करना होगा। यह 2 सेकंड लंबी खिड़की बनाता है जहां रिकॉर्डिंग नहीं चल रही है। यह कुछ मौजूदा ऐप्स जैसे DailyRoads Voyager पहले से ही करता है। कुछ महत्वपूर्ण याद करने का मौका कम करने के लिए आप विभाजन समय को 10 मिनट की तरह लंबे समय तक सेट कर सकते हैं, लेकिन अगर इस घटना के अंत में कोई घटना होती है तो आप शुरुआत में 9 मिनट के कुछ भी स्टोर करके अंतरिक्ष बर्बाद कर रहे हैं।

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

के बाद रिकॉर्डिंग बंद कर दिया जाता है, या हो सकता है कि एक पृष्ठभूमि धागे पर के दौरान (फोन/कार्ड गति के आधार पर) मैं एक और फाइल करने के लिए चिह्नित क्षेत्र से बाहर कॉपी और अधिलेखित सुरक्षा से निकाल देंगे।

मुख्य सवाल है, अगर आप उपरोक्त विवरण के बारे में परवाह नहीं है: मैं एक तरह से Android SDK में एक वीडियो फ़ाइल के लिए व्यक्तिगत फ्रेम कन्वर्ट करने के लिए खोजने के लिए प्रतीत नहीं कर सकते हैं। क्या यह संभव है? यदि नहीं, तो क्या कोई उपलब्ध पुस्तकालय हैं, शायद देशी कोड में, यह ऐसा कर सकता है?

मैं वास्तव में असम्पीडित फ्रेम के बड़े बफर के बारे में परवाह नहीं है, लेकिन निर्यात वीडियो एक Android के अनुकूल प्रारूप में संकुचित किया जाना चाहिए। लेकिन अगर बफर को संपीड़ित करने का कोई तरीका है तो मैं इसके बारे में सुनना चाहता हूं।

धन्यवाद।

उत्तर

8

Android के MediaRecorder में उत्पादन निर्दिष्ट करने के लिए दो तरह से होती है। एक फ़ाइल नाम है और दूसरा FileDescriptor है।

स्थिर विधि ParcelFileDescriptor की fromSocket आप एक सॉकेट की ओर इशारा करते ParcelFileDescriptor का एक उदाहरण बना सकते हैं का उपयोग करना। फिर, पर FileDescriptor प्राप्त करने के लिए getFileDescriptor पर कॉल करें।

चूंकि आप सॉकेट से एन्कोडेड वीडियो प्राप्त कर सकते हैं (जैसे कि आप एक स्थानीय वेब सर्वर बना रहे थे), आप वीडियो के अलग-अलग फ्रेम तक पहुंच पाएंगे, हालांकि इतना सीधे नहीं, क्योंकि आपको इसे डीकोड करने की आवश्यकता होगी प्रथम।

+0

एक अच्छा तरीका इनकोडिंग वीडियो स्ट्रीम प्राप्त करने के लिए, धन्यवाद की तरह लगता है। मुझे यह कोशिश करनी होगी कि यह कैसा प्रदर्शन करता है। लेकिन व्यक्तिगत फ्रेम को डीकोड करने से बहुत अधिक CPU का उपयोग होगा, शायद कुछ फोन पर रीयलटाइम (एन्कोडिंग + डिकोडिंग एक ही समय में) भी नहीं होगा। तो मुझे लगता है कि मैं कुछ सर्कुलर फ़ाइल बफर को एन्कोडेड स्ट्रीम लिखूंगा, हेडर के बिना और इसी तरह। फिर निर्यात के दौरान मैं एन्कोडेड फ्रेम को कुछ शीर्षलेख के साथ पैच करने और एक वैध वीडियो फ़ाइल बनाने की कोशिश करूंगा। – lacop

+2

@albwq, क्या आपकी विधि आपके लिए अच्छी तरह से काम करती है? – Felix

+2

क्या आप कुछ डेमो कोड प्रदान कर सकते हैं? यह बहुत उपयोगी होगा! =) –

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