您的位置:首页 > 移动开发 > Android开发

android camera MediaRecoder调用顺序

2015-10-16 09:41 441 查看
获取图像

  一旦你建立了预览类和显示预览类的viewlayout,你就已准备好开始使用你的应用获取图像了.在你的应用代码中,你还必须要建立起那些用于控制的控件们的侦听器,来响应用户的动作.

 

  要取得图像,使用Camera.takePicture()方法.此方法有三个参数.要获得JPEG图像,你必须实现一个Camera.PictureCallback接口来接收图像数据然后写入文件中.下面的代码演示了最基本的Camera.PictureCallback接口的实现.

[java]

private PictureCallback mPicture = new PictureCallback() { 

    @Override 

    public void onPictureTaken(byte[] data, Camera camera) { 

 

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 

        if (pictureFile == null){ 

            Log.d(TAG, "Error creating media file, check storage permissions: " + 

                e.getMessage()); 

            return; 

        } 

 

        try { 

            FileOutputStream fos = new FileOutputStream(pictureFile); 

            fos.write(data); 

            fos.close(); 

        } catch (FileNotFoundException e) { 

            Log.d(TAG, "File not found: " + e.getMessage()); 

        } catch (IOException e) { 

            Log.d(TAG, "Error accessing file: " + e.getMessage()); 

        } 

    } 

}; 

private PictureCallback mPicture = new PictureCallback() {

    @Override

    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);

        if (pictureFile == null){

            Log.d(TAG, "Error creating media file, check storage permissions: " +

                e.getMessage());

            return;

        }

        try {

            FileOutputStream fos = new FileOutputStream(pictureFile);

            fos.write(data);

            fos.close();

        } catch (FileNotFoundException e) {

            Log.d(TAG, "File not found: " + e.getMessage());

        } catch (IOException e) {

            Log.d(TAG, "Error accessing file: " + e.getMessage());

        }

    }

};

通过调用Camera.takePicture()方法触发图像获取事件.下面的代码演示了如了在一个按钮的View.OnClickListener方法中调用此方法.

[java]

// 为获取按钮增加一个listener  

Button captureButton = (Button) findViewById(id.button_capture); 

captureButton.setOnClickListener( 

    new View.OnClickListener() { 

        @Override 

        public void onClick(View v) { 

            // 从相机获取图像  

            mCamera.takePicture(null, null, mPicture); 

        } 

    } 

); 

// 为获取按钮增加一个listener

Button captureButton = (Button) findViewById(id.button_capture);

captureButton.setOnClickListener(

    new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            // 从相机获取图像

            mCamera.takePicture(null, null, mPicture);

        }

    }

);

注:mPicture成员引用自"使用相机"一节的同名成员变量.

 

注意:记注在用完时要使用Camera.release()来释放相机对象!关于如何释放相机,见"释放相机"一节.

 

获取视频

下面这些配置给MediaRecorder的视频录制参数被置为默认值.然而,你可以自己设置这些配置项的值:

setVideoEncodingBitRate()

setVideoSize()

setVideoFrameRate()

setAudioEncodingBitRate()

setAudioChannels()

setAudioSamplingRate()

  使用android框架获取视频需要小心管理相机对象并且与MediaRecorder类做好协调.当使用相机进行录像时,你必须管理好Camera.lock()和Camera.unlock()两个调用以允许MediaRecorder操作相机.

  注:从Android4.0 (API level 14)开始,Camera.lock()和Camera.unlock()调用会自动管理.

 

  与从像机获取图像不一样,获取视频需要一个十挑剔的调用顺序.你必须按照特殊的顺序才能成功的准备并获取视频,如下所示:

打开相机 –使用Camera.open()来获取一个相机对象的实例.

连接预览 -通过Camera.setPreviewDisplay()连接一个SurfaceView到相机来准备一个实时预览.

开始预览 –调用Camera.startPreview()来显示实时图像.

开始录制视频 –下面的步骤必须完整的执行才能成功的录制视频:

Unlock相机– 调用Camera.unlock()来Unlock相机以供MediaRecorder使用.

配置MediaRecorder– 按以下顺序调用MediaRecorder的方法.更多知识请参考MediaRecorder参考文档.

setCamera()- 设置视频获取所使用的相机,使用你的应用的当前的相机实例.

setAudioSource()- 设置音频source,使用MediaRecorder.AudioSource.CAMCORDER.

setVideoSource()- 设置视频source,使用MediaRecorder.VideoSource.CAMERA.

设置视频输出的格式和编码.对于Android2.2 (API Level8)及更高版本,使用MediaRecorder.setProfile方法,使用CamcorderProfile.get()来获得一个profile.对于之前的版本,你必须用参数来设置视频输出格式和编码:

setOutputFormat()- 设置输出格式,指定为默认的或MediaRecorder.OutputFormat.MPEG_4.

setAudioEncoder()- 设置音频编码类型,指定为默认的或MediaRecorder.AudioEncoder.AMR_NB.

setVideoEncoder()- 设置视频编码类型,指定为默认的或MediaRecorder.VideoEncoder.MPEG_4_SP.

setOutputFile()-指定输出文件,使用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString(),这个方法是"保存媒体文件"一节(在后面)中的例子代码.

setPreviewDisplay()- 为你的应用指定SurfaceView预览layout元素,使用在连接预览时指定的相同对象.

  注意:你必须按上面的顺序调用MediaRecorder的配置方法们,否则你的应用将遇到悲剧从而失败.

准备MediaRecorder- 准备MediaRecorder,主要是通过调用配置方法MediaRecorder.prepare().

开始MediaRecorder- 调用MediaRecorder.start()开始录制视频.

停止录制视频 –依次调用下面的方法,才能成功结束一个视频录制过程:

停止MediaRecorder– 调用MediaRecorder.stop()停止录制视频.

重置MediaRecorder– 可选的,调用MediaRecorder.reset()可以将以前的配置取消.

释放MediaRecorder– 调用MediaRecorder.release()来释放MediaRecorder.

锁住相机 -调用Camera.lock()锁住相机以使后面的MediaRecorder会话也可以使用相机.从Android4.0 (API level 14)开始,此调用仅在MediaRecorder.prepare()调用失败时才需要.

停止预览 –当你的activity完成了对相机的使用,使用Camera.stopPreview()停止预览.

释放相机- 调用Camera.release()释放相机,以使其它应用也可使用它.

 

  注:不创建相机预览并且略过前几步也是可以使用MediaRecorder.然而,用户一般还是想看预览的,所以此处不讨论这种情况.

  技巧:如果你的应用是专为录像写的,那么在启动你的预览之前调用setRecordingHint(boolean)并传入true,这样可以帮你减少启动录制的时间.

配置MediaRecorder

 

  当使用MediaRecorder类来录制视频,你必须按特定步骤执行配置过程,然后调用MediaRecorder.prepare()方法来检查并实现所给予的配置.下面的例子代码演示了如何为视频录制正确的配置并准备MediaRecorder类.

[java] 

private boolean prepareVideoRecorder(){ 

    mCamera = getCameraInstance(); 

    mMediaRecorder = new MediaRecorder(); 

 

    // Step 1: 解锁相机并设置给MediaRecorder  

    mCamera.unlock(); 

    mMediaRecorder.setCamera(mCamera); 

 

    // Step 2: 设置sources  

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 

    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

 

    // Step 3: 设置一个CamcorderProfile (在API Level 8或更高版本中)  

    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

 

    // Step 4: 设置输出文件  

    mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 

 

    // Step 5: 设置预览输出  

    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 

 

    // Step 6: 准备配置MediaRecorder  

    try { 

        mMediaRecorder.prepare(); 

    } catch (IllegalStateException e) { 

        Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 

        releaseMediaRecorder(); 

        return false; 

    } catch (IOException e) { 

        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage()); 

        releaseMediaRecorder(); 

        return false; 

    } 

    return true; 



private boolean prepareVideoRecorder(){

    mCamera = getCameraInstance();

    mMediaRecorder = new MediaRecorder();

    // Step 1: 解锁相机并设置给MediaRecorder

    mCamera.unlock();

    mMediaRecorder.setCamera(mCamera);

    // Step 2: 设置sources

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: 设置一个CamcorderProfile (在API Level 8或更高版本中)

    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    // Step 4: 设置输出文件

    mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

    // Step 5: 设置预览输出

    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // Step 6: 准备配置MediaRecorder

    try {

        mMediaRecorder.prepare();

    } catch (IllegalStateException e) {

        Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());

        releaseMediaRecorder();

        return false;

    } catch (IOException e) {

        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());

        releaseMediaRecorder();

        return false;

    }

    return true;

}

在Android2.2 (API Level8)之前,你必须直接设置输出格式和编码格式等参数,而不是使用CamcorderProfile.可以像下面这样做:

 

[java]

// Step 3: 设置输出格式和编码(for versions prior to API Level 8)  

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 

    // Step 3: 设置输出格式和编码(for versions prior to API Level 8)

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

下面这些配置给MediaRecorder 的视频录制参数被置为默认值.然而,你可以自己设置这些配置项的值:

· setVideoEncodingBitRate()

· setVideoSize()

· setVideoFrameRate()

· setAudioEncodingBitRate()

· setAudioChannels()

· setAudioSamplingRate()

 

开始和停止MediaRecorder

  当使用MediaRecorder开始和停止录像时,你必须按特定的顺序进行调用,如下所列:

· 使用Camera.unlock()解锁相机

· 按上面代码所演示的配置MediaRecorder

· MediaRecorder.start()开始录像

· 录制视频

· 使用MediaRecorder.stop()停止录像

· 用MediaRecorder.release()释放MediaRecorder

· 用Camera.lock()锁住相机 www.2cto.com

 

下面的示例代码演示如何通过一个按钮来使用相机和MediaRecorder类正确的开始和停止视频录制

注:当完成一个视频录制,不要释放相机,否则你的预览将被迫停止.

 

[java]

private boolean isRecording = false; 

 

// 向录像按钮增加监听器  

Button captureButton = (Button) findViewById(id.button_capture); 

captureButton.setOnClickListener( 

    new View.OnClickListener() { 

        @Override 

        public void onClick(View v) { 

            if (isRecording) { 

                // 停止录像并释放 MediaRecorder  

                mMediaRecorder.stop();  // stop the recording  

                releaseMediaRecorder(); // release the MediaRecorder object  

                mCamera.lock();         // take camera access back from MediaRecorder  

 

                // inform the user that recording has stopped  

                setCaptureButtonText("Capture"); 

                isRecording = false; 

            } else { 

                // 初始化视频相机  

                if (prepareVideoRecorder()) { 

                    // 相几解锁,MediaRecorder 已准备好.现在可以开始录像了  

                    mMediaRecorder.start(); 

 

                    // inform the user that recording has started  

                    setCaptureButtonText("Stop"); 

                    isRecording = true; 

                } else { 

                    // 准备过程失败,释放相机  

                    releaseMediaRecorder(); 

                    // inform user  

                } 

            } 

        } 

    } 

); 

private boolean isRecording = false;

// 向录像按钮增加监听器

Button captureButton = (Button) findViewById(id.button_capture);

captureButton.setOnClickListener(

    new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            if (isRecording) {

                // 停止录像并释放 MediaRecorder

                mMediaRecorder.stop();  // stop the recording

                releaseMediaRecorder(); // release the MediaRecorder object

                mCamera.lock();         // take camera access back from MediaRecorder

                // inform the user that recording has stopped

                setCaptureButtonText("Capture");

                isRecording = false;

            } else {

                // 初始化视频相机

                if (prepareVideoRecorder()) {

                    // 相几解锁,MediaRecorder 已准备好.现在可以开始录像了

                    mMediaRecorder.start();

                    // inform the user that recording has started

                    setCaptureButtonText("Stop");

                    isRecording = true;

                } else {

                    // 准备过程失败,释放相机

                    releaseMediaRecorder();

                    // inform user

                }

            }

        }

    }

);

 

注:在上例中,prepareVideoRecorder()方法引用自例子"配置MediaRecorder".此方法解锁相机配置并准备MediaRecorder实例.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android