2012-10-15 24 views
22

मैं ऑडियो रिकॉर्डिंग का एक उदाहरण तैयार करने की कोशिश कर रहा हूं, ऐप द्वारा प्रबंधित डेटा संग्रहण के साथ, MediaRecorder नहीं। मामलों का उपयोग आंतरिक भंडारण पर रिकॉर्डिंग को संग्रहीत करना या रिकॉर्डिंग एन्क्रिप्ट करना शामिल है।किसी के पास MediaRecorder ParcelFileDescriptor और createPipe() के साथ काम कर रहा है?

सिद्धांत रूप में, यह द्वारा ParcelFileDescriptor पर बनाई गई पाइप का उपयोग करके काम करना चाहिए, लेकिन मुझे विकृत आउटपुट मिल रहा है।

पहला, here is a sample project जो MediaRecorder का उपयोग करके "स्वाभाविक रूप से" रिकॉर्ड करता है, MediaRecorder बाहरी संग्रहण पर आउटपुट फ़ाइल पर सीधे लिखता है। यह ऐप बस ठीक काम करता है, और आउटपुट को एंड्रॉइड डिवाइस द्वारा रिकॉर्ड किया जा सकता है या इसे मेरे लिनक्स बॉक्स पर वीएलसी द्वारा खेला जा सकता है।

Here is my createPipe() variation of this project। सामान्य MediaRecorder कॉन्फ़िगरेशन के दृष्टिकोण से (उदा।, setOutputFormat()), यह पहले जैसा ही है, ताकि कोड संभवतः सही हो।

recorder.setOutputFile(getStreamFd()); 

कहाँ getStreamFd() का उपयोग करता createPipe(), पाइप से पढ़ने के लिए एक पृष्ठभूमि धागा spawns, और उपयोग के लिए लेखन अंत MediaRecorder द्वारा रिटर्न:

private FileDescriptor getStreamFd() { 
    ParcelFileDescriptor[] pipe=null; 

    try { 
     pipe=ParcelFileDescriptor.createPipe(); 

     new TransferThread(new AutoCloseInputStream(pipe[0]), 
         new FileOutputStream(getOutputFile())).start(); 
    } 
    catch (IOException e) { 
     Log.e(getClass().getSimpleName(), "Exception opening pipe", e); 
    } 

    return(pipe[1].getFileDescriptor()); 
    } 

हालांकि, मैं के माध्यम से उत्पादन की आपूर्ति कर रहा हूँ

TransferThread क्लासिक java.io स्ट्रीम-टू-स्ट्रीम कॉपी दिनचर्या है, आउटपुट फ़ाइल को फ्लश करने और सिंक करने के लिए स्मारक के साथ बढ़ाया गया है:

static class TransferThread extends Thread { 
    InputStream in; 
    FileOutputStream out; 

    TransferThread(InputStream in, FileOutputStream out) { 
     this.in=in; 
     this.out=out; 
    } 

    @Override 
    public void run() { 
     byte[] buf=new byte[8192]; 
     int len; 

     try { 
     while ((len=in.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 

     in.close(); 

     out.flush(); 
     out.getFD().sync(); 
     out.close(); 
     } 
     catch (IOException e) { 
     Log.e(getClass().getSimpleName(), 
       "Exception transferring file", e); 
     } 
    } 
    } 

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

अगर मुझे लगता है, तो मुझे लगता है कि मैं पाइप से पढ़ने में कुछ खराब कर रहा हूं, लेकिन मुझे यकीन नहीं है कि मैं विशेष रूप से गलत कहां जा रहा हूं।

कोई सुझाव?

अग्रिम धन्यवाद!

+0

एफडब्ल्यूआईडब्ल्यू, मेरे पास 'मीडियाप्लेयर' के साथ 'createPipe() 'का उपयोग करने के बारे में एक संबंधित प्रश्न है: http://stackoverflow.com/questions/12920429/anyone-have-mediaplayer-working-with-parcelfiledescriptor-and-createpipe – CommonsWare

+0

क्या आपने इस समस्या को हल किया? – Teocci

+0

@Teocci: नहीं। एंड्रॉइड ओ की 'प्रॉक्सीफाइल डिस्क्रिप्टर कॉलबैक' * शायद यहां सहायता करें, लेकिन केवल एंड्रॉइड ओ और उच्चतर पर। असल में, पाइप तलाशने योग्य धाराएं नहीं देते हैं। – CommonsWare

उत्तर

13

मुझे लगता है कि यह आपके अन्य प्रश्न के उत्तर से संबंधित है। Anyone Have MediaPlayer Working with ParcelFileDescriptor and createPipe()?

शायद जब मीडियारेकॉर्डर शीर्षलेख की जानकारी लिखना चाहेगा, तो पाइप बंद हो जाएगी।

यदि आप का उपयोग करें:

recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

रिकॉर्ड ठीक काम करता है, क्योंकि यह एक हेडर सूचना, केवल कच्चे ऑडियो नहीं होगा।

+1

आह! यह वास्तव में काम कर रहा है, और आपकी व्याख्या समझ में आता है। बहुत धन्यवाद! – CommonsWare

+0

मैं videorecording ऐप के लिए इनपुटस्ट्रीम बनाने के लिए इसका उपयोग करने का प्रयास कर रहा हूं लेकिन मुझे यकीन नहीं है कि आपकी इनपुट स्ट्रीम कहां से आ रही है, आप अपने इनपुटस्ट्रीम के लिए वास्तव में क्या पास कर रहे थे? किसी भी मदद से एक लंबा रास्ता तय होगा –