2014-11-18 19 views
19

पर मीडियाआरकॉर्डर मुद्दा मैं libstreaming पर नए एंड्रॉइड लॉलीपॉप पर परीक्षण कर रहा हूं, और यह कोड जो पिछले रिलीज पर काम करता है, अपवाद लॉन्च करता है।एंड्रॉइड लॉलीपॉप

try { 
     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.setCamera(mCamera); 

     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     mMediaRecorder.setVideoEncoder(mVideoEncoder); 
     mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface()); 
     mMediaRecorder.setVideoSize(mRequestedQuality.resX,mRequestedQuality.resY); 


     mMediaRecorder.setVideoFrameRate(mRequestedQuality.framerate); 

     // The bandwidth actually consumed is often above what was requested 

     mMediaRecorder.setVideoEncodingBitRate((int)(mRequestedQuality.bitrate*0.8)); 

     // We write the ouput of the camera in a local socket instead of a file !   
     // This one little trick makes streaming feasible quiet simply: data from the camera 
     // can then be manipulated at the other end of the socket 

     mMediaRecorder.setOutputFile(mSender.getFileDescriptor()); 

     mMediaRecorder.prepare(); 
     mMediaRecorder.start(); 

    } catch (Exception e) { 
     throw new ConfNotSupportedException(e.getMessage()); 
    } 

शुरू अपवाद है:

MediaRecorder: शुरू में विफल रहा है -38

11-18 09:50:21.028: W/System.err(15783): net.majorkernelpanic.streaming.exceptions.ConfNotSupportedException 
11-18 09:50:21.028: W/System.err(15783): at net.majorkernelpanic.streaming.video.VideoStream.encodeWithMediaRecorder(VideoStream.java:442) 
11-18 09:50:21.028: W/System.err(15783): at net.majorkernelpanic.streaming.MediaStream.start(MediaStream.java:250) 

मैं टिप्पणी करने की कोशिश की है:

mMediaRecorder.setOutputFile(mSender.getFileDescriptor()); 

कोई अपवाद नहीं शुरू किया, लेकिन जब मैं शुरू एक संवाद स्ट्रीमिंग मुझे बताओ कि आउटपुटफाइल की आवश्यकता है।

सहायता की सराहना की।

+0

मुझे लगता है कि मुझे एक ही त्रुटि मिल रही है। मैं ऑडियो/वीडियो स्ट्रीम करने के लिए स्थानीय सॉकेट पर भी लिखने की कोशिश कर रहा हूं लेकिन -38 त्रुटि ई/स्टेजफ्राइट रिकॉर्डर के बाद हो रहा हूं: आउटपुट फ़ाइल डिस्क्रिप्टर अमान्य है। https://android.googlesource.com/platform/frameworks/av/+/master/media/libmediaplayerservice/StagefrightRecorder.cpp लाइन 752 पर त्रुटि आउटपुट के अनुसार। जब फ़ाइल डिस्क्रिप्टर 0 से कम है, अर्थ -1 डिफ़ॉल्ट प्रेषित मूल्य। सिवाय इसके कि मैं आउटपुट फ़ाइल सेट करने से पहले सत्यापित करता हूं कि मैंने वर्णनकर्ता को 136 के रूप में सेट किया है। – sbaar

+0

आप किस एंड्रॉइड संस्करण का उपयोग कर रहे हैं? – andreasperelli

+0

यह समस्या केवल लॉलीपॉप पर है। उसी नेक्सस 5 और उसी नेक्सस 7 डिवाइस पर एक ही कोड काम करता था जब वे किटकैट पर थे। अब मुझे यकीन है कि समस्या सॉकेट के साथ कुछ करने के लिए है, लेकिन मैं अभी भी यह बदलने की कोशिश कर रहा हूं कि क्या बदल सकता है। – sbaar

उत्तर

22

मैंने एओएसपी पर एक बग रिपोर्ट दायर की। https://code.google.com/p/android/issues/detail?id=80715

"वर्तमान SELinux नीतियों मीडिया सर्वर अनुप्रयोग उत्पन्न अमूर्त यूनिक्स डोमेन सॉकेट संभाल करने के लिए अनुमति नहीं है।

इसके बजाय, मैं तुम्हें एक पाइप-जोड़ी बनाने (http://developer.android.com/reference/android/os/ParcelFileDescriptor.html#createPipe()) है जिसके द्वारा अनुमति दी है की सलाह देते हैं एंड्रॉइड 5.0 पॉलिसी " मुझे नहीं पता कि उन्होंने ऐसा क्यों किया या हमें कैसे पता होना चाहिए।

मैं libstreaming के एक बहुत पुराने/संशोधित (बता नहीं सकता) संस्करण का उपयोग कर रहा हूं जहां मध्यस्थता अभी भी मीडियारेकॉर्डर से विस्तारित है, लेकिन मौजूदा संस्करण को देखते हुए, मीडियास्ट्रीम में आप संभवत: CreateSockets को कुछ में बदलना चाहते हैं निम्नलिखित:

 ParcelFileDescriptor[] parcelFileDescriptors =ParcelFileDescriptor.createPipe(); 
     parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]); 
     parcelWrite = new ParcelFileDescriptor(parcelFileDescriptors[1]); 
तो आप अपने वीडियो/ऑडियो स्ट्रीम

setOutputFile(parcelWrite.getFileDescriptor()); 

में और है कि एक ही फाइल परिवर्तन में

// The packetizer encapsulates the bit stream in an RTP stream and send it over the network 
    mPacketizer.setInputStream(mReceiver.getInputStream()); 
    mPacketizer.start(); 

को

  InputStream is = null; 
      try{ is = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead); 
      } 
      catch (Exception e){} 
      mPacketizer.setInputStream(is); 

andreasperelli के रूप में टिप्पणी में बताया, आपके क्रियान्वयन और संस्करण के आधार पर, closeSockets से पहले() और आप MediaRecorder.stop फोन से पहले, closeSockets में ParcelFileDescriptors() को बंद करने के लिए सुनिश्चित करें या()।

+0

क्या आप कृपया मुझे MediaSream.java कोड पेस्ट कर सकते हैं यह देखने के लिए कि आपने createSockets() विधि को कैसे संशोधित किया है? – andreasperelli

+0

मुझे खेद है कि मैं स्पष्ट नहीं था। आप अकेले createSockets() और closeSockets() को छोड़ सकते हैं और बस उन्हें पूरी तरह से कोड को अनदेखा कर सकते हैं। आप लोकलसेट्स का उपयोग नहीं करेंगे। इसके बजाय मध्यस्थता में संरक्षित पार्सल रीड और पार्सलवाइट वर्र्स बनाएं, उन्हें ऊपर दिखाए गए createSockets में प्रारंभ करें, और उन जगहों पर उनका उपयोग करें जहां स्थानीय सॉकेट का उपयोग किया गया था, आउटपुटफाइल और पैकेटिज़र इनपुट स्ट्रीम – sbaar

+1

सेट करते समय उपरोक्त कोड को प्रतिस्थापित करना यह प्रारंभ पर काम करता है स्ट्रीमिंग, इसे रोकने पर मैं MediaCodecInputStream देखता हूं - कोई बफर उपलब्ध नहीं है ... logcat और onSessionStopped में नहीं कहा जाता है। वैसे, महान फिक्स! – andreasperelli

0

एंड्रॉयड 6.0 पर मैं कोड

new Thread(new Runnable() { 
    @Override public void run() { 
    FileInputStream inputStream = null; 
    try { 
     inputStream = new FileInputStream(path); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    while (true) { 
     byte[] buffer = new byte[0]; 
     try { 
     buffer = new byte[inputStream.available()]; 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
     try { 
     inputStream.read(buffer); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
     try { 
     mSender.getOutputStream().write(buffer); 
     mSender.getOutputStream().flush(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 
}).start(); 

साथ इस समस्या को हल मैं बफर के रूप में एक फ़ाइल का उपयोग करें और फाइल करने के लिए एक और thread.the MediaRecorder उत्पादन में बाइट्स लिखें।

+0

हाय, कृपया इस कोड का अधिक विस्तार से उपयोग करने का तरीका बताएं। –

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