編輯:關於Android編程
MediaRecorder
Android的MediaRecorder包含了Audio和video的記錄功能,在Android的界面上,Music和Video兩個應用程序都是調用MediaRecorder實現的。
MediaRecorder在底層是基於OpenCore(PacketVideo)的庫實現的,為了構建一個MediaRecorder程序,上層還包含了進程間通訊等內容,這種進程間通訊的基礎是Android基本庫中的Binder機制。
以開源的Android為例MediaRecorder的代碼主要在以下的目錄中:
JAVA程序的路徑:
packages/apps/Camera/src/com/android/camera/VideoCamera.java
JAVA Framework的路徑:
frameworks/base/media/java/android/media/MediaRecorder.java
JAVA本地調用部分(JNI):
frameworks/base/media/jni/android_media_MediaRecorder.cpp
這部分內容編譯成為目標是libmedia_jni.so。
主要的頭文件在以下的目錄中:
frameworks/base/include/media/
多媒體底層庫在以下的目錄中:
frameworks/base/media/libmedia/
這部分的內容被編譯成庫libmedia.so。
多媒體服務部分:
frameworks/base/media/libmediaplayerservice/
MediaRecorder和MeidaPlayer使用相同的服務。
基於OpenCore部分
external/opencore/android/author
這部分內容被編譯成庫libopencoreauthor.so。
基本的錄音功能實現:
好了,了解了大概的路徑,具體的調用MediaRecorder的內容便可以深入各文件中去研究,接下來我們便直接來看例子,這個錄音器的代碼實現的說明都寫在了注釋中,非常簡單:
import java.io.IOException; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; /** * @description 對通過android系統手機進行錄音的一點說明測試 * @author chenzheng_java * @since 2011/03/23 */ public class MediaRecordActivity extends Activity { MediaRecorder mediaRecorder ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mediaRecorder = new MediaRecorder(); record(); } /** * 開始錄制 */ private void record(){ /** * mediaRecorder.setAudioSource設置聲音來源。 * MediaRecorder.AudioSource這個內部類詳細的介紹了聲音來源。 * 該類中有許多音頻來源,不過最主要使用的還是手機上的麥克風,MediaRecorder.AudioSource.MIC */ mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); /** * mediaRecorder.setOutputFormat代表輸出文件的格式。該語句必須在setAudioSource之後,在prepare之前。 * OutputFormat內部類,定義了音頻輸出的格式,主要包含MPEG_4、THREE_GPP、RAW_AMR……等。 */ mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /** * mediaRecorder.setAddioEncoder()方法可以設置音頻的編碼 * AudioEncoder內部類詳細定義了兩種編碼:AudioEncoder.DEFAULT、AudioEncoder.AMR_NB */ mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); /** * 設置錄音之後,保存音頻文件的位置 */ mediaRecorder.setOutputFile("file:///sdcard/myvido/a.3pg"); /** * 調用start開始錄音之前,一定要調用prepare方法。 */ try { mediaRecorder.prepare(); mediaRecorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /*** * 此外,還有和MediaRecorder有關的幾個參數與方法,我們一起來看一下: * sampleRateInHz :音頻的采樣頻率,每秒鐘能夠采樣的次數,采樣率越高,音質越高。 * 給出的實例是44100、22050、11025但不限於這幾個參數。例如要采集低質量的音頻就可以使用4000、8000等低采樣率 * * channelConfig :聲道設置:android支持雙聲道立體聲和單聲道。MONO單聲道,STEREO立體聲 * * recorder.stop();停止錄音 * recorder.reset(); 重置錄音 ,會重置到setAudioSource這一步 * recorder.release(); 解除對錄音資源的占用 */ }
這裡,一定要注意一點,那就是如果我們想要錄音的話,那麼首先得添加錄音權限到AndroidManiferst.xml中:
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
在android開發中會碰到有頂部導航並且下面顯示的內容是一個listview,此時要想實現左右滑動切換頂部導航的選項是不能實現的,因為listview自己消耗橫向滑動事
在做android項目開發時,就不得不遇到一個Activity的狀態組件,這個組件描述的是一個控件、一個窗體等的當前狀態信息。下面詳細介紹這個組件 一、Activit
在Android中,對Fragment的操作都是通過FragmentTransaction來執行。而從Fragment的結果來看,FragmentTransaction中
本節引言: 最近一段時間因為工作上的事以及面試等等,耽誤了博客的更新,這裡道歉下~ 今天下午去追夢網絡面試了一趟,全齊大神給小弟我上了一課,增長了