首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:使用ParcelFileDescriptor在Socket上播放媒体记录器的视频流

Android:使用ParcelFileDescriptor在Socket上播放媒体记录器的视频流
EN

Stack Overflow用户
提问于 2017-09-01 10:47:23
回答 1查看 3.6K关注 0票数 2

我在这安静的日子里挣扎了很久,我觉得我需要帮助。本文描述的基本思想是:链接

在记录时,我希望通过套接字将MediaRecorder的输出直接流到我的服务器。(在这个特定的情况下,我想看看在不使用任何流协议的情况下,仅仅通过HTTP就可以做到这一点。)

当前方法的错误是:E/MediaRecorder: start failed:-2147483648 - RuntimeException

在我指出这个主题之前,媒体记录器-棒棒糖上的问题

我使用一个AsyncTask类来调用recordData()函数:

代码语言:javascript
复制
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。尽管如此,我还是不确定我是否朝着正确的方向前进。

即使在解决了这个bug之后,我仍然认为我需要读出并以自己的线程将Stream发送到服务器。

每一个暗示都能帮上忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-22 07:43:35

我不确定这是否是一个错误,因为最新版本的Android (在努格特和奥利奥测试)。但是,在我试图找到解决办法的同时,我仍然试图使用MediaRecorder,得到了同样的错误消息。感谢我现在使用的Library,MediaCodec API在他们的示例中解释了如何使用库:示例2

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45998567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档