android觸屏音文件地址,Android音視頻-音頻采集

Android的音視頻開發是我暫定的一個職業發展的一個方向,通過自學記錄一些記了又忘記的知識。

音頻基礎知識

采樣率(samplerate)

95a3614ba7524aeb0f330503d87ed692.png

藍色代表模擬音頻信號,紅色的點代表采樣得到的量化數值。

采用就是把模擬信號數字化的過程,不僅僅是音頻需要采樣,所有的模擬信號都需要通過采樣轉換為可以用0101來表示的數字信號。常用的音頻采樣頻率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

人耳可以聽到的聲波頻率范圍?

20-20000Hz。為了保證聲音不失真,采樣頻率應在40kHz以上。

AudioRecord構造參數中的sampleRateInHz。

量化精度(位寬)

上圖中,每一個紅色的采樣點,都需要用一個數值來表示大小,這個數值的數據類型大小可以是:4bit、8bit、16bit、32bit等等,位數越多,表示得就越精細,聲音質量自然就越好,當然,數據量也會成倍增大。

AudioRecord構造參數中的audioFormat。

聲道數(channels)

由于音頻的采集和播放是可以疊加的,因此,可以同時從多個音頻源采集聲音,并分別輸出到不同的揚聲器,故聲道數一般表示聲音錄制時的音源數量或回放時相應的揚聲器數量。

AudioRecord 構造參數中的channelConfig。

音頻幀(frame)

視頻我們知道每一幀是一張圖片,音頻數據是流式的,沒有明確的一幀幀的概念,但是在音頻處理的時候,一般取2.5ms-60ms為單位數據量的一幀音頻。

假設某通道音頻信號采樣率為8kHz,位寬位16bit,20ms一幀,雙通道,那么一幀音頻的大小為:

8000*16bit*0.02*2=5120bit=640byte

音頻編碼

是將音頻采樣數據(PCM等)壓縮成為音頻碼流,從而降低音頻的數據量。模擬的音頻信號轉換為數字信號需要經過采樣和量化,量化的過程被稱之為編碼,根據不同的量化策略,產生了許多不同的編碼方式,常見的編碼方式有:PCM 和 ADPCM

為什么要音頻編碼

存儲一秒鐘采樣率為44.1KHz,位深為16bit,雙聲道的PCM編碼的音頻信號,需要

44100*16bit*2 / 8/1024 = 172.2KB的空間,那么1分鐘則約為10.09M。

這對大部分用戶是不可接受的。

只有2種方法,降低采樣指標或者壓縮。

音頻壓縮

降低采樣是不可取的,因此就有了各種各樣的壓縮方式。

有兩類主要的音頻文件格式:

有損文件格式: 是基于聲學心理學的模型,除去人類很難或根本聽不到的聲音。

無損格式,例如PCM,WAV,ALS,ALAC,TAK,FLAC,APE,WavPack(WV)

有損格式,例如MP3,AAC,WMA,Ogg。

根據采樣率和采樣大小可以得知,相對自然界的信號,音頻編碼最多只能做到無限接近,至少目前的技術只能這樣了,相對自然界的信號,任何數字音頻編碼方案都是有損的,因為無法完全還原。在計算機應用中,能夠達到最高保真水平的就是PCM編碼,被廣泛用于素材保存及音樂欣賞,CD、DVD以及我們常見的WAV文件中均有應用。因此,PCM約定俗成了無損編碼,因為PCM代表了數字音頻中最佳的保真水準,并不意味著PCM就能夠確保信號絕對保真,PCM也只能做到最大程度的無限接近。

我們而習慣性的把MP3列入有損音頻編碼范疇,是相對PCM編碼的。

Android如何采集音頻

Android SDK對于音頻采集提供兩套API:MediaRecorder和AudioRecorder,前者是偏上層的一個API,可以直接把手機麥克風錄入的音頻數據進行編碼壓縮為AMR,MP3等并保存文件。后者接近底層,可以靈活控制,得到原始的一幀幀PCM音頻數據。

當要簡單的把數據采集為音頻文件,就使用MediaRecorder,如果要對音頻做進一步的算法處理就使用AudioRecorder。

什么是PCM音頻數據?

PCM(Pulse Code Modulation)也被稱為脈沖編碼調制。PCM音頻數據是未經壓縮的音頻采樣數據裸流,它是由模擬信號經過采樣、量化、編碼轉換成的標準的數字音頻數據。(詳細參考)

AudioRecord

簡介

AudioRecord輸出是PCM語音數據,如果保存成音頻文件,是不能夠被播放器播放的,所以必須先寫代碼實現數據編碼以及壓縮。

AudioRecord適用于對采集的音頻數據進行二次處理的,我們首先看到代碼AudioRecord類的構造函數。

/**

* Class constructor.

* Though some invalid parameters will result in an {@link IllegalArgumentException} exception,

* other errors do not. Thus you should call {@link #getState()} immediately after construction

* to confirm that the object is usable.

* @param audioSource the recording source.

* See {@link MediaRecorder.AudioSource} for the recording source definitions.

* @param sampleRateInHz the sample rate expressed in Hertz. 44100Hz is currently the only

* rate that is guaranteed to work on all devices, but other rates such as 22050,

* 16000, and 11025 may work on some devices.

* {@link AudioFormat#SAMPLE_RATE_UNSPECIFIED} means to use a route-dependent value

* which is usually the sample rate of the source.

* {@link #getSampleRate()} can be used to retrieve the actual sample rate chosen.

* @param channelConfig describes the configuration of the audio channels.

* See {@link AudioFormat#CHANNEL_IN_MONO} and

* {@link AudioFormat#CHANNEL_IN_STEREO}. {@link AudioFormat#CHANNEL_IN_MONO} is guaranteed

* to work on all devices.

* @param audioFormat the format in which the audio data is to be returned.

* See {@link AudioFormat#ENCODING_PCM_8BIT}, {@link AudioFormat#ENCODING_PCM_16BIT},

* and {@link AudioFormat#ENCODING_PCM_FLOAT}.

* @param bufferSizeInBytes the total size (in bytes) of the buffer where audio data is written

* to during the recording. New audio data can be read from this buffer in smaller chunks

* than this size. See {@link #getMinBufferSize(int, int, int)} to determine the minimum

* required buffer size for the successful creation of an AudioRecord instance. Using values

* smaller than getMinBufferSize() will result in an initialization failure.

* @throws java.lang.IllegalArgumentException

*/

public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,

int bufferSizeInBytes)

看這個構造函數的參數的解釋可以明白個七七八八。具體的介紹如下:

audioSource

音頻采集的輸入源,可選的值以常量的形式定義在 MediaRecorder.AudioSource 類中,常用的值包括:DEFAULT(默認),VOICE_RECOGNITION(用于語音識別,等同于DEFAULT),MIC(由手機麥克風輸入),VOICE_COMMUNICATION(用于VoIP應用)等等。

sampleRateInHz

采樣率,注意,目前44100Hz是唯一可以保證兼容所有Android手機的采樣率。

channelConfig

通道數的配置,可選的值以常量的形式定義在 AudioFormat 類中,常用的是 CHANNEL_IN_MONO(單通道),CHANNEL_IN_STEREO(雙通道)

audioFormat

這個參數是用來配置“數據位寬”的,可選的值也是以常量的形式定義在 AudioFormat 類中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保證兼容所有Android手機的。

bufferSizeInBytes

配置的是 AudioRecord 內部的音頻緩沖區的大小,該緩沖區的值不能低于一幀“音頻幀”(Frame)的大小,而前一篇文章介紹過,一幀音頻幀的大小計算如下:

int size = 采樣率 x 位寬 x 采樣時間 x 通道數

在Android開發中,AudioRecord 類提供了一個幫助你確定這個 bufferSizeInBytes 的函數,原型如下:

int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat);

不同的廠商的底層實現是不一樣的,但無外乎就是根據上面的計算公式得到一幀的大小,音頻緩沖區的大小則必須是一幀大小的2~N倍。

使用AudioRecord

操作AudioRecord步驟如下:

配置參數,初始化AudioRecord構造函數

開始采集

開啟一個子線程,不斷從AudioRecord的緩沖區將音頻數據讀出來。注意,這個過程一定要及時,否則就會出現“overrun”的錯誤,該錯誤在音頻開發中比較常見,意味著應用層沒有及時地取走音頻數據,導致內部的音頻緩沖區溢出。

停止采集,釋放資源。

示例代碼:

注意添加RECORD_AUDIO權限。

點擊查看

MediaRecorder

MediaRecorder可以直接把手機麥克風錄入的音頻數據進行編碼壓縮為AMR,MP3等并保存文件。

使用MediaRecorder

簡單操作使用MediaRecorder類步驟如下:

實例化MediaRecorder對象

使用函數SetAudioSource設置硬件設備為采集音頻輸入數據

使用函數SetOutputFormat設置輸出音頻格式。使用類OutputFormat列出支持的輸出格式

調用方法SetAudioEncoder方法設置音頻編碼格式

調用SetOutputFile方法保存輸出文件數據的絕對完整路徑

調用Prepare方法初始化錄制

調用Start方法開始錄制

示例代碼:

注意添加權限:

WRITE_EXTERNAL_STORAGE;

RECORD_AUDIO;

點擊查看

總結

MediaRecorder和AudioRecord都可以錄制音頻,區別是MediaRecorder錄制的音頻文件是經過壓縮后的,需要設置編碼器。并且錄制的音頻文件可以用系統自帶的Music播放器播放。

而AudioRecord錄制的是PCM格式的音頻文件,需要用AudioTrack來播放,AudioTrack更接近底層。

在用MediaRecorder進行錄制音視頻時,最終還是會創建AudioRecord用來與AudioFlinger進行交互。

C++層MediaRecorder創建AudioRecord類的代碼位于AudioSource類構造函數中.

MediaRecorder錄制的數據是 amr MP3 格式;AudioRecorder錄制出來的是比較原始的PCM音頻格式;PCM經過編碼壓縮可以為 amr MP3 AAC。

優缺點:

AudioRecord

主要是實現邊錄邊播以及對音頻的實時處理,這個特性讓他更適合在語音方面有優勢;

優點:語音的實時處理,可以用代碼實現各種音頻的封裝

缺點:輸出是PCM格式文件,如果保存成音頻文件,是不能夠被播放器播放的,所以必須先寫代碼實現數據編碼以及壓縮

MediaRecorder

已經集成了錄音、編碼、壓縮等,支持少量的錄音音頻格式,大概有,aac,amr,3gp等

優點:集成,直接調用相關接口即可,代碼量小

缺點:無法實時處理音頻;輸出的音頻格式不是很多,例如沒有輸出mp3格式文件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375902.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

平衡二叉樹,AVL樹之圖解篇

學習過了二叉查找樹,想必大家有遇到一個問題。例如,將一個數組{1,2,3,4}依次插入樹的時候,形成了圖1的情況。有建立樹與沒建立樹對于數據的增刪查改已經沒有了任何幫助,反而增添了維護的成本。而只有建立的樹如圖2,才能…

窗體

GDI:圖形設備接口 所有能夠將電子信號轉換成圖像顯示的設備是圖形設備, 常見的圖形設備有顯示器,打印機。 Winform封裝了GDI底層的接口,提供一組面向對象的接口,供我們使用 Partial關鍵字,用他修飾的類叫分布類/部分類…

android程序到處apk,導出已安裝到手機中程序的apk文件

查看該手機所有安裝包的包名,輸入adb shell pm list packages找到你要導出的包名獲取該安裝apk的路徑,輸入adb shell pm path com.pfoc.myacurite得到包所在路徑:導出文件,adb pull /data/app/com.pfoc.myacurite-1/base.apk /Use…

數據結構--順序棧

棧&#xff1a;限定僅在表尾進行插入或刪除操作的線性表&#xff0c;對棧來說&#xff0c;表尾端為棧頂&#xff0c;表頭端為棧底。 本文實現了順序棧的表示和相關函數操作&#xff0c;以及一些驗證性代碼。 #include<stdio.h> #include<stdlib.h> #include<w…

Mysql 的一些基本用法

一、增加字段 alter table students add IsImportJcxx int set default 0 COMMENT 是否導入基礎信息平臺 1 是導入; 二、刪除字段 alter table provincestudentinfo drop column NativePlace; 三、創建表 CREATE TABLE 表名 ( IconId int not null auto_increment, 字段名 …

Python 文件的輸入與輸出

1. 文本文件的讀寫主要通過open()所構建的文件對象來實現。我們打開一個文件&#xff0c;并使用一個對象來表示該文件 , f open(d&#xff0c;r) 其中d是文件名&#xff0c;r是模式 "r" 文件只讀,使用 f.write()會報錯 "w" 用于寫入&#xff0c;每次使用f…

查詢表的內容

1&#xff1a;as給表另外命名 2&#xff1a;desc倒序 3&#xff1a;order by分組 4&#xff1a;select*form表名where條件轉載于:https://www.cnblogs.com/chen1101465910/p/3719944.html

人之為生也&#xff0c;凡不破者亦難立之。縱所思之&#xff0c;生而順之者&#xff0c;亦難成也。然吾之路也&#xff0c;亦難行之&#xff0c;至此二十有余&#xff0c;雖無半百之所歷&#xff0c;亦無順途&#xff0c;每及思之&#xff0c;慨之多也。 偶有所感&#xff0c;念…

Delphi 一些函數解釋

AdjustWindowRect 給定一種窗口樣式&#xff0c;計算獲得目標客戶區矩形所需的窗口大小 AnyPopup 判斷屏幕上是否存在任何彈出式窗口 ArrangeIconicWindows 排列一個父窗口的最小化子窗口 AttachThreadInput 連接線程輸入函數 BeginDeferWindowPos 啟動構建一系列新窗口位置的過…

盒子模型的總結

轉載于:https://www.cnblogs.com/zy2012/p/3725677.html

ubuntu node.js Binaries方式安裝(二進制文件安裝)

node.js在windows下有安裝文件&#xff0c;直接一路下一步就可以了&#xff0c;但大家都知道在windows下用node.js總會遇到一些問題&#xff0c;所以就會用到linux。 看到網上幾乎是在linux下編譯安裝node.js。感覺很奇怪&#xff0c;其實官網直接有 node.js linux binaries文…

maven generating project in batch mode hang

現象&#xff1a; 執行 archetype:generate 的時候&#xff0c;會產生[INFO] Generating project in Batch mode原因是&#xff1a;網速問題&#xff0c; 解決方法&#xff1a; 設置maven不要從遠程服務器上獲取catalog&#xff0c;增加參數-DarchetypeCataloginternal 如何在i…

android手機生成pdf格式文件,Android根據pdf模板生成pdf文件

1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat 3 new android.icu.text.SimpleDateFormat("HHmmss");//HH:mm:ss4 //設置默認時區5 simpleDateFormat.setTimeZone(android.icu.util.TimeZone.getTimeZone("G…

棧的應用--數制轉換

十進制N和其他d進制 N(N div d)XdN mod d &#xff08;其中&#xff1a;div為整除運算&#xff0c;mod為求余運算&#xff09; void conversion(){SqStack S;int N;SElemType e;Init_Stack(S);scanf("%d",&N);while(N){Push(S,N%8);NN/8;}while(!Stack_Empty(S…

radio按鈕點擊文字選中按鈕

<input type"radio" name"name" id"rd" value" " /><label for"rd">測試</label> 轉載于:https://www.cnblogs.com/kevin1988/p/3727041.html

tokumx經營報表

#見數據庫列表 show dbs#切換/創建數據庫(當創建一個集合(table)的時候會自己主動創建當前數據庫)use admin;#添加用戶 db.addUser("zhoulf ","123456",true)#更改password&#xff08;為已經存在的用戶更改password&#xff09; db.addUser("zhoulf …

微博 Android 啟動廣告,使用Xposed去除微博國際版的啟動廣告

本文同步更新于旺仔的個人博客&#xff0c;訪問可能有點慢&#xff0c;多刷新幾次。前面有篇文章已經介紹了如何創建Xposed模塊的文章了&#xff0c;這篇就讓我們來實現一個簡單的去除啟動廣告的功能吧。起因為什么要是要去掉微博國際版的開屏廣告呢&#xff0c;因為廣告煩人啊…

鴿巢原理

鴿巢原理&#xff1a; n1個鴿子放入n個窩中&#xff0c;至少有一個窩含有兩只鴿子 Find a multipleTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5590 Accepted: 2434 Special JudgeDescription The input contains N natural (i.e. positive integer) numbers…

linux命令:vim文件操作命令、新建用戶,查看用戶列表,chown命令

命令 簡單說明 :w 保存編輯后的文件內容&#xff0c;但不退出vim編輯器。這個命令的作用是把內存緩沖區中的數據寫到啟動vim時指定的文件中。 :w! 強制寫文件&#xff0c;即強制覆蓋原有文件。如果原有文件的訪問權限不允許寫入文件&#xff0c;例如&#xff0c;原有的文件…

cocos2d-x android 環境搭配,cocos2d-x?Android環境配置問題和解決方法

1.前提&#xff1a;下載安裝Cygwin,并已經在cygwin\home\admin(計算機用戶名)下的.bash_profile中完成如下配置&#xff1a;NDK_ROOT /cygdrive/d/cocos2dxdev/andrid-ndk-r8e//NDK安裝位置export NDK_ROOT問題&#xff1a;運行cygwin.exe.錄入如下的第一行數據后&#xff0c;沒…