0

我正在开发一个应用程序,我需要在我的应用程序中运行恒定的相机所以我有两件事要在这里实现,1. 捕获图像 2. 录制视频

我在录制视频以及停止和重置相机时遇到困难

以下是我的代码片段:-

import java.io.File;
import java.io.IOException;
import java.util.Date;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnInfoListener;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.Menu;
import android.view.SurfaceView;
import android.widget.Toast;

public class Myvideo1 extends Activity  implements SurfaceHolder.Callback {

    @Override
    protected void onDestroy() {
     //   stopRecording();
        super.onDestroy();
    }

    private SurfaceHolder surfaceHolder;
    private SurfaceView surfaceView;
    public MediaRecorder mrec = new MediaRecorder();    
    private Camera mCamera;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        surfaceView = (SurfaceView) findViewById(R.id.videoview);
   //     if(mCamera==null)
    //        mCamera = Camera.open();

        // Please maintain sequence of following code. 

        // If you change sequence it will not work.

        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        try {
            startRecording();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {

        menu.add(0, 0, 0, "Start");
        return super.onCreateOptionsMenu(menu);
    }

    @Override
   public boolean onOptionsItemSelected(MenuItem item)

    {
        if(item.getTitle().equals("Start"))
        {
            try {

                startRecording();
            //    item.setTitle("Stop");

            } catch (Exception e) {

                String message = e.getMessage();
                Log.i(null, "Problem " + message);
                mrec.release();
            }
        }

        else
        //  if(item.getTitle().equals("Stop"))
        {
          //  mrec.stop();
         //   mrec.release();
         //   mrec = null;
          //  item.setTitle("Start");
        }

        return super.onOptionsItemSelected(item);
    }

    protected void startRecording() throws IOException
    {
        if(mCamera==null)
            mCamera = Camera.open();

         String filename;
         String path;

         path= Environment.getExternalStorageDirectory().getAbsolutePath().toString();

         Date date=new Date();
         filename="/rec"+date.toString().replace(" ", "_").replace(":", "_")+".mp4";

         //create empty file it must use
         File file=new File(path,filename);

        mrec = new MediaRecorder(); 

        mCamera.lock();
        mCamera.unlock();

        // Please maintain sequence of following code. 

        // If you change sequence it will not work.
        mrec.setCamera(mCamera);    
        mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mrec.setAudioSource(MediaRecorder.AudioSource.MIC);     
        mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mrec.setPreviewDisplay(surfaceHolder.getSurface());
        mrec.setOutputFile(path+filename);
        mrec.setMaxDuration(10000);     //10 sec



  //  }


    mrec.setOnInfoListener(new OnInfoListener() {   
        @Override  
        public void onInfo(MediaRecorder mr, int what, int extra) {  
            if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {   
                onStop();    

                Toast.makeText(getApplicationContext(), "video of 10 sec is completed", Toast.LENGTH_SHORT).show();

            }  
        }
    }
    ); 

    }


    public void preparerec()
    {
         try {
            mrec.prepare();
            mCamera.setPreviewDisplay(this.surfaceHolder);
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void startrec()
    {
         mrec.start();
    }





    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {      

        Camera.Parameters parameters = mCamera.getParameters();      
        parameters.setPreviewSize(width, height);     
        mCamera.setParameters(parameters);       
        mCamera.startPreview(); 


    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {       

       /* if (mCamera != null) {
            Parameters params = mCamera.getParameters();
            mCamera.setParameters(params);

            Log.i("Surface", "Created");
        }
        else {
            Toast.makeText(getApplicationContext(), "Camera not available!",
                    Toast.LENGTH_LONG).show();

            finish();
        }*/


         try                 {      
             //Open the Camera in preview mode            
            mCamera = Camera.open(); 
            preparerec();
            //        
             }              
         catch(Exception ioe)          
             {          
             ioe.printStackTrace(System.out);          
             } 

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();       

    }


    public void onStop(){
        mrec.stop();
        mrec.release();
        mrec = null;
     //   item.setTitle("Start");
    }


}

当我开始录制时,三星 Galaxy s2 上的屏幕会闪烁并变绿,有什么解决方案吗?

4

2 回答 2

0

您将在 onCreate(在 startRecording 中 - 始终在 surfaceCreated 之前运行)和 surfaceCreated 中创建相机对象。只打开一次相机;第二次会抛出异常。

我建议您在用户点击按钮时将您的录制代码全部运行;您已经将设置工作拆分为 2-3 个方法,这些方法都在不同的时间触发,并且您假设了很多关于它们被调用的顺序。

如果您需要在应用程序启动时立即开始录制,我建议让每个回调检查是否所有其他回调都已完成,然后启动录制。

于 2012-09-15T22:39:58.657 回答
0

这个解决方案非常适合我。

于 2012-09-18T04:15:37.310 回答