Android視頻開發淺析

來源:互聯網
上載者:User

先簡要說明下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>總結說明:

  • Android

    SDK中對視頻開發方面提供了很大的方便,但是在使用的過程中發現,這些類封裝的都很高層,很多地方估計也無法滿足開發人員的需求,主要體現在缺少對檔案
    流操作等底層介面,我們只能通過控制狀態來控制檔案流,缺少這方面操作增加了Android視頻開發的難度,比如說增加其他編碼器等。

  • Android
    T-Mobile
    G1可以線上看Youtube視頻,然而我們在開發中卻發現,其無法播放FLV格式的視頻,這就有些不明白了?估計在未來應該會支援的,FLV是當前最流
    行的流媒體格式,如果不支援對使用者在Android上直接看這些FLV視頻會有很大的影響。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.