Android MediaRecorder录制视频
【copy from Android MediaRecorder錄制視頻】
視頻錄制也可以通過 MediaRecorder 類完成,其步驟與音頻錄制基本相同,只是添加了一些對視頻進行處理的操作。
視頻錄制的基本步驟如下:
調用Camera.open()方法打開攝像頭。
調用 Camera.setPreviewDisplay() 連接預覽窗口
以便將從攝像頭獲取的圖像放置到預覽窗口中顯示出來。
調用 Camera.startPreview()啟動預覽
顯示攝像頭拍攝到的圖像。
使用 MediaRecorder 進行視頻錄制。
1.使用 Camera.unlock() 方法解鎖攝像頭,以使 MediaRecorder 獲得對攝像頭的使用權。
2.配置 MediaRecorder。
1)建立 MediaRecorder 類的對象,并設置音頻源和視頻源:
MediaRecorder recorder=new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);2)設置視頻的輸出和編碼格式。在 Android 2.2(API Level 8)以上版本的 SDK 中,可以直接調用 MediaRecorder.setProfile 方法進行相關配置:
recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));其中,MediaRecorder.setProfile() 方法為 Android 2.2(API Level 8)之后 MediaRecorder 類新提供的方法,通過 CamcorderProfile 對象可用于對 MediaRecorder 進行相關設置。
CamcorderProfile 為預先定義好的一組視頻錄制相關配置信息。
Android SDK 共定義了 14 種 CamcorderProfile 配置,如 CamcorderProfile. QUALITY_HIGH、CamcorderProfile. QUALITY_LOW、CamcorderProfile. QUALITY_TIME_LAPSE_1080P 等。其中,QUALITY_LOW 和 QUALITY_HIGH 兩種配置是所有的攝像頭都支持的,其他配置則根據硬件性能決定。
每一種配置都涉及文件輸出格式、視頻編碼格式、視頻比特率、視頻幀率、視頻的高和寬、音頻編碼格式、音頻的比特率、音頻采樣率和音頻錄制的通道數幾個方面。通過使用這些預定義配置能夠降低代碼復雜度,提高編碼效率。
3)設置錄制的視頻文件的保存位置及文件名:
MediaRecorder.setOutputFile(PATH_NAME);4)使用 MediaRecorder.setPreviewDisplay() 方法指定 MediaRecorder 的視頻預覽窗口。
需要注意的是,以上配置過程必須按照順序進行,否則會發生錯誤。
3.將錄像器置于準備狀態:
MediaRecorder.prepare();4.啟動錄像器
MediaRecorder.start();5.進行視頻錄制:
1.停止錄像器:
MediaRecorder.stop();2.重置錄像器的相關配置:
MediaRecorder.reset()3.釋放錄像器對象:
MediaRecorder.release();4.調用 Camera.lock() 方法鎖定攝像頭。從 Android N 開始,該調用也不再必需,除非 MediaRecorder.prepare() 方法失敗。
6) 調用Camera.stopPreview()方法停止預覽。
7) 調用Camera.release()方法釋放攝像頭 。
另外,在 Android N 系統下,Camera.unlock() 方法和 Camera.lock() 方法可由 Android 框架來完成。
實例 VideoRecorderDemo 演示了使用 MediaRecorder 進行視頻錄制的過程,該實例的運行效果如圖 1 所示。
實例 VideoRecorderDemo 使用的布局文件 main.xml 的內容如下:
其對應的資源文件 strings.xml 的內容如下:
<resources><string name="hello">使用MediaRecorder進行視頻錄制實例</string><string name="app_name">VideoRecorder</string><string name="opBtn">打開攝像頭</string><string name="play">錄制</string><string name="cloBtn">關閉攝像頭</string> </resources>由于實例 VideoRecorderDemo 中涉及音頻錄制、使用攝像頭、向 SD 卡寫文件等操作,因此需要在該工程的 AndroidManifest.xml 文件中聲明相應權限。該文件內容如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="introduction.android.mycamerademo"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="14" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-feature android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application> </manifest>實例 VideoRecorderDemo 的主 Activity 為 VideoRecorderDemoActivity,其代碼如下:
package introduction.android.mycamerademo; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.hardware.Camera.PictureCallback; import android.media.MediaRecorder; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity {private Button opbtn;private Button playbtn;private Button clobtn;private SurfaceView surfaceView;private SurfaceHolder surfaceHolder;private Camera camera;private MediaRecorder videoRecorder;private String myVideofilepath = "sdcard/myvideo.3gp";/*** Called when the activity is first created.*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);opbtn = (Button) this.findViewById(R.id.button1);playbtn = (Button) this.findViewById(R.id.button2);clobtn = (Button) this.findViewById(R.id.button3);videoRecorder = new MediaRecorder();surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView1);surfaceHolder = surfaceView.getHolder();surfaceHolder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i("camera", "surface destroyed.");surfaceHolder = null;stopRecording();releaseCamera();}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i("camera", "surface destroyed");surfaceHolder = holder;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// TODO Auto-generated method stubLog.i("camera", "surface changed.");surfaceHolder = holder;}});opbtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View argO) {// TODO Auto-generated method stubopenCamera();}});playbtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbenginRecording();}});clobtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstopRecording();}});}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();stopRecording();releaseCamera();}protected void stopRecording() {// TODO Auto-generated method stubLog.i("videoRecorder", "stopRecording...");if (videoRecorder != null) {videoRecorder.stop();videoRecorder.reset();videoRecorder.release();videoRecorder = null;camera.lock();}}private void releaseCamera() {if (camera != null) {camera.release();camera = null;}}protected void benginRecording() {Log.i("videoRecorder", "beginRecording");//給攝像頭解鎖camera.unlock();//MediaRecorder獲取到攝像頭的訪問權videoRecorder.setCamera(camera);//設置視頻錄制過程中所錄制的音頻來自手機的麥克風videoRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//設置視頻源為攝像頭videoRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//設置視頻錄制的輸出文件為3gp文件videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設置音頻編碼方式為AACvideoRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//設置錄制的視頻編碼為H.264videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);videoRecorder.setVideoSize(176, 144);videoRecorder.setVideoFrameRate(20);if (!checkSDCard()) {Log.e("videoRecorder", "未找到SD卡!");return;}videoRecorder.setOutputFile(myVideofilepath);videoRecorder.setPreviewDisplay(surfaceHolder.getSurface());try {videoRecorder.prepare();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}videoRecorder.start();}private void openCamera() {// TODO Auto-generated method stubLog.i("videoRecorder", "openCamera.");try {camera = Camera.open(); // attempt to get a Camera instance} catch (Exception e) {// Camera is not available (in use or does not exist)Log.e("camera", "open camera error!");e.printStackTrace();return;}try {camera.setPreviewDisplay(surfaceHolder);} catch (IOException e) {// TODO Auto-generated catch blockLog.e("camera", "preview failed.");e.printStackTrace();}camera.startPreview();}private boolean checkSDCard() {// 判斷SD存儲卡是否存在if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {return true;} else {return false;}} }該實例中,在對 MediaRecorder 進行設置時,沒有使用:
videoRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));而是使用以下代碼對 MediaRecorder 進行設置:
//設置視頻錄制的輸出文件為3gp文件 videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //設置音頻編碼方式為AAC videoRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //設置錄制的視頻編碼為H.264 videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //設置視頻錄制的分辨率,必須放在設置編碼和格式的后面,否則報錯 videoRecorder.setVideoSize(176, 144); //設置錄制的視頻的視頻幀率,必須放在設置編碼和格式的后面,否則報錯 videoRecorder.setVideoFrameRate(20);總結
以上是生活随笔為你收集整理的Android MediaRecorder录制视频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Access数据库修复 压缩
- 下一篇: android sina oauth2.