Android: 使用ParcelFileDescriptor通过套接字进行Mediarecorder视频流传输

3
我正在为此苦苦挣扎,并决定需要帮助。基本想法在这里描述:链接 我想在录制时直接通过套接字将MediaRecorder的输出流传输到我的服务器。(在这种特定情况下,我想看看是否可以不使用任何流协议,仅通过HTTP-POST实现。)
目前方法的错误是:E/MediaRecorder: start failed: -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();
    }
}

抱歉代码风格不好。

我试图按照其他解决方案中的建议更改OutputFormat和VideoEncoder。但是,我仍然不确定我是否朝着正确的方向前进。

即使在解决了这个错误之后,我认为我还需要在自己的线程中读取并发送流到服务器。

任何提示都可以帮助。

1个回答

1

我不确定这是否是由于Android的最新版本(在Nougat和Oreo上进行了测试)而导致的错误。但是尽管我尝试找到解决方法,最终还是遇到了同样的错误信息,尝试使用MediaRecorder。 多亏了libstreaming,我现在使用他们的示例中解释的MediaCodec API来使用该库:Example 2

然后,我获取MediaCodec API的输入流,并将其读入字节数组,直到达到一定的大小,并将其发送到我的http服务器。


你有没有示例展示如何使用InputStream?从示例中我不明白应该从哪个地方获取数据。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接