0

私はこの静かに苦労しており、私は助けが必要だと決めました。 ここでは基本的な考え方について説明します:LinkAndroid:ParcelFileDescriptorを使用してソケットを介してMediarecorderでビデオストリーミング

録音中にMediaRecorderの出力をソケット経由でサーバーに直接ストリームしたいとします。 (この特定のケースでは、HTTP-POST経由でストリーミングプロトコルを使用せずにこれが可能かどうかを確認したい)

私の現在のアプローチのエラーは、E/MediaRecorder:start failed:-2147483648 - RuntimeException

私はこのトピックにmediarecorder-issue-on-lollipop

私を指してエラーが発生しました前に、私は私のrecordDataの()関数を呼び出すためにAsyncTaskクラスを使用します。

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(); 
    } 
} 
トンのために申し訳ありません

彼は悪いコーディングスタイル。

トピックにある他の解決方法に続いて、OutputFormatとVideoEncoderを変更しようとしました。しかし、それでも正しい方向に進んでいるかどうかはまだ分かりません。

このバグを回避した後でも、私は何とかストリームを読んで自分のスレッドでサーバーに送信する必要があると思います。

すべてのヒントが役立ちます。

答えて

0

Android(NougatとOreoでテスト済み)の最新バージョンのため、これがエラーかどうかはわかりません。しかし、私が回避策を見つけようとするほど、MediaRecorderを使用しようとすると同じエラーメッセージが表示されました。 libstreamingのおかげで、ここではMediaCodec APIの例で説明したライブラリの使用方法を使用します:。

次に、私はMediaCodec APIのInputstreamをとり、特定のサイズに達するまでバイト配列に読み込み、これを自分のhttp-serverに送ります。

関連する問題