Android棒棒糖上的MediaRecorder问题

Android棒棒糖上的MediaRecorder问题,android,exception,streaming,mediarecorder,Android,Exception,Streaming,Mediarecorder,我正在测试新的安卓棒棒糖,这段代码在以前的版本中运行,似乎启动了异常 try { mMediaRecorder = new MediaRecorder(); mMediaRecorder.setCamera(mCamera); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat(Med

我正在测试新的安卓棒棒糖,这段代码在以前的版本中运行,似乎启动了异常

    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());
没有启动异常,但当我开始流式传输时,一个对话框告诉我需要一个outputfile


感谢您的帮助。

我提交了一份关于AOSP的错误报告。

“当前SELinux策略不允许mediaserver处理应用程序生成的抽象unix域套接字

相反,我建议您创建Android 5.0策略允许的管道对()。 " 我不知道他们为什么这么做,也不知道我们怎么知道

我正在使用一个非常旧的/修改过的(不知道)版本的libstreaming,其中mediastream仍然是从mediarecorder扩展而来的,但看看当前的版本,在mediastream中,您可能希望将createSockets更改为以下内容:

        ParcelFileDescriptor[] parcelFileDescriptors =ParcelFileDescriptor.createPipe();
        parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]);
        parcelWrite  = new ParcelFileDescriptor(parcelFileDescriptors[1]);
然后在您的视频/音频流中

setOutputFile(parcelWrite.getFileDescriptor());
在同一个文件中 改变


正如Andreasprelli在评论中指出的那样,确保在closeSockets()之前和调用MediaRecorder.stop()之前关闭closeSockets()中的ParcelFileDescriptor,或者根据您的实现和版本而定。在Android 6.0上,我用代码解决了这个问题

new Thread(new Runnable() {
  @Override public void run() {
    FileInputStream inputStream = null;
    try {
      inputStream = new FileInputStream(path);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    while (true) {
      byte[] buffer = new byte[0];
      try {
        buffer = new byte[inputStream.available()];
      } catch (IOException e) {
        e.printStackTrace();
      }
      try {
        inputStream.read(buffer);
      } catch (IOException e) {
        e.printStackTrace();
      }
      try {
        mSender.getOutputStream().write(buffer);
        mSender.getOutputStream().flush();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}).start();

我使用一个文件作为缓冲区,并在另一个线程写入字节。MediaRecorder将输出到该文件。

我想我也遇到了类似的错误。我正在尝试写入本地套接字以流式传输音频/视频,但遇到了-38错误E/StagefrightRecorder﹕ 输出文件描述符无效。根据第752行上的错误输出。当文件描述符小于0时,表示默认sentinel值为-1。除了在设置输出文件之前验证描述符是否设置为136。您使用的是哪个Android版本?这个问题只在棒棒糖上出现。同一台Nexus5和Nexus7设备上的相同代码在kitkat上运行。我现在很确定这个问题与套接字有关,但我仍在努力寻找可能发生变化的地方。对我来说也是如此。。。不幸的是,到目前为止,在网络上还没有找到任何东西……在Android 5.0中使用ParcelFileDescriptor效果很好,但我在使用MediaRecorder时遇到了视频颜色问题。颜色和真实的颜色和以前的Android版本不同。我认为颜色格式是错误的。你在@Andreasprelli遇到它了吗?这似乎在开始流媒体时有效,在停止流媒体时我看到MediaCodeInputStream-没有可用的缓冲区。。。在logcat和onSessionStopped中,似乎没有调用。顺便说一句,真是太棒了!已解决添加:parcelRead.close();和parcelWrite.close();在使用Android 5.0的Nexus 4上,closeSockets()方法:-)运行良好,在使用Android 5.0的Nexus 5上,流媒体是绿色的和垃圾的…解决了添加:parameters.set(“cam_模式”,1);在VideoStream.java createCamera()方法中,您可以发布解决方案的完整代码吗?您好,请详细解释如何使用此代码。
            InputStream is = null;
            try{ is = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead);
            }
            catch (Exception e){}
            mPacketizer.setInputStream(is);
new Thread(new Runnable() {
  @Override public void run() {
    FileInputStream inputStream = null;
    try {
      inputStream = new FileInputStream(path);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    while (true) {
      byte[] buffer = new byte[0];
      try {
        buffer = new byte[inputStream.available()];
      } catch (IOException e) {
        e.printStackTrace();
      }
      try {
        inputStream.read(buffer);
      } catch (IOException e) {
        e.printStackTrace();
      }
      try {
        mSender.getOutputStream().write(buffer);
        mSender.getOutputStream().flush();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}).start();