Android:使用ParcelFileDescriptor通过套接字与Mediarecorder进行视频流式传输
问题描述:
我正在为这段安静的时间而苦苦挣扎,我决定需要帮助。 这里描述的基本思路: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下面找到的主题的其他解决方案。但是,我仍然不确定我是否正朝着正确的方向前进。
即使遇到这个错误,我想我需要读出并发送到服务器在自己的线程的流。
每个提示都可以提供帮助。
答
我不确定这是否是由于Android上最新版本的错误(在Nougat和Oreo上测试过)。但尽管如此,我试图找到一种解决方法,但仍然试图使用MediaRecorder,但仍以相同的错误消息结束。 感谢libstreaming我现在使用MediaCodec API在他们的例子中解释如何使用库:Example 2。
然后我将MediaCodec API的输入流读取到一个字节数组中,直到达到一定的大小并将其发送到我的http服务器。