先簡要說明下Android支援的視頻格式,如下:
由於硬體的不同,不同的手機支援的編解碼方式有些不一樣,在T-Mobile
G1實際裝置中增加了對WMA,WMV,H.264 AVC格式解碼的支援。Android支援的音/視頻編碼方式僅包括:AMR-NB,H.263,
輸出的視頻格式也只*.3gp或者*.mp4,這點在以後的開發中需要注意。
對Android的編解碼有了一些瞭解後,我們再去研究下如何在Android上來播放/錄製視頻,開啟Android SDK中關於媒體方面的說明,摘要其主要部分如下:
首先注意的就是:MediaPlayer,MediaRecoder,主要是用來播放視頻與錄製視頻的類;由於這2個類都比較複雜,本篇在後面會詳細介紹如何使用MediaRecoder,MediaPlayer將在以後篇幅中再詳細介紹。
其他的幾個類,定義Android支援的編碼方式,如下:
類 |
說明 |
編碼方式定義 |
MediaRecorder.AudioEncoder |
音頻編碼當時 |
AMR_NB:AMR NB編碼 |
MediaRecorder.AudioSource |
聲音採樣裝置 |
MIC:麥克風 |
MediaRecorder.OutputFormat |
錄製輸出格式 |
MPEG_4:*.mp4 |
RAW_AMR:*.amr |
THREE_GPP:*.3gp |
MediaRecorder.VideoEncoder |
視頻編碼方式 |
H263:H.263編碼 |
H264:H.264編碼 |
MPEG_4_SP:mp4編碼 |
MediaRecorder.VideoSource |
視頻採樣裝置 |
CAMERA:數位相機 |
如何使用MediaRecorder錄製聲音?
先對聲音錄製有個大致的瞭解,需要設定聲音資料的來源、輸出編碼方式、輸出檔案路徑、輸出檔案格式等。有一點需要說明的是:輸出檔案格式就相當於一個容器,具體採用什麼編碼需要指定編碼格式。編碼一樣可能輸出格式不一樣,輸出格式一樣其編碼方式可能不一樣。
android.media 包含與媒體子系統互動的類。使用 android.media.MediaRecorder
類進行媒體採樣,包括音頻和視頻。MediaRecorder
作為狀態機器運行。需要設定不同的參數,比如源裝置和格式。設定後,可執行任何時間長度的錄製,直到使用者停止。
錄製音頻主要片段如下:
MediaRecorder mrec ;
File audiofile = null;
private static final String TAG=”SoundRecordingDemo”;
protected void startRecording
() throws IOException
{
mrec.setAudioSource(MediaRecorder.AudioSource.MIC);
mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
if (mSampleFile == null)
{
File sampleDir = Environment.getExternalStorageDirectory();
try
{
audiofile = File.createTempFile(”ibm”, “.3gp”, sampleDir);
}catch (IOException e)
{
Log.e(TAG,”sdcard access error”);
return;
}
}
mrec.setOutputFile(audiofile.getAbsolutePath());
mrec.prepare();
mrec.start();
}
protected void stopRecording
()
{
mrec.stop();
mrec.release();
processaudiofile(audiofile.getAbsolutePath());
}
protected void processAudiofile
()
{
ContentValues values = new ContentValues(3);
long current = System.currentTimeMillis();
values.put(MediaStore.Audio.Media.TITLE, “audio” + audiofile.getName());
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));
values.put(MediaStore.Audio.Media.MIME_TYPE, “audio/3gpp”);
values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath());
ContentResolver contentResolver = getContentResolver();
Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Uri newUri = contentResolver.insert(base, values);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri));
}
對以上代碼解析如下:
- 在 startRecording 方法中,執行個體化並初始化 MediaRecorder 的執行個體。
- 輸入源被設定為麥克風(MIC)。
- 輸出格式被設定為 3GPP(*.3gp 檔案),這是行動裝置專用的媒體格式。
- 編碼器被設定為 AMR_NB,這是音頻格式,採樣率為 8 KHz。NB 表示窄頻。SDK 文檔 解釋了不同的資料格式和可用的編碼器。
- 音
頻檔案儲存體在儲存卡而不是記憶體中。External.getExternalStorageDirectory()
返回儲存卡位置的名稱,在該目錄中將建立一個臨時檔案名稱。然後,通過調用 setOutputFile 方法將檔案關聯到 MediaRecorder
執行個體。音頻資料將儲存到該檔案中。
- 調用 prepare 方法完成 MediaRecorder 的初始化。準備開始錄製流程時,將調用 start 方法。在調用 stop 方法之前,將對儲存卡上的檔案進行錄製。release 方法將釋放分配給 MediaRecorder 執行個體的資源。
- 音頻採樣完成之後, 向裝置的媒體庫添加該音頻。在該代碼範例中,processAudiofile 方法將音頻添加到媒體庫。使用 Intent 通知裝置上的媒體應用程式有新內容可用。
- 最後還需要注意的是,錄製聲音需要一定的許可權,需要向 AndroidManifest.xml 添加許可權聲明:
<uses-permission android:name=”android.permission.RECORD_AUDIO”></uses-permission>總結說明: