編輯:Android開發實例
前言
Android除了支持播放多媒體文件之外,還可以從對應的硬件中捕獲多媒體,比如從麥克風錄音、從攝像頭錄像等。本文講解一下Android下如何通過MediaRecorder進行錄音以及錄像的步驟,最後將以簡單的Demo演示。
本文的主要內容:
MediaRecorder
MediaRecorder主要用於記錄音頻與視頻,它位於"android.media.MediaRecorder"下。它為開發人員提供了詳盡的AIP以完成記錄音頻與視頻的工作,下面簡單介紹一些常用的。
上面僅僅列出了一些常用的方法,但是通過這個方法可以看出MediaRecorder是需要在多個狀態之間切換的,准備、開始、停止、重置等等。MediaRecorder也為我們提供了一套狀態切換的規則,只有在既定的狀態下,才能完成對應的操作,下圖是官方文檔提供的狀態圖。
上圖非常直觀的展示了MediaRecorder的狀態間的轉換,這裡只說幾點需要注意的地方:
MediaRecorder錄制視頻必不可少的步驟:
MediaRecorder錄制音頻
上面介紹了使用MediaRecorder錄制視頻必不可少的步驟,因為錄制音頻無需捕獲圖像,所以更簡單一些。下面直接通過一個簡單的示例,演示如何錄制音頻,錄制的音頻文件保存在sd根目錄下,注釋很詳細,這裡不在累述了。布局很簡單,只有兩個Button,開始錄音、結束錄音,就不提供布局代碼了。
實現代碼:
- package cn.bgxt.mediarecorderdemo;
- import java.io.File;
- import android.app.Activity;
- import android.media.MediaRecorder;
- import android.media.MediaRecorder.OnErrorListener;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- public class RecordActivity extends Activity {
- private Button btn_RecordStart, btn_RecordStop;
- private MediaRecorder mediaRecorder;
- private boolean isRecording;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_record);
- btn_RecordStart = (Button) findViewById(R.id.btn_RecordStart);
- btn_RecordStop = (Button) findViewById(R.id.btn_RecordStop);
- btn_RecordStop.setEnabled(false);
- btn_RecordStart.setOnClickListener(click);
- btn_RecordStop.setOnClickListener(click);
- }
- private View.OnClickListener click = new OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_RecordStart:
- start();
- break;
- case R.id.btn_RecordStop:
- stop();
- break;
- default:
- break;
- }
- }
- };
- /**
- * 開始錄音
- */
- protected void start() {
- try {
- File file = new File("/sdcard/mediarecorder.amr");
- if (file.exists()) {
- // 如果文件存在,刪除它,演示代碼保證設備上只有一個錄音文件
- file.delete();
- }
- mediaRecorder = new MediaRecorder();
- // 設置音頻錄入源
- mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- // 設置錄制音頻的輸出格式
- mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- // 設置音頻的編碼格式
- mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
- // 設置錄制音頻文件輸出文件路徑
- mediaRecorder.setOutputFile(file.getAbsolutePath());
- mediaRecorder.setOnErrorListener(new OnErrorListener() {
- @Override
- public void onError(MediaRecorder mr, int what, int extra) {
- // 發生錯誤,停止錄制
- mediaRecorder.stop();
- mediaRecorder.release();
- mediaRecorder = null;
- isRecording=false;
- btn_RecordStart.setEnabled(true);
- btn_RecordStop.setEnabled(false);
- Toast.makeText(RecordActivity.this, "錄音發生錯誤", 0).show();
- }
- });
- // 准備、開始
- mediaRecorder.prepare();
- mediaRecorder.start();
- isRecording=true;
- btn_RecordStart.setEnabled(false);
- btn_RecordStop.setEnabled(true);
- Toast.makeText(RecordActivity.this, "開始錄音", 0).show();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 錄音結束
- */
- protected void stop() {
- if (isRecording) {
- // 如果正在錄音,停止並釋放資源
- mediaRecorder.stop();
- mediaRecorder.release();
- mediaRecorder = null;
- isRecording=false;
- btn_RecordStart.setEnabled(true);
- btn_RecordStop.setEnabled(false);
- Toast.makeText(RecordActivity.this, "錄音結束", 0).show();
- }
- }
- @Override
- protected void onDestroy() {
- if (isRecording) {
- // 如果正在錄音,停止並釋放資源
- mediaRecorder.stop();
- mediaRecorder.release();
- mediaRecorder = null;
- }
- super.onDestroy();
- }
- }
錄制音頻需要訪問麥克風設備,訪問設備需要添加權限:
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
效果展示:
MediaRecorder錄制視頻
上面已經介紹了使用MediaRecorder錄制視頻的步驟,這裡依照步驟一步一步寫代碼就可以了。下面通過一個簡單的Demo演示如何使用MediaRecorder錄制一段從攝像頭捕獲到的視頻,錄制的視頻文件將保持在SD卡上。布局很簡單,兩個Button,開始、停止,然後還有一個SurfaceView顯示預覽效果,就不給出布局代碼了。
實現代碼:
- package cn.bgxt.mediarecorderdemo;
- import java.io.File;
- import java.io.IOException;
- import android.app.Activity;
- import android.media.MediaRecorder;
- import android.media.MediaRecorder.OnErrorListener;
- import android.os.Bundle;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- public class VideoActivity extends Activity {
- private Button btn_VideoStart, btn_VideoStop;
- private SurfaceView sv_view;
- private boolean isRecording;
- private MediaRecorder mediaRecorder;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_video);
- btn_VideoStart = (Button) findViewById(R.id.btn_VideoStart);
- btn_VideoStop = (Button) findViewById(R.id.btn_VideoStop);
- sv_view = (SurfaceView) findViewById(R.id.sv_view);
- btn_VideoStop.setEnabled(false);
- btn_VideoStart.setOnClickListener(click);
- btn_VideoStop.setOnClickListener(click);
- // 聲明Surface不維護自己的緩沖區,針對Android3.0以下設備支持
- sv_view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- }
- private View.OnClickListener click = new OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_VideoStart:
- start();
- break;
- case R.id.btn_VideoStop:
- stop();
- break;
- default:
- break;
- }
- }
- };
- protected void start() {
- try {
- File file = new File("/sdcard/video.mp4");
- if (file.exists()) {
- // 如果文件存在,刪除它,演示代碼保證設備上只有一個錄音文件
- file.delete();
- }
- mediaRecorder = new MediaRecorder();
- mediaRecorder.reset();
- // 設置音頻錄入源
- mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- // 設置視頻圖像的錄入源
- mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- // 設置錄入媒體的輸出格式
- mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
- // 設置音頻的編碼格式
- mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
- // 設置視頻的編碼格式
- mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
- // 設置視頻的采樣率,每秒4幀
- mediaRecorder.setVideoFrameRate(4);
- // 設置錄制視頻文件的輸出路徑
- mediaRecorder.setOutputFile(file.getAbsolutePath());
- // 設置捕獲視頻圖像的預覽界面
- mediaRecorder.setPreviewDisplay(sv_view.getHolder().getSurface());
- mediaRecorder.setOnErrorListener(new OnErrorListener() {
- @Override
- public void onError(MediaRecorder mr, int what, int extra) {
- // 發生錯誤,停止錄制
- mediaRecorder.stop();
- mediaRecorder.release();
- mediaRecorder = null;
- isRecording=false;
- btn_VideoStart.setEnabled(true);
- btn_VideoStop.setEnabled(false);
- Toast.makeText(VideoActivity.this, "錄制出錯", 0).show();
- }
- });
- // 准備、開始
- mediaRecorder.prepare();
- mediaRecorder.start();
- btn_VideoStart.setEnabled(false);
- btn_VideoStop.setEnabled(true);
- isRecording = true;
- Toast.makeText(VideoActivity.this, "開始錄像", 0).show();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- protected void stop() {
- if (isRecording) {
- // 如果正在錄制,停止並釋放資源
- mediaRecorder.stop();
- mediaRecorder.release();
- mediaRecorder = null;
- isRecording=false;
- btn_VideoStart.setEnabled(true);
- btn_VideoStop.setEnabled(false);
- Toast.makeText(VideoActivity.this, "停止錄像,並保存文件", 0).show();
- }
- }
- @Override
- protected void onDestroy() {
- if (isRecording) {
- mediaRecorder.stop();
- mediaRecorder.release();
- mediaRecorder = null;
- }
- super.onDestroy();
- }
- }
錄制視頻需要用到麥克風和攝像頭硬件,還需要賦予一些相應的權限。
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <uses-permission android:name="android.permission.CAMERA"/>
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
效果展示:
MediaRecorder的內部類
通過上面錄制視頻的Demo可以看出,使用MediaRecorder錄制視頻,需要設置一些錄入源、編碼格式、輸出格式等。這些方法都是以int類型的參數設定的,它們其實都是在MediaRecorder的內部類中已經以常量的形式定義好了,直接適用場景進行選擇即可。
源碼下載
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
什麼是AppWidget?AppWidget就是我們平常在桌面上見到的那種一個個的小窗口,利用這個小窗口可以給用戶提供一些方便快捷的操作。本篇打算從以下幾個點來介