MediaRecorder issue on Android Lollipop

前端 未结 2 1676
执念已碎
执念已碎 2020-12-01 06:30

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

    try {
              


        
相关标签:
2条回答
  • 2020-12-01 07:22

    at Android 6.0 I resolve this problem with the code

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

    I use a file as buffer and write bytes at another thread.the MediaRecorder output to the file.

    0 讨论(0)
  • 2020-12-01 07:31

    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().

    0 讨论(0)
提交回复
热议问题