丝袜人妻一区二区三区_少妇福利无码视频_亚洲理论片在线观看_一级毛片国产A级片

當(dāng)前位置:首頁 > 話題廣場 > 攻略專題 > 游戲問答

「Android 音頻」“聲音”從何而來

作者:jarrettYe

通過這篇文章,您可以對Android系統(tǒng)音頻錄制技術(shù)有一個整體的了解,并對王毅為什么一直沒有錄制環(huán)境音或聲音有深入的了解。

一、音頻量化

音頻基座的文章數(shù)量很多,如果想知道更多,請到百度。(大衛(wèi)亞設(shè))。

這里重點(diǎn)關(guān)注 PCM 和采樣率,因?yàn)槟壳坝龅降囊纛l問題都跟這兩個有關(guān)。接下來看一張經(jīng)典的音頻采樣流程圖:

以上就是計算機(jī)系統(tǒng)中的音頻文件的生成過程:采樣、量化、編碼。人耳所能聽到的聲音,最低的頻率是 20Hz ~ 20KHZ,因此音頻文件格式的最大帶寬是 20KHZ。

根據(jù)奈奎斯特的理論,只有采樣頻率高于聲音信號最高頻率的兩倍時,才能把數(shù)字信號表示的聲音還原成為原來的聲音,所以音頻文件的采樣率一般在 40~50KHZ,比如最常見的 CD 音質(zhì)采樣率 44.1KHZ。

對聲音進(jìn)行采樣、量化過程被稱為脈沖編碼調(diào)制(Pulse Code Modulation),簡稱PCM。PCM 數(shù)據(jù)是最原始的音頻數(shù)據(jù)完全無損,所以 PCM 數(shù)據(jù)雖然音質(zhì)優(yōu)秀但體積龐大,為了解決這個問題先后誕生了一系列的音頻格式,這些音頻格式運(yùn)用不同的方法對音頻數(shù)據(jù)進(jìn)行壓縮,其中有無損壓縮(ALAC、APE、FLAC)和有損壓縮(MP3、AAC、OGG、WMA)兩種。


二、錄音方式

1、系統(tǒng)內(nèi)錄

直接上 Google 官方的文檔,大意就通過該接口可以進(jìn)行實(shí)時字幕和游戲內(nèi)錄音。這里不準(zhǔn)備深入,因?yàn)橛残砸?Android Q 及以上系統(tǒng)版本(文末有 AudioPlaybackCapture 使用實(shí)例可以參考):


2、麥克風(fēng)錄制

麥克風(fēng)錄制要特別注意的兩個情況:

同時只能有一個實(shí)例存在,比如有 GVoice 在錄音,那么其他都要歇菜了。官方文檔 “共享音頻輸入” 有詳細(xì)的說明。

另一種情況就是不可控(可能會錄制到 ”黃、爆” 音頻)。

2.1、基本概念

Android 系統(tǒng)提供的錄制麥克風(fēng)方式就兩種:MediaRecorder 和 AudioRecord:

  • MediaRecorder:簡易模式,調(diào)用簡單,只有開始、結(jié)束,錄音之后的文件也是指定編碼格式,系統(tǒng)播放器可以直接播放。
  • AudioRecord:原始模式,可以暫停、繼續(xù),可以實(shí)時獲取到 PCM 數(shù)據(jù)然后進(jìn)行音視頻的混合,也是錄屏軟件經(jīng)常使用的接口。

2.2、麥克風(fēng)內(nèi)錄的另類實(shí)現(xiàn)

通過上面的 AudioRecord 的代碼可以發(fā)現(xiàn),輸入源是可以配置的,并且通過接口文檔很快就發(fā)現(xiàn) REMOTE_SUBMIX 這個輸入源也可以實(shí)現(xiàn)內(nèi)錄功能,但是有兩個必要條件:

  • 需要系統(tǒng)權(quán)限,就是需要在 Android 源碼中進(jìn)行編譯的工程才可以獲取系統(tǒng)簽名權(quán)限
  • 會截走揚(yáng)聲器和耳機(jī)的聲音,也就是說在錄音時本地?zé)o法播放聲音

3、Hook 內(nèi)錄

通過以下 Android 的音頻系統(tǒng)架構(gòu)圖可以看出,Android 提供的唯二接口:MediaPlayer 和 AudioTrack,最終都是經(jīng)過 AudioFlinger 的 AudioStreamOut::write(const void *buffer, size_t numBytes) 把數(shù)據(jù)傳遞到硬件層:

通過 inline hook 的形式可以導(dǎo)出音頻數(shù)據(jù),目前 KM 上已經(jīng)有同事實(shí)踐成功,具體可以參考鏈接:

但是,inline hook 需要操作寄存器并且方案通用性欠佳,所以不建議使用 inline hook。不過,在音頻數(shù)據(jù)流轉(zhuǎn)的過程中截取數(shù)據(jù)的形式是通用做法,引擎內(nèi)錄就是借鑒的這種做法。在更高的層級進(jìn)行的獲取行為,并且由于層級比較高,所以無法做到一個方案覆蓋全的情況。幾乎都是跟引擎密切相關(guān),但是也有好的方面,就是穩(wěn)定性得到了保證并且可以統(tǒng)一多端的獲取邏輯。

4、引擎內(nèi)錄

引擎內(nèi)錄可以統(tǒng)一 Android、iOS、PC 多端音頻獲取邏輯


從上圖可以看出,整個獲取內(nèi)音的邏輯很簡單,但是,引擎這么多,引擎插件怎么寫就成了一個難題

我們先從最簡單的 Unity FMOD 開始。

4.1、Unity FMOD 內(nèi)錄

Unity 內(nèi)置的 Audio 內(nèi)部使用的是 FMOD,但是沒有導(dǎo)出接口,所以無法使用 FMOD 插件的方式。

通過查找 ,Unity 給出類似的接口,簡單實(shí)現(xiàn)如下,具體的請查看附件 Ex 和 FmodSu。

集成的話,只需要把 Ex 掛載到 AudioListener 所在的主 Camera 就可以(保存成 PCM 文件是常用的調(diào)試技巧):

public class ExportAudioRes : MonoBehaviour { ... void OnAudioFilterRead(float[] data, int channels) { FmodSu(data, da, (uint)channels); if (DebugInGame) { // 把音頻數(shù)據(jù)直接保存成 PCM 文件,這樣就可以定位是否是音頻本身的問題 (data); } } }

4.2、 FMOD Studio 內(nèi)錄

感覺這是廢話:安裝 FMOD Studio ,打開工程導(dǎo)入 FMOD for Unity

如果只是測試,可以直接使用 FMOD Studio 自帶的樣例的 bank 文件,F(xiàn)MOD 在 Unity 里面的配置也比較簡單,如下動圖所示,設(shè)置 bank 路徑然后添加事件響應(yīng)就可以:

接下來是 FMOD 插件實(shí)現(xiàn)的關(guān)鍵代碼:

4.3、 Wwise 內(nèi)錄

安裝 wwise Launcher 之后可以在本地路徑下找到 AkDelay 的源碼,通過改造源碼添加轉(zhuǎn)發(fā)器就可以實(shí)現(xiàn)自定義插件:

D:\Program Files (x86)\Audiokinetic\Wwise 2017.1.9.6501\SDK\samples\Plugins\AkDelay //通過修改上面的工程名,就可以得到一個自定義插件,有需要可以找我要工程源碼

這里的關(guān)鍵就變成,如何在自定義插件里面把 “音頻轉(zhuǎn)發(fā)器” 這個庫給拉起來?為了減少工程之間的依賴,Unity 里面可以通過 PInvoke 的形式動態(tài)拉起,但是在 wwise 插件里面就需要另辟蹊徑,但是肯定還是想使用動態(tài)打開庫的形式。直接上代碼,大體如下:

另外需要注意的就是 wwise 插件需要掛載到 Master Audio Bus 上,并且不能同時掛載多個,否則錄制出來的聲音會疊加在一起:


前面只是拋磚引玉。

想要實(shí)現(xiàn)一個插件遠(yuǎn)比上面說的復(fù)雜。因?yàn)闆]有考慮版本兼容問題、插件的編譯環(huán)境、動態(tài)獲取庫代碼健壯性、不同平臺差異兼容、插件集成等等問題。

5、思考擴(kuò)展

既然引擎層面都有插件特效,那么 Android 原生應(yīng)該也有對應(yīng)的功能才對?是否可以利用呢?

//下面是摘抄于 Google 的文檔,Google 早就料到會有人像我這樣思考, 還特別提醒:這不是音頻錄制接口,別瞎用

最后在文章末尾分享一份Android學(xué)習(xí)PDF+架構(gòu)視頻+面試文檔+源碼筆記,高級架構(gòu)技術(shù)進(jìn)階腦圖、Android開發(fā)面試專題資料,高級進(jìn)階架構(gòu)資料給大家

非常適合近期有面試和想在技術(shù)道路上繼續(xù)精進(jìn)的朋友。也是希望可以幫助到大家提升進(jìn)階

如果你覺得自己學(xué)習(xí)效率低,缺乏正確的指導(dǎo),可以加入資源豐富,學(xué)習(xí)氛圍濃厚的技術(shù)圈一起學(xué)習(xí)交流吧!

1.《「Android 音頻」“聲音”從何而來》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《「Android 音頻」“聲音”從何而來》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/3173272.html

上一篇

a站手機(jī)uid怎么看?我來告訴你答案觸樂夜話:B站喜敲鐘,A站不輕松

bank格式音頻怎么打開?總結(jié)很全面速看!1分鐘記一個單詞(第1782個)bank

  • bank格式音頻怎么打開?總結(jié)很全面速看!1分鐘記一個單詞(第1782個)bank
  • bank格式音頻怎么打開?總結(jié)很全面速看!1分鐘記一個單詞(第1782個)bank
  • bank格式音頻怎么打開?總結(jié)很全面速看!1分鐘記一個單詞(第1782個)bank
bank格式音頻怎么打開看這里!常見音頻格式的任意切換方式,獻(xiàn)給自媒體的小兄弟們

bank格式音頻怎么打開看這里!常見音頻格式的任意切換方式,獻(xiàn)給自媒體的小兄弟們

bank格式音頻怎么打開相關(guān)介紹,常見音頻格式之間的轉(zhuǎn)換方法 常見的聲音格式有多種,包括WAV、MIDI、MP3、RA、MP4等。 我們該如何實(shí)現(xiàn)各種聲音格式間的轉(zhuǎn)換呢?如果你仔細(xì)看看每個音頻之間的關(guān)系,你會發(fā)現(xiàn),最常用的就是WAV文...