從源碼中看AudioTrack對采樣率,通道數(shù)和AudioFormat的限制

在創(chuàng)建audiotrack中傳入的采樣率通道和audioFormat知押,會共同決定minBufferSize肥橙。同樣會在getMinBufferSize()方法中check,源碼API23.AudioTrack的構(gòu)造函數(shù)中也會對相應(yīng)參數(shù)校驗秸侣,但這里只看getMinBufferSize()方法存筏。

    static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) {
    int channelCount = 0;
    switch(channelConfig) {
    case AudioFormat.CHANNEL_OUT_MONO:
    case AudioFormat.CHANNEL_CONFIGURATION_MONO:
        channelCount = 1;
        break;
    case AudioFormat.CHANNEL_OUT_STEREO:
    case AudioFormat.CHANNEL_CONFIGURATION_STEREO:
        channelCount = 2;
        break;
    default:
        if (!isMultichannelConfigSupported(channelConfig)) {
            loge("getMinBufferSize(): Invalid channel configuration.");
            return ERROR_BAD_VALUE;
        } else {
            channelCount = AudioFormat.channelCountFromOutChannelMask(channelConfig);
        }
    }

    if (!AudioFormat.isPublicEncoding(audioFormat)) {
        loge("getMinBufferSize(): Invalid audio format.");
        return ERROR_BAD_VALUE;
    }

    // sample rate, note these values are subject to change
    if ( (sampleRateInHz < SAMPLE_RATE_HZ_MIN) || (sampleRateInHz > SAMPLE_RATE_HZ_MAX) ) {
        loge("getMinBufferSize(): " + sampleRateInHz + " Hz is not a supported sample rate.");
        return ERROR_BAD_VALUE;
    }

    int size = native_get_min_buff_size(sampleRateInHz, channelCount, audioFormat);
    if (size <= 0) {
        loge("getMinBufferSize(): error querying hardware");
        return ERROR;
    }
    else {
        return size;
    }
}

通道數(shù)

除了單聲道,就是立體聲了味榛,channelCount不是1就是2椭坚。
此外還有多聲道的支持判斷支持新設(shè)備,目前還沒有詳細(xì)學(xué)習(xí)搏色。使用其他的channelConfig有什么用處還不了解善茎。通過比對發(fā)現(xiàn),其他channelConfig應(yīng)該算是新特性频轿,至少在api15里面是沒有的垂涯。所以至少使用其中的一種CHANNEL_OUT_MONO,CHANNEL_CONFIGURATION_MONO航邢,CHANNEL_OUT_STEREO耕赘,CHANNEL_CONFIGURATION_STEREO。

sampleRateInHz

一個范圍限制膳殷。 api23里顯示的是從4000到192000操骡。老sdk中沒有這么寬的支持,api15中,是4000到48000,册招〔砑ぃ考慮到兼容性,采樣率還是盡量在4000-48000.具體選擇什么樣的采樣率還要看需求是掰,如果處理的是人聲虑鼎,人耳可以聽見的范圍在20-20k,根據(jù)耐奎斯特定律冀惭,至少也得是40k震叙。如果多音軌合成,盡量還是相同的采樣率散休,目前對android上重采樣的實現(xiàn)還沒有細(xì)研究媒楼。

/** Minimum value for sample rate */
private static final int SAMPLE_RATE_HZ_MIN = 4000;
/** Maximum value for sample rate */
private static final int SAMPLE_RATE_HZ_MAX = 192000;

audioFormate

這里調(diào)用了isPublicEncoding()方法,里面做了相應(yīng)判斷戚丸,但是要注意這里引用的是API23的代碼划址。

public static boolean isPublicEncoding(int audioFormat)
{
    switch (audioFormat) {
    case ENCODING_PCM_8BIT:
    case ENCODING_PCM_16BIT:
    case ENCODING_PCM_FLOAT:
    case ENCODING_AC3:
    case ENCODING_E_AC3:
    case ENCODING_DTS:
    case ENCODING_DTS_HD:
        return true;
    default:
        return false;
    }
}

雖然AudioFormate中定義了很多 ENCODING類型,允許的類型有限限府。目前看到的類型中夺颤,除了PCM_8BIT和PCM_16BIT,還有其他胁勺。但是老的sdk中僅允許PCM_8BIT和PCM_16BIT世澜,而且。署穗。寥裂。。
多看一眼注釋

 // These values must be kept in sync with core/jni/android_media_AudioFormat.h
// Also sync av/services/audiopolicy/managerdefault/ConfigParsingUtils.h
/** Audio data format: PCM 16 bit per sample. Guaranteed to be supported by devices. */
public static final int ENCODING_PCM_16BIT = 2;
/** Audio data format: PCM 8 bit per sample. Not guaranteed to be supported by devices. */
public static final int ENCODING_PCM_8BIT = 3;

ENCODING_PCM_8BIT 并不保證支持案疲,所以還是優(yōu)選PCM_16BIT封恰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市褐啡,隨后出現(xiàn)的幾起案子诺舔,更是在濱河造成了極大的恐慌,老刑警劉巖备畦,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件低飒,死亡現(xiàn)場離奇詭異,居然都是意外死亡萍恕,警方通過查閱死者的電腦和手機(jī)逸嘀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來允粤,“玉大人崭倘,你說我怎么就攤上這事翼岁。” “怎么了司光?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵琅坡,是天一觀的道長。 經(jīng)常有香客問我残家,道長榆俺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任坞淮,我火速辦了婚禮茴晋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘回窘。我一直安慰自己诺擅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布啡直。 她就那樣靜靜地躺著烁涌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酒觅。 梳的紋絲不亂的頭發(fā)上撮执,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音舷丹,去河邊找鬼抒钱。 笑死,一個胖子當(dāng)著我的面吹牛颜凯,可吹牛的內(nèi)容都是我干的继效。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼装获,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厉颤?” 一聲冷哼從身側(cè)響起穴豫,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逼友,沒想到半個月后精肃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帜乞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年司抱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黎烈。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡习柠,死狀恐怖匀谣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情资溃,我是刑警寧澤武翎,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站溶锭,受9級特大地震影響宝恶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趴捅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一垫毙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拱绑,春花似錦综芥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迟几,卻和暖如春消请,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背类腮。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工臊泰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚜枢。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓缸逃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厂抽。 傳聞我的和親對象是個殘疾皇子需频,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容