[android-developers] Re: how to initialize MediaRecorder in the background?

2012-08-14 Thread jsmith
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?

2012-08-14 Thread Pent
 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?

2009-08-06 Thread 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
-~--~~~~--~~--~--~---