為了將MediaRecorder用於視頻捕獲,必須采用與音頻捕獲相同的步驟,同時加上一些視頻的特定的步驟。除此之外,MediaRecord是一個狀態機,因此必須遵從實例化到錄制的特定步驟序列。
首先將實例化MediaRecorder,然后一次進行其他的步驟。
MediaRecorder recorder=new MediaRecorder();
1.音頻和視頻源
在實例化后,可以設置音頻和視頻源,可以使用setAudioSource方法來設置音頻源,並傳入一個常量以表示想要使用的源。
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
音頻遠的可能值定義在MediaRecorder.AudioSource類中的常量:
1)CAMCORDER:如果設備有不同的麥克風用於不同的攝像頭(前攝、后攝),那么使用此值將指定適當的麥克風。API 7之后。
2)DEFAULT:這個值指定將使用設備上默認的麥克風。
3)MIC:這個值指定將使用用於錄制視頻的標准麥克風。
4)VOICE_CALL:之歌值指定音頻應該是來自一個正在進行中的電話。雖然可能不是所有的手機,但是目前大部分的手機都不支持這個常量。
5)VOICE_DOWNLINK:這個值指定音頻應該是來自一個電話,特別是指傳入的音頻。雖然可能不是所有的手機,但是目前大部分的手機都不支持這個常量。
6)VOICE_UPLINK: 這個值指定音頻應該是來自一個電話,特別是指傳出的音頻(手機發送的音頻)。雖然可能不是所有的手機,但是目前大部分的手機都不支持這個常量。
7)VOICE_RECOGNITION:這個值指定音頻應該來自一個設置為用於電話上語音識別功能的麥克風。如果沒有指定這種麥克風,那么將使用默認的麥克風。
CAMERA和DEFAULT這兩個常量表示同樣的事情,即設備上的主攝像頭應該用於錄制視頻。對於設置視頻源,可以使用setVideoSource方法:
recorder. setVideoSource(MediaRecorder.AudioSource. DEFAULT);
2.輸出格式
在設置音頻源和視頻源之后,可以使用MediaRecorder的setOutputFormat方法設置輸出格式,同時傳入要使用的格式。
recorder. setOutputFormat (MediaRecorder. OutputFormat. DEFAULT);
可能的格式定義為在MediaRecorder.OutputFormat類中列出的常量。
1)DEFAULT:指定使用默認的輸出格式。默認的輸出格式可能會根據設備的不同而有所區別。
2)MPEG_4:指定音頻和視頻將被捕獲到一個MPEG_4文件格式的文件中。這個文件將是一個.MP4文件。MPEG_4文件通常包含H.264、H.263或MPEG_4 Part 2編碼的視頻,以及ACC或MP3編碼的音頻。MPEG_4被廣泛的使用在各種在線視頻技術以及消費電子設備中。
3)RAW_AMR:此設備僅用於音頻錄制,而不用於視頻。
4)THREE_GPP:指定音頻和視頻將被捕獲到一個3GP文件格式的文件中。這個文件將是一個.3GP文件。.3GP文件通常包含使用H.264、MPEG_4 Part 2和H.263編解碼器編碼的視頻和使用AMR或AAC編解碼編碼的音頻。
3.音頻和視頻編碼器
在設置輸出格式后,應該指定想要使用的音頻和視頻編碼器。使用MediaRecorder的setVideoEncoder方法,可以指定將要使用的視頻編解碼器。
recorder. setVideoEncoder (MediaRecorder. VideoEncoder. DEFAULT);
可以傳遞給setVideoEncoder的可能值定義為在MediaRecorder. VideoEncoder中的常量:
1)DEFAULT:指定使用設備的默認編解碼器。大多數情況下是H.263。
2)H263
3)H264
4) MPEG_4_SP
使用MediaRecorder的setAudioEncoder方法,可以指定將要使用的音頻編解碼器。
recorder. setAudioEncoder (MediaRecorder. AudioEncoder. DEFAULT);
可以傳遞給setAudioEncoder的可能值定義為在MediaRecorder. AudioEncoder中的常量。MediaRecorder. AudioEncoder僅包含兩個常量:
1)AMR_NB
2)DEFAULT:其實該值也是上邊的AMR_NB音頻編解碼器。
4.音頻和視頻比特率
可以說使用MediaRecorder的setVideoEncodingBitrate方法設置視頻編碼比特率,並傳入請求的比特率,以位/秒為單位。視頻的低比特率設置在256000位/秒(256kbps)范圍之內,而高比特率視頻在3000000位/秒(3 m kbps)范圍之內。
recorder.setVideoEncodingBitrate(150000);
還可以指定用來編碼音頻數據的最大比特率。
recorder.setAudioEncodingBitrate(8000);
5.音頻采樣率
與比特率一樣,音頻采樣率對於確定要捕獲和編碼的音頻質量也非常重要。MediaPlayer有一個setAudioSampleRate方法,用於請求特定的采樣率。傳入的采樣率以Hz為單位,其表示每秒采樣的數量。采樣率越高,則在捕獲文件中可以表示的音頻頻率的范圍越大。一個低端的采樣率8 000Hz適用與捕獲低質量的聲音,高端的采樣率48 000Hz可用於高質量的視頻格式。
recorder.setAudioSampleRate (8000);
6.音頻通道
通過使用setAudioChannels方法傳入通道的數量來指定捕獲的音頻通道的數量。
recorder.setAudioChannels(1);
7.視頻幀速率
可以通過使用setVideoFrameRate並傳入請求的幀速率來控制每秒鍾補貨的視頻幀數。每秒12~15幀之間的值通常足以表示運動。對於高端而言,電視是每秒30幀。具體使用的實際幀數率將取決與設備的能力。
recorder.setVideoFrameRate(20);
8.視頻大小
可以通過使用setVideoSize方法傳入表示寬度和高度像素的整數來控制捕獲視頻的寬度和高度。標准大小的范圍是176*144~640*480,許多設備甚至支持更高的分辨率。
recorder. setVideoSize (640,480);
9.最大文件大小
通過以字節為單位將最大大小傳遞給setMaxFileSize方法,可以指定由MediaRecorder所補貨的文件的最大大小。
recorder.setMaxFileSize(10000000);//10M
為了確定是否已經達到最大文件大小,需要在活動中來實現MediaRecorder.OnInfoListener。
同時在MediaRecorder中注冊,然后將會調用onInfo方法,根據MediaRecorder.MEDIA_RECORDER_INFO_FILESIZE_REACHED常量檢查其中的what參數。如果它們匹配,那么說明達到了最大文件大小。
不存在檢查它是否已經停止的方法。為了實際停止錄制,必須顯式地調用stop方法。
下面使用簡單的代碼說明:
public class VideoCapture extends Activity implements MediaRecorder.OnInfoListener{ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mMediaRecorder.setOnInfoListener(this); } public void onInfo(MediaRecorder mr, int what, int extra) { if(what==MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILE SIZE_REACHED){ Log.v("VIDEOCAPTURE", "Maximum Filesize Reached"); mMediaRecorder.stop(); } }
10.最長持續時間
通過以毫秒為單位將最長持續時間傳遞給setMaxDuration方法,可以指定MediaRecorder所捕獲的文件的最長持續時間。
recorder.setMaxDuration(100);//100秒
為了確定是否已經達到了最長持續時間,需要在活動中實現MediaRecorder.OnInfoListener,同時在MediaRecorder中注冊它。然而當已經達到最長持續時間就會出發onInfo方法,同時將what整數設置為常量MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED。
MediaRecorder在達到最長持續時間停止,不存在檢查它是否已經停止的方法。為了實際停止錄制,必須顯式地調用stop方法。
下面使用簡單的代碼說明:
public class VideoCapture extends Activity implements MediaRecorder.OnInfoListener{ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mMediaRecorder.setOnInfoListener(this); } public void onInfo(MediaRecorder mr, int what, int extra) { if(what==MediaRecorder. MEDIA_RECORDER_INFO_MAX_ DURATION_REACHED){ Log.v("VIDEOCAPTURE", "Maximum Duration Reached"); mMediaRecorder.stop(); } }
11.統一設置
從API level 8開始,MediaRecorder有一個setProfile方法,它接受一個CamcorderProfile實例作為參數。CamcorderProfile有一個靜態方法CamcorderProfile.get,它接受一個整數參數,其可能的值定義為常量:CamcorderProfile.QUALITY_HIGH或CamcorderProfile.QUALITY_LOW。使用該方法可以將根據預設值設置整個配置變量集合。
其中,QUALITY_HIGH是指高質量視頻捕獲設置,QUALITY_LOW是指低質量視頻捕獲設置。
QUALITY_HIGH包含以下設置:
1)音頻比特率:12 200位/秒
2)音頻通道:1
3)音頻編解碼器:AMR-NB
4)音頻采樣率:8000Hz
5)持續時間:60s
6)文件格式:MP4
7)視頻比特率:3 000 000位/秒
8)視頻編解碼器:H.264
9)視頻幀寬度:720像素
10)視頻幀高度:480像素
11)視頻幀速率:24幀/秒
QUALITY_LOW包含以下設置:
1)音頻比特率:12 200位/秒
2)音頻通道:1
3)音頻編解碼器:AMR-NB
4)音頻采樣率:8000Hz
5)持續時間:30s
6)文件格式:3GPP
7)視頻比特率:256 000位/秒
8)視頻編解碼器:H.263
9)視頻幀寬度:176像素
10)視頻幀高度:144像素
11)視頻幀速率:15幀/秒
12.輸出文件
緊隨其后將設置輸出文件的位置。可以傳入一個FileDescriptor或一個表示文件路徑的字符串。
recorder.setOutputFile(VecordFile.getAbsolutePath());
總結
可以通過使用MediaRecorder類來創建獲取捕獲視頻,通過上述的設置方法為MediaRecorder實例設置參數進行錄制視頻。