2017-09-01 213 views
0

我正在爲這段安靜的時間而苦苦掙扎,我決定需要幫助。 這裏描述的基本思路:LinkAndroid:使用ParcelFileDescriptor通過套接字與Mediarecorder進行視頻流式傳輸

我想在錄製時將MediaRecorder的輸出直接流式傳輸到我的服務器套接字上。 (在這個特定的情況下,我想看看這是不可能的,只需通過HTTP-POST使用任何流協議。)

我目前的方法的錯誤是:E/MediaRecorder:啓動失敗:-2147483648 - RuntimeException

之前,我曾指點我到這個話題mediarecorder-issue-on-lollipop

我使用的AsyncTask類叫我recordData()函數的錯誤:

new sendAsync().execute("test"); 


private void recordData(Socket socket){ 
    try{ 
     OutputStream out = socket.getOutputStream(); 
     InputStream is = null; 

     ParcelFileDescriptor[] parcelFileDescriptors = ParcelFileDescriptor.createPipe(); 
     parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]); 
     parcelWrite = new ParcelFileDescriptor(parcelFileDescriptors[1]); 
     try{ 
      is = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     //pfd = ParcelFileDescriptor.fromSocket(socket); 
     sft = new SurfaceTexture(0); 
     sf = new Surface(sft); 

     if(recorder == null) { 
      recorder = new MediaRecorder(); 
      recorder.reset(); 
      recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
      recorder.setVideoFrameRate(30); 
      recorder.setPreviewDisplay(sf); 

      recorder.setOutputFile(parcelWrite.getFileDescriptor()); 

      recorder.setMaxDuration(10000); // 10 seconds 
      try { 
       recorder.prepare(); 
       recorder.start(); 
       System.out.println("This is Recorder running"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      byte[] buffer = new byte[16384]; 
      int byteread = 0; 
      while ((byteread = is.read(buffer, 0, buffer.length)) != -1) { 
       out.write(buffer, 0, byteread); 
      } 
      out.flush(); 
     }else{ 
      stopRecording(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

對不起對於t他糟糕的編碼風格。

我試着改變OutputFormat和VideoEncoder下面找到的主題的其他解決方案。但是,我仍然不確定我是否正朝着正確的方向前進。

即使遇到這個錯誤,我想我需要讀出併發送到服務器在自己的線程的流。

每個提示都可以提供幫助。

回答

0

我不確定這是否是由於Android上最新版本的錯誤(在Nougat和Oreo上測試過)。但儘管如此,我試圖找到一種解決方法,但仍然試圖使用MediaRecorder,但仍以相同的錯誤消息結束。 感謝libstreaming我現在使用MediaCodec API在他們的例子中解釋如何使用庫:Example 2

然後我將MediaCodec API的輸入流讀取到一個字節數組中,直到達到一定的大小並將其發送到我的http服務器。

相關問題