android 多媒体和相机详解八

获取图像

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


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

  1. private PictureCallback mPicture = new PictureCallback() { 
  2.     @Override 
  3.     public void onPictureTaken(byte[] data, Camera camera) { 
  4.  
  5.         File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
  6.         if (pictureFile == null){ 
  7.             Log.d(TAG, "Error creating media file, check storage permissions: "
  8.                 e.getMessage()); 
  9.             return
  10.         } 
  11.  
  12.         try
  13.             FileOutputStream fos = new FileOutputStream(pictureFile); 
  14.             fos.write(data); 
  15.             fos.close(); 
  16.         } catch (FileNotFoundException e) { 
  17.             Log.d(TAG, "File not found: " + e.getMessage()); 
  18.         } catch (IOException e) { 
  19.             Log.d(TAG, "Error accessing file: " + e.getMessage()); 
  20.         } 
  21.     } 
  22. }; 

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

  1. // 为获取按钮增加一个listener 
  2. Button captureButton = (Button) findViewById(id.button_capture); 
  3. captureButton.setOnClickListener( 
  4.     new View.OnClickListener() { 
  5.         @Override 
  6.         public void onClick(View v) { 
  7.             // 从相机获取图像 
  8.             mCamera.takePicture(null, null, mPicture); 
  9.         } 
  10.     } 
  11. ); 

注: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类.

  1. private boolean prepareVideoRecorder(){ 
  2.     mCamera = getCameraInstance(); 
  3.     mMediaRecorder = new MediaRecorder(); 
  4.  
  5.     // Step 1: 解锁相机并设置给MediaRecorder 
  6.     mCamera.unlock(); 
  7.     mMediaRecorder.setCamera(mCamera); 
  8.  
  9.     // Step 2: 设置sources 
  10.     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
  11.     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
  12.  
  13.     // Step 3: 设置一个CamcorderProfile (在API Level 8或更高版本中) 
  14.     mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 
  15.  
  16.     // Step 4: 设置输出文件 
  17.     mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 
  18.  
  19.     // Step 5: 设置预览输出 
  20.     mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 
  21.  
  22.     // Step 6: 准备配置MediaRecorder 
  23.     try
  24.         mMediaRecorder.prepare(); 
  25.     } catch (IllegalStateException e) { 
  26.         Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 
  27.         releaseMediaRecorder(); 
  28.         return false
  29.     } catch (IOException e) { 
  30.         Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage()); 
  31.         releaseMediaRecorder(); 
  32.         return false
  33.     } 
  34.     return true

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

  1. // Step 3: 设置输出格式和编码(for versions prior to API Level 8) 
  2. mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
  3. mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
  4. mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 

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

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

  1. private boolean isRecording = false
  2.  
  3. // 向录像按钮增加监听器 
  4. Button captureButton = (Button) findViewById(id.button_capture); 
  5. captureButton.setOnClickListener( 
  6.     new View.OnClickListener() { 
  7.         @Override 
  8.         public void onClick(View v) { 
  9.             if (isRecording) { 
  10.                 // 停止录像并释放 MediaRecorder 
  11.                 mMediaRecorder.stop();  // stop the recording 
  12.                 releaseMediaRecorder(); // release the MediaRecorder object 
  13.                 mCamera.lock();         // take camera access back from MediaRecorder 
  14.  
  15.                 // inform the user that recording has stopped 
  16.                 setCaptureButtonText("Capture"); 
  17.                 isRecording = false
  18.             } else
  19.                 // 初始化视频相机 
  20.                 if (prepareVideoRecorder()) { 
  21.                     // 相几解锁,MediaRecorder 已准备好.现在可以开始录像了 
  22.                     mMediaRecorder.start(); 
  23.  
  24.                     // inform the user that recording has started 
  25.                     setCaptureButtonText("Stop"); 
  26.                     isRecording = true
  27.                 } else
  28.                     // 准备过程失败,释放相机 
  29.                     releaseMediaRecorder(); 
  30.                     // inform user 
  31.                 } 
  32.             } 
  33.         } 
  34.     } 
  35. ); 

:在上例中,prepareVideoRecorder()方法引用自例子"配置MediaRecorder".此方法解锁相机配置并准备MediaRecorder实例.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值