2011-09-14 14 views
14

फ़ाइल करने के लिए डेटा लिखना समाप्त कर दिया है, हम वास्तविक रिकॉर्डिंग करने से पहले setOutputFile() का उपयोग कर बाहरी संग्रहण पर फ़ाइल में वीडियो रिकॉर्ड करने के लिए MediaRecorder का उपयोग कर रहे हैं।कैसे पता चलेगा जब MediaRecorder ने

सबकुछ ठीक काम करता है, लेकिन मुख्य मुद्दा यह है कि जैसे ही रिकॉर्डिंग हो जाती है, हम एक वीडियो व्यू में रिकॉर्ड किए गए वीडियो को वापस खेलना शुरू करना चाहते हैं।

फ़ाइल को पढ़ने और वापस खेलने के लिए तैयार होने पर कैसे पता चलेगा?

उत्तर

18

FileObserver कक्षा आपकी आवश्यकताओं को पूरी तरह से उपयुक्त बनाती है। Here is the documentation। इसका उपयोग करना आसान है। जब लिखित के बाद एक मनाई गई फ़ाइल बंद होती है, तो onEvent कॉलबैक को पैरामीटर के रूप में CLOSE_WRITE के साथ बुलाया जाता है।

MyFileObserver fb = new MyFileObserver(mediaFile_path, FileObserver.CLOSE_WRITE); 
fb.startWatching(); 

class MyFileObserver extends FileObserver { 

    public MyFileObserver (String path, int mask) { 
     super(path, mask); 
    } 

    public void onEvent(int event, String path) { 
     // start playing 
    } 
} 

stopWatching() कॉल करने के लिए भूल जाते हैं ..

+0

मैं अभी इस परीक्षण का परीक्षण नहीं कर पा रहा हूं, लेकिन क्या आपको पता है कि क्या यह गारंटी है कि MediaRecorder लिखने के बीच फ़ाइल को बंद नहीं करता है? –

+0

इसके बारे में पता नहीं है। लेकिन अगर ऐसा होता है, तो आप एक सदस्य में रिकॉर्डिंग स्थिति को बनाए रख सकते हैं और इसे 'ऑनवेन्ट' में देख सकते हैं। अगर रिकॉर्डिंग रोका गया है, तो बस घटना को अनदेखा करें। – Ronnie

+0

सच है। मुझे लगता है कि यह सबसे अच्छा समाधान प्रतीत होता है, धन्यवाद! –

0

स्पष्ट रूप से मीडिया प्लेयर में रिकॉर्डिंग बंद होने पर पता लगाने का कोई तरीका नहीं है, लेकिन एक स्टॉप() है जिसे आप ओवरराइड कर सकते हैं यदि आप कस्टमर क्लास बनाते हैं जो MediaRecorder लागू करता है। यहाँ मैं कुछ इस तरह करना होगा:

public class MyRecorder implements MediaRecorder { 
    public boolean stopped; 

    .... implement all the methods that MediaRecorder has making 
     sure to call super for each method. 

    @Override 
    public void myStop() { 
     this.stopped = true; 
     super.stop(); 
    } 
} 

तो फिर तुम को देखने के लिए अगर यह रिकॉर्डिंग बंद कर दिया है बूलियन पहुँच सकते हैं।

+1

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

+0

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

+2

मुझे पता है कि जब हम रिकॉर्डिंग _stop_ करते हैं। जब रिकॉर्डिंग बंद हो जाती है, तो रिकॉर्डर डिस्क पर डेटा लिखता है और मैं जानना चाहता हूं कि यह कब डेटा लिखना समाप्त कर चुका है :) –

0

फाइल का मूल्य lastModified() मूल्य की जांच करने के लिए एक गंदे तरीके से होगा और फ़ाइल को 2 सेकंड के लिए संशोधित नहीं किया गया था, तो वीडियो व्यू खोलें।

+0

हमें पहले से ही हैक्स मिल चुके हैं, लेकिन अगर कोई है तो मैं उचित समाधान पसंद करूंगा। यदि कोई नहीं है, तो, हम केवल हमारे हैक का उपयोग करते रहेंगे और इसमें कुछ त्रुटि जोड़ देंगे :) –

5

हम निम्नलिखित algo के साथ इसी तरह समस्या हल:

while (file not complete) 
    sleep for 1 sec 
    read the fourth byte of the file 
    if it is not 0 (contains 'f' of the 'ftyp' header) then 
     file is complete, break 

प्रमुख मुद्दा है कि MediaRecorder बहुत आखिरी समय पर ftyp बॉक्स लिखते है। यदि यह जगह पर है, तो फ़ाइल पूरी हो गई है।

+0

यह वादा कर रहा है! इस पर जाना होगा, धन्यवाद। –

1

मैं अपने आप को इस की कोशिश की है नहीं, लेकिन यह काम हो सकता है:

सार्वजनिक शून्य रिलीज() के बाद से: एपीआई स्तर 1

विज्ञप्ति इस MediaRecorder वस्तु के साथ जुड़े संसाधनों। यह MediaRecorder का उपयोग करते समय इस विधि को कॉल करने के लिए अच्छा अभ्यास है।

यदि यह कहता है, तो मुझे लगता है कि अगर आप इसे कॉल करते हैं और इस विधि के बाद आपको पता चलता है कि फ़ाइल तैयार है।

+0

वास्तव में? मैंने सोचा था कि संसाधनों को जारी करने और उनके साथ जीसी सौदे देने के लिए, हम कई क्लिप रिकॉर्ड करते हैं ताकि मीडियारेकॉर्डर का पुनर्निर्माण हर बार हमारे लिए प्रदर्शन को नुकसान पहुंचाए। हालांकि, मैं इसकी जांच करूंगा, धन्यवाद! –

1

रिकॉर्डिंग mediaRecorder.stop (के आकार पर ध्यान दिए बिना मेरी परीक्षणों में) एक अवरुद्ध विधि है कि केवल रिटर्न के बाद फ़ाइल पूरी तरह से लिखा और द्वारा बंद कर दिया गया है मीडिया रिकॉर्डर।

तो जेपीएम जवाब वास्तव में सही है।

आप रोक() के तुरंत बाद File.length() को कॉल करके इसे सत्यापित कर सकते हैं। आप पाएंगे कि आउटपुट फ़ाइल की लंबाई इस बिंदु पर फ़ाइल की अंतिम लंबाई है। दूसरे शब्दों में मीडिया रिकॉर्डर स्टॉप() वापस लौटने के बाद फ़ाइल में कुछ भी नहीं लिखता है।

0

मुझे xamarin में एक ही समस्या थी और इन सभी समाधानों (एश समाधान को छोड़कर) की कोशिश की।इस मुद्दे को हल करने के लिए मैंने अंततः क्या किया था रिलीज से पहले रिलीज से पहले और रिलीज से पहले रिलीज मीडियाडियाकॉर्डर() फ़ंक्शन में नीचे दिए गए फ़ंक्शन को कॉल करना था।

mediaRecorder.setOutputFile("some new file") 
संबंधित मुद्दे