Android 将文件描述符用作输出源时,mediaRecorder.prepare()上出现非法状态异常

Android 将文件描述符用作输出源时,mediaRecorder.prepare()上出现非法状态异常,android,sockets,mediarecorder,Android,Sockets,Mediarecorder,我正在使用媒体录制器录制设备屏幕。如果我提供本地路径作为输出源,则media recorder工作正常,但如果我提供从parcelFileDescriptor.fromSocket(套接字)获取的文件描述符,则我在mediaRecorder.prepare()上获得非法状态异常 这是我的媒体录制器初始化代码- try { DisplayMetrics displayMetrics = context.getResourc

我正在使用媒体录制器录制设备屏幕。如果我提供本地路径作为输出源,则media recorder工作正常,但如果我提供从parcelFileDescriptor.fromSocket(套接字)获取的文件描述符,则我在mediaRecorder.prepare()上获得非法状态异常

这是我的媒体录制器初始化代码-

                  try {
                    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
                    mMediaRecorder = new MediaRecorder();
                    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
                    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            //        mMediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getPath() + "/video.mp4"); // this is working
                    ParcelFileDescriptor parcelFileDescriptor = ParcelFileDescriptor.fromSocket(socket);
                    FileDescriptor fd = parcelFileDescriptor.getFileDescriptor();
                      mMediaRecorder.setOutputFile(parcelFileDescriptor.getFileDescriptor());
                        mMediaRecorder.setVideoSize(displayMetrics.widthPixels, displayMetrics.heightPixels);
                        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                        mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
                        mMediaRecorder.setVideoFrameRate(1);
                        mMediaRecorder.prepare();

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e){
                    e.printStackTrace();
                }
这是我的日志-

04-22 15:26:30.954 11370-11370/com.portalD/AndroidRuntime: Shutting down VM
04-22 15:26:30.954 11370-11370/com.portalE/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.portal., PID: 11370
                                                                          java.lang.IllegalStateException
                                                                              at android.media.MediaRecorder._prepare(Native Method)
                                                                              at android.media.MediaRecorder.prepare(MediaRecorder.java:885)
                                                                              at com.porta.media.BCTCRecorder.initRecorder(BCTCRecorder.java:108)
                                                                              at com.portal.media.BCTCRecorder.<init>(BCTCRecorder.java:40)
                                                                              at com.portal.activity.BCTCSocketTestingActivity.initRecorder(BCTCSocketTestingActivity.java:110)
                                                                              at com.portal.activity.BCTCSocketTestingActivity.access$200(BCTCSocketTestingActivity.java:23)
                                                                              at com.portal.activity.BCTCSocketTestingActivity$4.run(BCTCSocketTestingActivity.java:100)
                                                                              at android.os.Handler.handleCallback(Handler.java:739)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:145)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6862)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at java.lang.reflect.Method.invoke(Method.java:372)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
04-22 15:26:30.954 11370-11370/com.portalD/AndroidRuntime:关闭虚拟机
04-22 15:26:30.954 11370-11370/com.portalE/AndroidRuntime:致命异常:main
进程:com.portal.,PID:11370
java.lang.IllegalStateException
在android.media.MediaRecorder.\u准备(本机方法)
在android.media.MediaRecorder.prepare(MediaRecorder.java:885)
位于com.porta.media.BCTCRecorder.initRecorder(BCTCRecorder.java:108)
位于com.portal.media.BCTCRecorder.(BCTCRecorder.java:40)
位于com.portal.activity.BCTCSocketTestingActivity.initRecorder(BCTCSocketTestingActivity.java:110)
在com.portal.activity.BCTCSocketTestingActivity.access$200(BCTCSocketTestingActivity.java:23)
位于com.portal.activity.BCTCSocketTestingActivity$4.run(BCTCSocketTestingActivity.java:100)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:145)
位于android.app.ActivityThread.main(ActivityThread.java:6862)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1404)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

Plz检查这个,我使用lollypop作为min sdk,上面的代码用于本地路径。当我将套接字路径设置为输出源时,它不起作用。您是如何解决这个难题的?我在这里面对的是同一头野兽。我的开始了。请帮忙!文件描述器仅适用于本地套接字服务器