मैं ऑडियो रिकॉर्डिंग का एक उदाहरण तैयार करने की कोशिश कर रहा हूं, ऐप द्वारा प्रबंधित डेटा संग्रहण के साथ, 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 से भरा है। यह पहले ऐप से आउटपुट के समान ही गड़बड़ी से भरा हुआ है। हालांकि, न तो एंड्रॉइड और न ही वीएलसी इसे खेल सकता है।
अगर मुझे लगता है, तो मुझे लगता है कि मैं पाइप से पढ़ने में कुछ खराब कर रहा हूं, लेकिन मुझे यकीन नहीं है कि मैं विशेष रूप से गलत कहां जा रहा हूं।
कोई सुझाव?
अग्रिम धन्यवाद!
एफडब्ल्यूआईडब्ल्यू, मेरे पास 'मीडियाप्लेयर' के साथ 'createPipe() 'का उपयोग करने के बारे में एक संबंधित प्रश्न है: http://stackoverflow.com/questions/12920429/anyone-have-mediaplayer-working-with-parcelfiledescriptor-and-createpipe – CommonsWare
क्या आपने इस समस्या को हल किया? – Teocci
@Teocci: नहीं। एंड्रॉइड ओ की 'प्रॉक्सीफाइल डिस्क्रिप्टर कॉलबैक' * शायद यहां सहायता करें, लेकिन केवल एंड्रॉइड ओ और उच्चतर पर। असल में, पाइप तलाशने योग्य धाराएं नहीं देते हैं। – CommonsWare