私はこの静かに苦労しており、私は助けが必要だと決めました。 ここでは基本的な考え方について説明します: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を変更しようとしました。しかし、それでも正しい方向に進んでいるかどうかはまだ分かりません。
このバグを回避した後でも、私は何とかストリームを読んで自分のスレッドでサーバーに送信する必要があると思います。
すべてのヒントが役立ちます。