2

I am using Media Recorder to record the device screen. If I am providing the local path as output source then media recorder is working fine but if I am giving file descriptor obtained from parcelFileDescriptor.fromSocket(socket) then I am getting Illegal state exception on mediaRecorder.prepare().

Here is my initialization code for media recorder -

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

Here is my logcat -

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)
Ishan
  • 1,172
  • 10
  • 25
  • Plz check this http://stackoverflow.com/questions/19875845/android-mediarecorder-start-throw-illegalstateexception – you_c Apr 22 '16 at 11:10
  • I am using lollypop as min sdk and above code is working for local path. It is not working when I set socket path as output source. – Ishan Apr 22 '16 at 11:27
  • How did you solve this conundrum? I'm facing the same beast here. Mine is on start. Please help! – Mazolo Sep 07 '17 at 12:25
  • file discriptor only works for local socket server – Ishan Sep 10 '17 at 09:59

0 Answers0