Android Lollipop上的MediaRecorder问题

and*_*lli 20 streaming android exception mediarecorder

我正在测试新的Android Lollipop上的libstreaming,这个代码在之前的版本中运行,似乎启动了异常.

    try {
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mCamera);

        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mMediaRecorder.setVideoEncoder(mVideoEncoder);
        mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
        mMediaRecorder.setVideoSize(mRequestedQuality.resX,mRequestedQuality.resY);


        mMediaRecorder.setVideoFrameRate(mRequestedQuality.framerate);

        // The bandwidth actually consumed is often above what was requested 

        mMediaRecorder.setVideoEncodingBitRate((int)(mRequestedQuality.bitrate*0.8));

        // We write the ouput of the camera in a local socket instead of a file !           
        // This one little trick makes streaming feasible quiet simply: data from the camera
        // can then be manipulated at the other end of the socket

        mMediaRecorder.setOutputFile(mSender.getFileDescriptor());

        mMediaRecorder.prepare();
        mMediaRecorder.start();

    } catch (Exception e) {
        throw new ConfNotSupportedException(e.getMessage());
    }
Run Code Online (Sandbox Code Playgroud)

推出的例外是:

MediaRecorder:开始失败-38

11-18 09:50:21.028: W/System.err(15783): net.majorkernelpanic.streaming.exceptions.ConfNotSupportedException
11-18 09:50:21.028: W/System.err(15783):    at net.majorkernelpanic.streaming.video.VideoStream.encodeWithMediaRecorder(VideoStream.java:442)
11-18 09:50:21.028: W/System.err(15783):    at net.majorkernelpanic.streaming.MediaStream.start(MediaStream.java:250)
Run Code Online (Sandbox Code Playgroud)

我试过评论:

mMediaRecorder.setOutputFile(mSender.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)

没有异常启动,但是当我开始流式传输对话框时告诉我需要一个输出文件.

帮助赞赏.

sba*_*aar 25

我提交了一份关于AOSP的错误报告. https://code.google.com/p/android/issues/detail?id=80715

"目前的SELinux政策不允许mediaserver处理应用程序生成的抽象unix域套接字.

相反,我建议您创建一个Android 5.0策略允许的管道对(http://developer.android.com/reference/android/os/ParcelFileDescriptor.html#createPipe())."我不知道他们为什么这样做或我们应该如何知道.

我正在使用一个非常古老/修改过的版本的libstreaming,其中mediastream仍然从mediarecorder扩展,但是看看当前版本,在MediaStream中你可能想要将createSockets更改为包括以下内容:

        ParcelFileDescriptor[] parcelFileDescriptors =ParcelFileDescriptor.createPipe();
        parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]);
        parcelWrite  = new ParcelFileDescriptor(parcelFileDescriptors[1]);
Run Code Online (Sandbox Code Playgroud)

然后在你的视频/音频流中

setOutputFile(parcelWrite.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)

并在同一个文件中更改

    // The packetizer encapsulates the bit stream in an RTP stream and send it over the network
    mPacketizer.setInputStream(mReceiver.getInputStream());
    mPacketizer.start();
Run Code Online (Sandbox Code Playgroud)

            InputStream is = null;
            try{ is = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead);
            }
            catch (Exception e){}
            mPacketizer.setInputStream(is);
Run Code Online (Sandbox Code Playgroud)

正如andreasperelli在评论中指出的那样,确保在closeSockets()之前和调用MediaRecorder.stop()之前关闭closeSockets()中的ParcelFileDescriptors,或者取决于你的实现和版本.

  • 您能否发布解决方案的完整代码? (6认同)