android - Android Lollipop 上的 MediaRecorder 问题

标签 android exception streaming mediarecorder

我正在测试 libstreaming在新的 Android Lollipop 上,并且在以前版本上运行的这段代码似乎启动了异常。

    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());
    }

启动的异常是:

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)

我已尝试发表评论:

mMediaRecorder.setOutputFile(mSender.getFileDescriptor());

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

帮助表示赞赏。

最佳答案

我提交了一份关于 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]);

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

setOutputFile(parcelWrite.getFileDescriptor());

在同一个文件中 改变

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

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

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

关于android - Android Lollipop 上的 MediaRecorder 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990816/

相关文章:

java - ImageView ListView

c# - 使用 WinDbg 从 minidump 中确定 InnerException 的行号

android - 如何在流式传输之前知道音频歌曲的持续时间?

java - 中间键值对流是否在 hadoop 中优化

java - "ScrollView can only host 1 child"在 2 个 fragment 中,只有 1 个 child ?

android - 为移动应用学习 geb 和 Spock

java - Android 中使用 setText 的 id 问题

java - 尽管有 @ResponseStatus 注释,ResponseEntityExceptionHandler 不会向客户端发送错误代码

exception - Azure 配额超出异常

java - 如何在 C++ 或 C# 或 Java 中创建 jpegs(live) 流?实时传输协议(protocol)?