最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android音頻系統(tǒng)AudioTrack使用方法詳解

 更新時(shí)間:2017年07月26日 11:03:01   作者:bzlj2912009596  
這篇文章主要為大家詳細(xì)介紹了Android音頻系統(tǒng)AudioTrack的使用方法,如何使用AudioTrack進(jìn)行音頻播放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

今天,簡(jiǎn)單講講AudioTrack的使用方法。

1、Android AudioTrack簡(jiǎn)介

在android中播放聲音可以用MediaPlayer和AudioTrack兩種方案的,但是兩種方案是有很大區(qū)別的,MediaPlayer可以播放多種格式的聲音文件,例如MP3,AAC,WAV,OGG,MIDI等。而AudioTrack只能播放PCM數(shù)據(jù)流。

事實(shí)上,兩種本質(zhì)上是沒(méi)啥區(qū)別的,MediaPlayer在播放音頻時(shí),在framework層還是會(huì)創(chuàng)建AudioTrack,把解碼后的PCM數(shù)流傳遞給AudioTrack,最后由AudioFlinger進(jìn)行混音,傳遞音頻給硬件播放出來(lái)。利用AudioTrack播放只是跳過(guò)Mediaplayer的解碼部分而已。Mediaplayer的解碼核心部分是基于OpenCORE 來(lái)實(shí)現(xiàn)的,支持通用的音視頻和圖像格式,codec使用的是OpenMAX接口來(lái)進(jìn)行擴(kuò)展。因此使用audiotrack播放mp3文件的話(huà),要自己加入一個(gè)音頻解碼器,如libmad。否則只能播放PCM數(shù)據(jù),如大多數(shù)WAV格式的音頻文件。

如果是實(shí)時(shí)的音頻數(shù)據(jù),那么只能用AudioTrack進(jìn)行播放。

2、如何使用AudioTrack進(jìn)行音頻播放

//根據(jù)采樣率,采樣精度,單雙聲道來(lái)得到frame的大小。  
int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K個(gè)點(diǎn)  
  AudioFormat.CHANNEL_CONFIGURATION_STEREO,//雙聲道 
  AudioFormat.ENCODING_PCM_16BIT);//一個(gè)采樣點(diǎn)16比特-2個(gè)字節(jié) 
 
//注意,按照數(shù)字音頻的知識(shí),這個(gè)算出來(lái)的是一秒鐘buffer的大小。 
//創(chuàng)建AudioTrack 
 
AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
  AudioFormat.CHANNEL_CONFIGURATION_ STEREO, 
  AudioFormat.ENCODING_PCM_16BIT, 
  bufsize, 
 
AudioTrack.MODE_STREAM);// 
trackplayer.play() ;//開(kāi)始 
trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//往track中寫(xiě)數(shù)據(jù) 
 
…. 
 
trackplayer.stop();//停止播放  
trackplayer.release();//釋放底層資源。 

這里需要解釋下兩個(gè)東西:

1.AudioTrack.MODE_STREAM:

AudioTrack中有MODE_STATIC和MODE_STREAM兩種分類(lèi)。STREAM的意思是由用戶(hù)在應(yīng)用程序通過(guò)write方式把數(shù)據(jù)一次一次得寫(xiě)到audiotrack中。這個(gè)和我們?cè)趕ocket中發(fā)送數(shù)據(jù)一樣,應(yīng)用層從某個(gè)地方獲取數(shù)據(jù),例如通過(guò)編解碼得到PCM數(shù)據(jù),然后write到audiotrack。

這種方式的壞處就是總是在JAVA層和Native層交互,效率損失較大。

而STATIC的意思是一開(kāi)始創(chuàng)建的時(shí)候,就把音頻數(shù)據(jù)放到一個(gè)固定的buffer,然后直接傳給audiotrack,后續(xù)就不用一次次得write了。AudioTrack會(huì)自己播放這個(gè)buffer中的數(shù)據(jù)。

這種方法對(duì)于鈴聲等內(nèi)存占用較小,延時(shí)要求較高的聲音來(lái)說(shuō)很適用。

2.StreamType

這個(gè)在構(gòu)造AudioTrack的第一個(gè)參數(shù)中使用。這個(gè)參數(shù)和Android中的AudioManager有關(guān)系,涉及到手機(jī)上的音頻管理策略。
Android將系統(tǒng)的聲音分為以下幾類(lèi)常見(jiàn)的(未寫(xiě)全):

 STREAM_ALARM:警告聲
 STREAM_MUSCI:音樂(lè)聲,例如music等
 STREAM_RING:鈴聲
 STREAM_SYSTEM:系統(tǒng)聲音
 STREAM_VOCIE_CALL:電話(huà)聲音

為什么要分這么多呢?以前在臺(tái)式機(jī)上開(kāi)發(fā)的時(shí)候很少知道有這么多的聲音類(lèi)型,不過(guò)仔細(xì)思考下,發(fā)現(xiàn)這樣做是有道理的。例如你在聽(tīng)music的時(shí)候接到電話(huà),這個(gè)時(shí)候music播放肯定會(huì)停止,此時(shí)你只能聽(tīng)到電話(huà),如果你調(diào)節(jié)音量的話(huà),這個(gè)調(diào)節(jié)肯定只對(duì)電話(huà)起作用。當(dāng)電話(huà)打完了,再回到music,你肯定不用再調(diào)節(jié)音量了。

其實(shí)系統(tǒng)將這幾種聲音的數(shù)據(jù)分開(kāi)管理,所以,這個(gè)參數(shù)對(duì)AudioTrack來(lái)說(shuō),它的含義就是告訴系統(tǒng),我現(xiàn)在想使用的是哪種類(lèi)型的聲音,這樣系統(tǒng)就可以對(duì)應(yīng)管理他們了。

代碼里首先獲取最小的分配內(nèi)存,然后創(chuàng)建AudioTrack,最后通過(guò)mAudioTrack.write(data, offset, length);將音頻數(shù)據(jù)進(jìn)行播放。

android音頻系統(tǒng)之AudioTrack的使用就講完了。

就這么簡(jiǎn)單。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)注Ionic底部導(dǎo)航按鈕tabs在android情況下浮在上面的處理

    關(guān)注Ionic底部導(dǎo)航按鈕tabs在android情況下浮在上面的處理

    Ionic是一款流行的移動(dòng)端開(kāi)發(fā)框架,但是剛?cè)腴T(mén)的同學(xué)會(huì)發(fā)現(xiàn),Ionic在iOS和Android的底部tabs顯示不一樣。在安卓情況下底部tabs會(huì)浮上去,下面給大家介紹下實(shí)現(xiàn)代碼,一起看看吧
    2016-12-12
  • Android SQLite數(shù)據(jù)庫(kù)增刪改查操作的使用詳解

    Android SQLite數(shù)據(jù)庫(kù)增刪改查操作的使用詳解

    本篇文章介紹了,在Android中SQLite數(shù)據(jù)庫(kù)增刪改查操作的使用詳解。需要的朋友參考下
    2013-04-04
  • Android中獲取設(shè)備的各種信息總結(jié)

    Android中獲取設(shè)備的各種信息總結(jié)

    相信各位Android的開(kāi)發(fā)者們都知道,現(xiàn)在幾乎所有的app都需要獲得設(shè)備信息,那么下面這篇文章就來(lái)詳細(xì)說(shuō)說(shuō)獲取設(shè)備信息的方法。
    2016-09-09
  • ubuntu上在androidstudio中啟動(dòng)emulator閃退的解決方法

    ubuntu上在androidstudio中啟動(dòng)emulator閃退的解決方法

    在AndrodStudio中點(diǎn)擊模擬器的啟動(dòng)按鈕后,模擬器界面彈出后,又立刻閃退。下面通過(guò)本文給大家分享ubuntu上在androidstudio中啟動(dòng)emulator閃退的解決方法,一起看看吧
    2017-07-07
  • android獲取手機(jī)唯一標(biāo)識(shí)的方法

    android獲取手機(jī)唯一標(biāo)識(shí)的方法

    這篇文章主要介紹了獲取安卓的手機(jī)或者平板的唯一標(biāo)識(shí)的方法,需要的朋友可以參考下
    2014-02-02
  • Kotlin面向?qū)ο笾R(shí)點(diǎn)講解

    Kotlin面向?qū)ο笾R(shí)點(diǎn)講解

    面向?qū)ο缶幊掏ㄟ^(guò)對(duì)事物的抽象,大大的簡(jiǎn)化了程序的開(kāi)發(fā)難度。我們常用的編程語(yǔ)言:Java、C++、Python都屬于面向?qū)ο缶幊?。Kotlin與java類(lèi)似,也是一種面向?qū)ο缶幊陶Z(yǔ)言。本文從面向?qū)ο笕齻€(gè)基本特征:封裝、繼承、多態(tài),來(lái)闡述一下Kotlin中的面向?qū)ο缶幊?/div> 2022-12-12
  • Android傳感器SensorEventListener之加速度傳感器

    Android傳感器SensorEventListener之加速度傳感器

    今天小編就為大家分享一篇關(guān)于Android傳感器SensorEventListener之加速度傳感器,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 如何利用Flutter仿寫(xiě)微信搜索頁(yè)效果

    如何利用Flutter仿寫(xiě)微信搜索頁(yè)效果

    這篇文章主要給大家介紹了關(guān)于如何利用Flutter仿寫(xiě)微信搜索頁(yè)效果的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Android 反射注解與動(dòng)態(tài)代理綜合使用詳解

    Android 反射注解與動(dòng)態(tài)代理綜合使用詳解

    本篇文章主要介紹了Android 反射注解與動(dòng)態(tài)代理綜合使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Android SwipeRefreshLayout下拉刷新組件示例

    Android SwipeRefreshLayout下拉刷新組件示例

    SwipeRefrshLayout是Google官方更新的一個(gè)Widget,可以實(shí)現(xiàn)下拉刷新的效果。本文主要介紹了Android之SwipeRefreshLayout下拉刷新組件示例,有興趣的可以了解一下。
    2017-02-02

最新評(píng)論

盐山县| 遂川县| 治县。| 孝感市| 宁夏| 靖西县| 岳阳市| 北辰区| 达日县| 黔江区| 汶川县| 五台县| 淮南市| 本溪| 吕梁市| 鞍山市| 孟州市| 永年县| 肇庆市| 蒙阴县| 蚌埠市| 阳东县| 西丰县| 阳高县| 雷波县| 新津县| 九龙坡区| 红原县| 台南市| 长治县| 平顺县| 广州市| 民丰县| 沙湾县| 屏山县| 准格尔旗| 莱阳市| 南川市| 华坪县| 大冶市| 福安市|