【问题标题】:How I can have previewing permanently when capture video for android?为 android 捕获视频时如何永久预览?
【发布时间】:2013-12-02 14:25:49
【问题描述】:

我正在为 Android 编写视频捕获应用程序。我有第一次想要捕捉的预览。但是按停止后,当我再次开始录制时,我不再获得预览。如何永久拥有预览选项?

protected void startRecording() throws IOException 
{
String state = android.os.Environment.getExternalStorageState();
if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) 
{
    throw new IOException("SD Card is not mounted.  It is " + state + ".");
}

// make sure the directory we plan to store the recording in exists
File directory = new File(this.Videopath).getParentFile();

if (!directory.exists() && !directory.mkdirs()) 
{
    throw new IOException("Path to file could not be created.");
}

 mCamera.stopPreview();
 mCamera.unlock();
 mrec = new MediaRecorder();  // Works well
 mrec.setCamera(mCamera);   
 mrec.setAudioSource(MediaRecorder.AudioSource.MIC);
 mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
 mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
 mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
 mrec.setOutputFile(Videopath);
 mrec.setPreviewDisplay(surfaceHolder.getSurface());   
 mrec.prepare();
 isRecording=true;
 mrec.start();
}
//-------------------------------------------------------------
protected void stopRecording() 
{
    if(mrec !=null)
        mrec.stop();
    releaseMediaRecorder();
    isRecording=false;
}
//-------------------------------------------------------------
private void releaseMediaRecorder()
{
    if (mrec != null) 
    {
        mrec.reset();   // clear recorder configuration
        mrec.release(); // release the recorder object
        mrec = null;
        mCamera.lock();           // lock camera for later use
    }
}
//-------------------------------------------------------------
private void releaseCamera()
{
    if (mCamera != null)
    {
        mCamera.release();        // release the camera for other applications
        mCamera = null;
    }
}
//-------------------------------------------------------------
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) 
{
     try {
            mCamera .setPreviewDisplay(holder);
        } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       mCamera .startPreview();  
}
 //-------------------------------------------------------------
@Override
public void surfaceCreated(SurfaceHolder holder) 
{
    if (mCamera != null)
       {
          Parameters params = mCamera.getParameters();
          mCamera.setParameters(params);
          mCamera.setDisplayOrientation(90);
          try {
            mCamera .setPreviewDisplay(holder);
        } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          mCamera .startPreview();

       }
       else
       {
          Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show();
         VideoRecorderActivity.this.finish();
       }


}
 //-------------------------------------------------------------
@Override
public void surfaceDestroyed(SurfaceHolder holder) 
{


}

【问题讨论】:

  • 为什么要投反对票????哦?
  • 我搜索但无法解决任何问题。
  • 你看过stackoverflow.com/questions/7099032/… 吗?此外,您的完整 LogCat 错误可能会有所帮助。
  • 您的设备上运行的 Android 的 API / 版本是什么?
  • 在 API 级别 14 之前,您不能在预览处于活动状态时调用 setDisplayOrientation。您在 surfaceCreated 中开始预览,但此时不要设置 previewing = true (我认为您应该这样做)。我的猜测是您随后输入了 surfaceChanged,因此,在调用该方法之前不要停止预览。如果进行该更改有效,我会将其发布为答案。

标签: android orientation video-capture


【解决方案1】:

按下停止录制后,您可以播放录制的视频,或者如果您想重新开始预览,请在您的停止录制方法中执行以下操作:

 protected void stopRecording() 
{
if(mrec !=null)
 try{
     mrec.stop();

    }catch(IllegalStateException e)
    {
   Log.e(TAG,"Got illegal ");

   }
 releaseRecorder();
 releaseCamera();
 isRecording=false;

 /*Here do the same process which you do while creating the preview i.e initilize the camera and create the preview */

  mCamera = Camera.open();
  camera.lock();    
  surfaceHolder = surfaceView.getHolder();
  surfaceHolder.addCallback(this); 
 try{
                mCamera .setPreviewDisplay(holder);
                mCamera .startPreview();
        }catch(IOException e)
        {
                Log.v(TAG,"could not start the preview ");
                e.printStackTrace();

        }            

}

// release the recorder after recording
    private void releaseRecorder() {
            if( mrec!=null){
             Log.v(TAG, "recorder released");
               mrec.release();
               mrec=null;
            }

    }
    // release the camera after recording
    private void releaseCamera() {
            if(mcamera!=null){
                    try{
                            mcamera.reconnect();

                    }catch(IOException e){
                            e.printStackTrace();
                    }
                    Log.v(TAG, "camera released");
                    mcamera.release();
                    mcamera=null;
            }

【讨论】:

  • 因为当你停止录制时,你同时释放了录像机和相机,所以如果你想重新开始预览,你必须重新初始化相机并开始预览。
  • 我建议在您按下停止录制后,播放录制的视频并再放一个用于重录的按钮,即再次录制。
  • 但我正在与您交谈,首先在活动的 oncreate 中初始化此代码。此 dosnt 之后会出现任何错误吗?mCamera = Camera.open(); surfaceView = (SurfaceView) findViewById(R.id.surface_camera); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  • 是的,你可以在 oncreate 中初始化这段代码,那有什么问题呢?
  • 嗨。如果可能,请查看此链接。它是为我准备的,关于捕获视频。stackoverflow.com/questions/20898733/… 谢谢。
猜你喜欢
  • 2018-04-17
  • 2020-04-06
  • 2021-09-27
  • 2016-01-16
  • 2014-11-06
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多