MediaRecorder在Android Lollipop上发行 [英] MediaRecorder issue on Android Lollipop

查看:178
本文介绍了MediaRecorder在Android Lollipop上发行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在新版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);

//实际消耗的带宽通常高于要求的带宽

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

//我们在本地套接字而不是文件中写入相机的输出!
//这个一个小技巧让流媒体变得简单:来自摄像头的数据
//然后可以在套接字的另一端处理

mMediaRecorder.setOutputFile(mSender .getFileDescriptor());

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

} catch(Exception e){
throw new ConfNotSupportedException(e.getMessage());
}

启动的例外是:



MediaRecorder:start failed -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域套接字。



相反,我建议您创建一个管道对( 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()); 

在同一个文件中
更改

  //分组器将比特流封装在RTP流中,并通过网络发送
mPacketizer.setInputStream(mReceiver.getInputStream());
mPacketizer.start();

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

由于andreasperelli在注释中指出,请确保关闭closeSockets()中的ParcelFileDescriptors,或依赖在你的实现和版本之前,closeSockets()之前和你调用MediaRecorder.stop()之前。


I'm testing libstreaming on new Android Lollipop, and this code that worked on previous release, seems to launch exception.

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

Launched exception is:

MediaRecorder: start failed -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)

I've tried to comment:

mMediaRecorder.setOutputFile(mSender.getFileDescriptor());

no exception launched, but when I start streaming a dialog tell me that need an outputfile.

Help appreciated.

解决方案

I filed a bug report on AOSP. https://code.google.com/p/android/issues/detail?id=80715

"The current SELinux policies don't allow for mediaserver to handle app generated abstract unix domain sockets.

Instead, I'd recommend you create a pipe-pair ( http://developer.android.com/reference/android/os/ParcelFileDescriptor.html#createPipe() ) which is allowed by the Android 5.0 policy. " I don't know why they did this or how we were supposed to know.

I'm using a very old/modified (can't tell) version of libstreaming where mediastream is still extended from mediarecorder, but looking at the current version, in MediaStream you'll probably want to change createSockets to something including the following:

        ParcelFileDescriptor[] parcelFileDescriptors =ParcelFileDescriptor.createPipe();
        parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]);
        parcelWrite  = new ParcelFileDescriptor(parcelFileDescriptors[1]);

then in your video/audio stream

setOutputFile(parcelWrite.getFileDescriptor());

and in that same file change

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

to

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

As andreasperelli pointed out in the comment, make sure to close the ParcelFileDescriptors in closeSockets(), or depending on your implementation and version, before closeSockets() and before you call MediaRecorder.stop().

这篇关于MediaRecorder在Android Lollipop上发行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆