【问题标题】:How to fix 'java.lang.IllegalStateException' on 'MediaRecorder.start()' using LocalSocket如何使用 LocalSocket 修复“MediaRecorder.start()”上的“java.lang.IllegalStateException”
【发布时间】:2019-11-24 15:06:44
【问题描述】:

我正在尝试开发一个圆形录像机,我需要将录制的视频保存在缓冲区中以恢复某个时刻的最后 X 分钟。 问题是当我运行 MediaRecorder 对象的“start()”方法时:

mMediaRecorder.start();

出现以下错误:

java.lang.IllegalStateException android.media.MediaRecorder.start(本机方法) 在 picture.wikinova.com.odc.CameraActivity$MediaPrepareTask.doInBackground(CameraActivity.java:298) 在 picture.wikinova.com.odc.CameraActivity$MediaPrepareTask.doInBackground(CameraActivity.java:289) 在 android.os.AsyncTask$2.call(AsyncTask.java:333) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:764)

当我使用 'File' 作为 MediaRecorder 的 outputFile 时不会发生该错误,但当我尝试使用 LocalSocket 恢复内存中的视频缓冲区时会发生此错误。

这是我创建 LocalServerSocket 并捕获视频的代码

         mLocalServerSocket = new LocalServerSocket("sockt_ip");
            } catch (Exception e) {
                e.printStackTrace();
            }
            LocalSocket mLocalClientSocket = null;
            mLocalClientSocket = mLocalServerSocket.accept();
            InputStream in = mLocalClientSocket.getInputStream();
            byte[] buffer = new byte[1024];
            String retorno = "";
            int len = 0;
            while ((len = in.read(buffer)) >= 0) {
                for (int i = 0; i < len; i++) {
                  retorno += buffer[i];
                }

             }

这是我创建 MediaRecorder 并设置输出文件的代码

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
        profile.videoFrameWidth = optimalSize.width;
        profile.videoFrameHeight = optimalSize.height;

        parameters.setPreviewSize(profile.videoFrameWidth, profile.videoFrameHeight);
        mCamera.setParameters(parameters);
        try {
            mCamera.setPreviewTexture(mPreview.getSurfaceTexture());
        } catch (IOException e) {
            Log.e(TAG, "Surface texture is unavailable or unsuitable" + e.getMessage());
            return false;
        }


        mMediaRecorder = new MediaRecorder();

        mCamera.unlock();
        mMediaRecorder.setCamera(mCamera);


        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);



        mMediaRecorder.setProfile(profile);

        LocalSocket outSocket = new LocalSocket();
        try {
            outSocket.connect(new LocalSocketAddress("sockt_ip"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        mMediaRecorder.setOutputFile(outSocket.getFileDescriptor());


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

我已经测试了套接字连接。我在

中写了一些文字
LocalSocket outSocket 

并在

中收到
InputStream in = mLocalClientSocket.getInputStream();
byte[] buffer = new byte[1024];

问题是我将套接字 FileDescriptor 设置为 mediaRecorder 的 outputFile 的部分,但我不知道可以是什么。

【问题讨论】:

    标签: java android mediarecorder localsocket


    【解决方案1】:

    使用下面的代码

        CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
                profile.videoFrameWidth = optimalSize.width;
                profile.videoFrameHeight = optimalSize.height;
    
                parameters.setPreviewSize(profile.videoFrameWidth, profile.videoFrameHeight);
                mCamera.setParameters(parameters);
                try {
                    mCamera.setPreviewTexture(mPreview.getSurfaceTexture());
                } catch (IOException e) {
                    Log.e(TAG, "Surface texture is unavailable or unsuitable" + e.getMessage());
                    return false;
                }
    
    
                mMediaRecorder = new MediaRecorder();
    
                mCamera.unlock();
                mMediaRecorder.setCamera(mCamera);
    
    
                mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
                mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    
    
    
                mMediaRecorder.setProfile(profile);
    
                LocalSocket outSocket = new LocalSocket(LocalSocket.SOCKET_STREAM);
                try {
                    outSocket.connect(new LocalSocketAddress("sockt_ip"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                mMediaRecorder.setOutputFile(outSocket.getFileDescriptor());
    
    
                mMediaRecorder.prepare();
                mMediaRecorder.start();
    

    【讨论】:

      【解决方案2】:

      尝试使用new LocalSocket(LocalSocket.SOCKET_STREAM) 而不是new LocalSocket() 创建您的LocalSocket

      如果你没有如上所示设置你的socket类型LocalSocketImpl,也就是LocalSocket封装的实际系统socket,准确的报错了IllegalStateException,唯一的一个在该类中:

      public void create (int sockType) throws IOException {
          // no error if socket already created
          // need this for LocalServerSocket.accept()
          if (fd == null) {
              int osType;
              switch (sockType) {
                  case LocalSocket.SOCKET_DGRAM:
                      osType = OsConstants.SOCK_DGRAM;
                      break;
                  case LocalSocket.SOCKET_STREAM:
                      osType = OsConstants.SOCK_STREAM;
                      break;
                  case LocalSocket.SOCKET_SEQPACKET:
                      osType = OsConstants.SOCK_SEQPACKET;
                      break;
                  default:
                      throw new IllegalStateException("unknown sockType");
              }
              try {
                  fd = Os.socket(OsConstants.AF_UNIX, osType, 0);
                  mFdCreatedInternally = true;
              } catch (ErrnoException e) {
                  e.rethrowAsIOException();
              }
          }
      }
      

      之所以应该是SOCKET_STREAM,是因为LocalServerSocket内部的LocalSocketImpl也使用了该类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-06
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 2020-04-19
        • 2023-04-04
        • 2022-11-14
        相关资源
        最近更新 更多