[android-developers] Re: how to initialize MediaRecorder in the background?
Dear Robert, have you found solution for this issue? I have the same problem now... четверг, 6 августа 2009 г., 17:22:24 UTC+3 пользователь Robert написал: I tried various things to overcome the limitation of setPreviewDisplay (): - preserved the surface (sf), so mSurfaceHolder.getSurface() was not called again. Worked fine while the surface was visible, but once it was destroyed, sf.isValid() returned false, and prepare() failed again - tried to use the other 3 types of SURFACE_TYPE_*. Preview was not working, but video was being captured, until it needed to be initialized again, when prepare() failed - with these other 3 types of surface, I tried mSurfaceHolder.lockCanvas(), sf.lockCanvas(dirtyrect) and sf.freeze() in an attempt to keep the surface being destroyed Nothing has worked as expected :( Is there a way to keep a valid surface when the view is pushed to the background? Or, make setPreviewDisplay() accept a dummy surface? Thanks, Robert On Aug 5, 1:10 pm, Robert ferob...@gmail.com wrote: Hello all, I am building a camera app, where photos and videos are continuously being captured and saved to the SD card. The videos are short (few minutes), and their length are preset with setMaxDuration(). When MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED is reached, the video is saved, and a new sequence is initialized with something like: mMediaRecorder = new MediaRecorder(); mMediaRecorder.setVideoSource (MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat (MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setVideoFrameRate(20); mMediaRecorder.setVideoSize(176, 144); mMediaRecorder.setVideoEncoder (MediaRecorder.VideoEncoder.H263); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); mMediaRecorder.setMaxDuration(1000 * Integer.valueOf (videoLength)); mMediaRecorder.setOnInfoListener(videoInfoListener); mMediaRecorder.setOutputFile(/sdcard/test.3gp); mMediaRecorder.prepare(); mMediaRecorder.start(); I also have a SurfaceHolder mSurfaceHolder, set up like: mPreview = (SurfaceView) findViewById(R.id.preview); mSurfaceHolder = mPreview.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); public void surfaceCreated(SurfaceHolder holder) { mSurfaceHolder = holder; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { } public void surfaceDestroyed(SurfaceHolder holder) { mSurfaceHolder = null; } The whole process works fine, while the main activity is in the foreground. But, when I go to another activity (e.g. settings), the video recording works in the background only until max duration is reached. The file is saved, but a new sequence can not be started because prepare() fails. setPreviewDisplay() needs to be there, but it doesn't like not having a proper surface to attach to. I tried to use a dummy Surface, a dummy SurfaceHolder, or reuse the Camera with mMediaRecorder.setCamera(), but nothing works. Is there a way to initialize MediaRecorder in the background? Thanks and regards, Robert -- You received this message because you are subscribed to the Google Groups Android Developers group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
[android-developers] Re: how to initialize MediaRecorder in the background?
I have the same problem now... Ditto, except a year ago. We know you have the answer. Spill the beans Robert :-) Pent -- You received this message because you are subscribed to the Google Groups Android Developers group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
[android-developers] Re: how to initialize MediaRecorder in the background?
I tried various things to overcome the limitation of setPreviewDisplay (): - preserved the surface (sf), so mSurfaceHolder.getSurface() was not called again. Worked fine while the surface was visible, but once it was destroyed, sf.isValid() returned false, and prepare() failed again - tried to use the other 3 types of SURFACE_TYPE_*. Preview was not working, but video was being captured, until it needed to be initialized again, when prepare() failed - with these other 3 types of surface, I tried mSurfaceHolder.lockCanvas(), sf.lockCanvas(dirtyrect) and sf.freeze() in an attempt to keep the surface being destroyed Nothing has worked as expected :( Is there a way to keep a valid surface when the view is pushed to the background? Or, make setPreviewDisplay() accept a dummy surface? Thanks, Robert On Aug 5, 1:10 pm, Robert ferob...@gmail.com wrote: Hello all, I am building a camera app, where photos and videos are continuously being captured and saved to the SD card. The videos are short (few minutes), and their length are preset with setMaxDuration(). When MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED is reached, the video is saved, and a new sequence is initialized with something like: mMediaRecorder = new MediaRecorder(); mMediaRecorder.setVideoSource (MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat (MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setVideoFrameRate(20); mMediaRecorder.setVideoSize(176, 144); mMediaRecorder.setVideoEncoder (MediaRecorder.VideoEncoder.H263); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); mMediaRecorder.setMaxDuration(1000 * Integer.valueOf (videoLength)); mMediaRecorder.setOnInfoListener(videoInfoListener); mMediaRecorder.setOutputFile(/sdcard/test.3gp); mMediaRecorder.prepare(); mMediaRecorder.start(); I also have a SurfaceHolder mSurfaceHolder, set up like: mPreview = (SurfaceView) findViewById(R.id.preview); mSurfaceHolder = mPreview.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); public void surfaceCreated(SurfaceHolder holder) { mSurfaceHolder = holder; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { } public void surfaceDestroyed(SurfaceHolder holder) { mSurfaceHolder = null; } The whole process works fine, while the main activity is in the foreground. But, when I go to another activity (e.g. settings), the video recording works in the background only until max duration is reached. The file is saved, but a new sequence can not be started because prepare() fails. setPreviewDisplay() needs to be there, but it doesn't like not having a proper surface to attach to. I tried to use a dummy Surface, a dummy SurfaceHolder, or reuse the Camera with mMediaRecorder.setCamera(), but nothing works. Is there a way to initialize MediaRecorder in the background? Thanks and regards, Robert --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Android Developers group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---