一,自定義錄制
1.首先使用到的類
MediaRecorder 這是實作視訊錄制的類,同時也可以實作音頻錄制
SurfaceView ,SurfaceView是視圖(View)的繼承類,這個視圖裡内嵌了一個專門用于繪制的Surface。你可以控制這個Surface的格式和尺寸。Surfaceview控制這個Surface的繪制位置。這個控件用于顯示錄制視訊的控件,相當于錄制的時候的預覽
SurfaceHolder surface的控制器,用來操縱surface,處理它的Canvas上畫的效果和動畫,控制表面,大小,像素等。
2. 開始錄制
1.首先在布局檔案中 添加SurfaceView 控件 再添加一個開始按鈕,一個結束按鈕
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</SurfaceView>
2. 查找到SurfaceView 控件 擷取 SurfaceHolder
SurfaceHolder holder = surfaceview.getHolder();// 取得holder
holder.addCallback(this); // holder加入回調接口 給SurfaceView目前的持有者一個回調對象。 需要實作其方法,匿名内部類也可以
// setType必須設定,要不出錯.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//注釋-----解釋----
SURFACE_TYPE_NORMAL:用RAM緩存原生資料的普通Surface
SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬體加速的Surface
SURFACE_TYPE_GPU:适用于GPU加速的Surface
SURFACE_TYPE_PUSH_BUFFERS:表明該Surface不包含原生資料,Surface用到的資料由其他對象提供,在Camera圖像預覽中就使用該類型的Surface,有 Camera 負責提供給預覽Surface資料,這樣圖像預覽會比較流暢。如果設定這種類型則就不能調用lockCanvas來擷取Canvas對象了。
雖然setType()方法已經被聲明deprecated,但是必要的時候還是設定下比較好。
3.給開始按鈕添加監聽事件
mediarecorder = new MediaRecorder();// 建立mediarecorder對象
mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 錄音源為麥克風
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 設定錄制視訊源為Camera(相機)
mediarecorder .setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 設定錄制完成後視訊的封裝格式THREE_GPP為3gp.MPEG_4為mp4
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 設定錄制的視訊編碼h263 h264
mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 設定視訊錄制的分辨率。必須放在設定編碼和格式的後面,否則報錯
mediarecorder.setVideoSize(176, 144); // 設定錄制的視訊幀率。必須放在設定編碼和格式的後面,否則報錯
mediarecorder.setVideoFrameRate(20);//設定逐幀率
mediarecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 将視訊 設定預覽 的surface
mediarecorder .setAudioEncodingBitRate( 256 * 1024 );// 128K
File folder = FileUtils.getMediaRecorderFolder(this); // 4. 設定錄音要儲存的位置 自定義的檔案儲存類 用于存儲檔案
File targetFile = new File(folder, "vedio" + System.currentTimeMillis() + ".3gp");
mediarecorder.setOutputFile(targetFile.getAbsolutePath());
try {
mediarecorder.prepare();// 準備錄制
mediarecorder.start();// 開始錄制
} catch (IllegalStateException e) {
e.printStackTrace(); // TODO Auto-generated catch block
} catch (IOException e) {
e.printStackTrace(); // TODO Auto-generated catch block
}
3. 實作其回調接口
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 将holder,這個holder為開始在oncreat裡面取得的holder,将它賦給surfaceHolder
surfaceHolder = holder;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 将holder,這個holder為開始在oncreat裡面取得的holder,将它賦給surfaceHolder
surfaceHolder = holder;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// surfaceDestroyed的時候同時對象設定為null
surfaceview = null;
surfaceHolder = null;
mediarecorder = null;
}
3. 停止按鈕的事件
if (mediarecorder != null) {
// 停止錄制
mediarecorder.stop();
// 釋放資源
mediarecorder.release();
mediarecorder = null;
}
二,使用意圖錄制
Intent i = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
File folder = FileUtils.getMediaRecorderFolder(this);
File targetFile = new File(folder, "a " + System.currentTimeMillis() + ".3gp");
Uri imageFileUri = Uri.fromFile(targetFile);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
i.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(i, 102);