97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠(yuǎn)見(jiàn)教育科技集團(tuán) >> 新聞動(dòng)態(tài) >> Android資料 >> Android AudioTrack音頻播放分析  
 
Android AudioTrack音頻播放分析
分享到:

音頻資源在播放時(shí),會(huì)經(jīng)常出現(xiàn)沖突的情況,如在進(jìn)行音樂(lè)播放時(shí)有電話呼入、有新消息的提示音需要播放等,此類(lèi)的并發(fā)處理就需要有一個(gè)統(tǒng)一的處理策略。在Android系統(tǒng)開(kāi)發(fā)中,通過(guò)為不同的場(chǎng)景配置不同的播放接口,在底層執(zhí)行統(tǒng)一的并發(fā)策略,使得開(kāi)發(fā)者可以將精力更集中在應(yīng)用本身。

AudioTrack、MediaPlayer、SoundPool、Ringtone、JetPlayer等都是Android音頻處理中常用接口,本文將針對(duì)AudioTrack接口進(jìn)行詳細(xì)說(shuō)明。

AudioTrack

AudioTrack用于管理單個(gè)的音頻資源。 在構(gòu)造AudioTrack實(shí)例時(shí),會(huì)涉及到流類(lèi)型、采樣率、通道配置、音頻格式、緩沖大小、播放模式等因素。

AudioTrack支持STREAM_VOICE_CALL、STREAM_SYSTEM、STREAM_RING、STREAM_MUSIC和STREAM_ALARM等流類(lèi)型。

AudioTrack支持44100Hz、22050Hz、11025Hz等采樣率。

AudioTrack支持單聲道(CHANNEL_OUT_MONO)、立體聲(CHANNEL_OUT_STEREO)等兩種通道。

AudioTrack支持ENCODING_PCM_16BIT、ENCODING_PCM_8BIT等兩種編碼格式。

AudioTrack支持兩種播放模式:靜態(tài)模式(static mode)和流模式(Streaming mode)。其中靜態(tài)模式由于沒(méi)有從Java層向原生層傳遞數(shù)據(jù)造成的延遲,時(shí)延很小,當(dāng)然受限于音頻緩沖的大小,通常在游戲場(chǎng)景中用于播放時(shí)長(zhǎng)很短的音頻資源。當(dāng)音頻流較大不足以在音頻緩沖中一次寫(xiě)入時(shí),可采用流模式。

AudioTrack的播放狀態(tài)包括PLAYSTATE_STOPPED、PLAYSTATE_PAUSED、PLAYSTATE_PLAYING等。

AudioTrack實(shí)例的狀態(tài)包括STATE_INITIALIZED、STATE_NO_STATIC_DATA、STATE_UNINITIALIZED等。

向音頻緩沖中添加數(shù)據(jù)的方法為write()。在設(shè)置音頻緩沖時(shí),其大小與采樣率、通道和音頻格式有關(guān)。其計(jì)算公式為:

緩沖大小=小幀數(shù)×(通道==CHANNEL_OUT_STEREO?2:1)×(音頻格式== PCM16?2:1)
而小幀數(shù)則受制于采樣率和音頻設(shè)備的延遲等因素。

另外,在Android 2.3中,還引入了會(huì)話的概念,便于對(duì)單曲的音效進(jìn)行處理。相應(yīng)的方法包括:attachAuxEffect()、getAudioSessionId()、setAuxEffectSendLevel()等。

通過(guò)AudioTrack.OnPlaybackPositionUpdateListener監(jiān)聽(tīng)器可以監(jiān)聽(tīng)播放進(jìn)度。

下面是一個(gè)背景音頻的播放過(guò)程:

代碼10-3 AudioTrack播放音頻文件

public class BackgroundAudio extends Thread {
    public static final int SAMPLE_RATE = 16000;
    public static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
    public static final int BYTES_PER_SAMPLE = 2;
    public static final int PLAYBACK_STREAM = AudioManager.STREAM_MUSIC;
    ……
    public BackgroundAudio(byte[] data) {
        //計(jì)算緩沖大小
        final int minBufferSize = (BUFFER_TIME *SAMPLE_RATE*BYTES_PER_SAMPLE) / 1000;
        //計(jì)算硬件的小緩沖
        final int minHardwareBufferSize =
            AudioTrack.getMinBufferSize(SAMPLE_RATE,
    AudioFormat.CHANNEL_OUT_MONO,AUDIO_FORMAT);
        mBufferSize = Math.max(minHardwareBufferSize, minBufferSize);
        mAudioTrack = new AudioTrack(PLAYBACK_STREAM,
            SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
            AUDIO_FORMAT, mBufferSize, AudioTrack.MODE_STREAM);
        if (mAudioTrack.getState() == AudioTrack.STATE_INITIALIZED) {
            writeAudio();
            start(); // 啟動(dòng)背景線程去推送音頻數(shù)據(jù)
            mAudioTrack.play();
        } else {
            Log.e(TAG, "Error initializing audio track.");
        }
    }
    ……
    private void writeAudio() {
        int len = mData.length;
        int count;
        int maxBytes = Math.min(mBufferSize, len - mPos);

    count = mAudioTrack.write(mData, mPos, maxBytes);
        if (count < 0) {
            Log.e(TAG, "Error writing looped audio data");
            halt();
            return;
        }
        mPos += count;
        if (mPos == len) {
        mPos = 0; // Wraparound
        }
    }
    }

 
 更多相關(guān)文章

·Android AudioManager音量控制流程
·Android音頻處理的基本接口
·Android編譯過(guò)程詳解(三)
·Android HAL 開(kāi)發(fā)
·Android編譯過(guò)程詳解(二)