国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

安卓音視頻開發(fā)(3)—— AudioTrack兩種方式播放pcm音頻

這篇具有很好參考價(jià)值的文章主要介紹了安卓音視頻開發(fā)(3)—— AudioTrack兩種方式播放pcm音頻。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

之前學(xué)習(xí)了AudioRecord錄制pcm音頻,與之對(duì)應(yīng)的就是AudioTrack播放pcm音頻(MediaPlayer、SoundPool有其他應(yīng)用場(chǎng)景),它有兩種數(shù)據(jù)加載模式(MODE_STATIC、MODE_STREAM)。

模式

  • MODE_STATIC:這種模式下,一次將所有的數(shù)據(jù)放入一個(gè)固定的buffer,然后寫入到AudioTrack中,后續(xù)就不用繼續(xù)write了。這種模式占用的內(nèi)存較小,適用于短小的音頻,例如手機(jī)鈴聲和系統(tǒng)提示音等。

  • MODE_STREAM:這種模式會(huì)持續(xù)的把音頻數(shù)據(jù)寫入AudioTrack中,write動(dòng)作將堵塞直到數(shù)據(jù)流從java層傳輸?shù)絥ative層,適用于大文件或者播放時(shí)間較長(zhǎng)的文件。

STATIC模式流程

1.另起線程,將音頻文件寫入固定buffer。

2.寫入完成后,初始化AudioTrack(參數(shù)在上一節(jié)有詳細(xì)介紹),接收buffer并播放(play)。

    public void initStatic() {
        if (staticThread != null) {
            staticThread.interrupt();
        }
        staticThread = new Thread(new Runnable() {
            @Override
            public void run() {
                FileInputStream fileInputStream = null;
                try {
                    File file = new File(filePath);
                    fileInputStream = new FileInputStream(file);
                    long size = fileInputStream.getChannel().size();

                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(audiodata.length);
                    int byteValue = 0;
                    long startTime = System.currentTimeMillis();
                    while ((byteValue = fileInputStream.read()) != -1) {
                        byteArrayOutputStream.write(byteValue);
                    }
                    LogUtils.i("初始化完成" + (System.currentTimeMillis() - startTime));
                    audiodata = byteArrayOutputStream.toByteArray();

                    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
                            AudioFormat.ENCODING_PCM_16BIT, audiodata.length, AudioTrack.MODE_STATIC);
                    audioTrack.write(audiodata, 0, audiodata.length);
                    audioTrack.play();
                    LogUtils.i("Static播放");

                } catch (Exception e) {
                    e.printStackTrace();
                    LogUtils.e(e);
                } finally {
                    if (fileInputStream != null) {
                        try {
                            fileInputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        staticThread.start();
    }

STREAM模式流程

1.初始化AudioTrack。

2.另起線程,一邊寫入音頻流文件,一邊播放。

3.播放結(jié)束,關(guān)閉流。

    public void startStream() {
        if (streamThread != null) {
            streamThread.interrupt();
        }
        if (audioTrack != null) {
            audioTrack = null;
        }
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, 1600, AudioTrack.MODE_STREAM);
        streamThread = new Thread(new Runnable() {
            @Override
            public void run() {
                FileInputStream fileInputStream = null;
                File file = new File(filePath);
                try {
                    audioTrack.play();
                    fileInputStream = new FileInputStream(file);
                    int byteValue = 0;
                    while ((byteValue = fileInputStream.read(audiodata)) != -1) {
                        audioTrack.write(audiodata, 0, byteValue);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    LogUtils.e(e);
                } finally {
                    if (audioTrack != null) {
                        audioTrack.stop();
                        audioTrack = null;
                    }
                    if (fileInputStream != null) {
                        try {
                            fileInputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        streamThread.start();
    }

結(jié)語(yǔ)

其實(shí)MediaPlayer底層同樣使用了AudioTrack,但它封裝得比較全面,能支持多種格式得聲音,如MP3,AAC,WAV,OGG等,但是無(wú)法直接播放pcm文件。我們使用AudioTrack,它能控制和播放每一幀的音頻數(shù)據(jù),更接近底層。

本期博客參考:

灰色飄零博客園

需要源碼的盆友也可以訪問我的gitlub,源碼文章來源地址http://www.zghlxwxcb.cn/news/detail-420801.html

到了這里,關(guān)于安卓音視頻開發(fā)(3)—— AudioTrack兩種方式播放pcm音頻的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 安卓音視頻多對(duì)多級(jí)聯(lián)轉(zhuǎn)發(fā)渲染

    安卓音視頻多對(duì)多級(jí)聯(lián)轉(zhuǎn)發(fā)渲染

    最近利用自己以前學(xué)習(xí)和用到的音視頻知識(shí)和工程技能做了一個(gè)android的sdk,實(shí)現(xiàn)了本地流媒體ipc rtsp 拉流以及自帶mip usb等camera audio節(jié)點(diǎn)產(chǎn)生的流媒體通過webrtc sfu的方式進(jìn)行多對(duì)多級(jí)聯(lián)發(fā)布共享,網(wǎng)狀結(jié)構(gòu),p2p組網(wǎng),支持實(shí)時(shí)渲染以及轉(zhuǎn)推rtmp,webrtc,h264 h265 opus aac g711,均支持,在

    2024年02月14日
    瀏覽(22)
  • 嗶哩嗶哩視頻合并 B站緩存視頻合并 安卓版 音視頻合并 基于ffmpeg

    嗶哩嗶哩視頻合并 B站緩存視頻合并 安卓版 音視頻合并 基于ffmpeg

    此軟件是為了幫助網(wǎng)友合并嗶哩嗶哩緩存視頻,Android上將bilibili緩存視頻合并導(dǎo)出為mp4,你可以將它理解為一個(gè)專用的格式工廠,并不涉及破解相關(guān)內(nèi)容,僅僅用于學(xué)習(xí)技術(shù)交流,嚴(yán)禁用于商業(yè)用途,如有侵權(quán)請(qǐng)聯(lián)系我刪檔,對(duì)你帶來困惑和不便我深感抱歉。 合并(導(dǎo)出)B站緩

    2024年02月02日
    瀏覽(30)
  • 音視頻學(xué)習(xí)(二十)——rtsp收流(udp方式)

    音視頻學(xué)習(xí)(二十)——rtsp收流(udp方式)

    本文主要介紹通過udp方式實(shí)現(xiàn)rtsp拉流。 流程說明: 相較于tcp方式“信令+數(shù)據(jù)”復(fù)用同一連接拉流,udp方式拉流“信令+數(shù)據(jù)”采用不同的連接,信令傳輸采用tcp,流數(shù)據(jù)傳輸采用udp; 客戶端向服務(wù)端(設(shè)備等)發(fā)起tcp請(qǐng)求,用于后續(xù)信令交互; tcp連接成功后,開始rtsp信令

    2024年02月04日
    瀏覽(27)
  • linux 音視頻架構(gòu) linux音視頻開發(fā)

    轉(zhuǎn)載 mob6454cc65110a 2023-07-26 22:27:01 文章標(biāo)簽 linux 音視頻架構(gòu) ci QT 視頻教程 文章分類 架構(gòu) 后端開發(fā) 閱讀數(shù) 117 目錄 前言 1、軟件工具準(zhǔn)備 a. 錄音軟件 b. 錄屏軟件 c. 攝像頭軟件 d. 安卓屏幕操作軟件 e. 視頻剪輯軟件

    2024年02月07日
    瀏覽(30)
  • 音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式)

    音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式)

    本文主要介紹rtmp協(xié)議收流流程,在linux上搭建rtmp服務(wù)器,通過自研的rtmp收流庫(kù)發(fā)起取流請(qǐng)求,使用ffmpeg+qt實(shí)現(xiàn)視頻流的解碼與播放。 關(guān)于rtmp協(xié)議基礎(chǔ)介紹可查看:https://blog.csdn.net/www_dong/article/details/131026072 下載nginx 解壓,將nginx-rtmp-module拷貝至nginx-1.24.0目錄,如下所示:

    2024年02月03日
    瀏覽(45)
  • JavaCV音視頻開發(fā)寶典:UDP局域網(wǎng)組播推流,多播推流,局域網(wǎng)多網(wǎng)段推流,使用UDP方式推送TS組播流,實(shí)現(xiàn)UDP一對(duì)多組播

    JavaCV音視頻開發(fā)寶典:UDP局域網(wǎng)組播推流,多播推流,局域網(wǎng)多網(wǎng)段推流,使用UDP方式推送TS組播流,實(shí)現(xiàn)UDP一對(duì)多組播

    《JavaCV音視頻開發(fā)寶典》專欄目錄導(dǎo)航 《JavaCV音視頻開發(fā)寶典》專欄介紹和目錄 ? 在之前文章中我們已經(jīng)實(shí)現(xiàn)rtp點(diǎn)到點(diǎn)傳輸JavaCV音視頻開發(fā)寶典:rtp點(diǎn)到點(diǎn)音視頻傳輸(一對(duì)一音視頻直播)和rtp廣播JavaCV音視頻開發(fā)寶典:rtp廣播方式發(fā)送TS流音視頻傳輸(一對(duì)多音視頻會(huì)議

    2024年02月03日
    瀏覽(19)
  • Qt音視頻開發(fā)45-音視頻類結(jié)構(gòu)體參數(shù)的設(shè)計(jì)

    Qt音視頻開發(fā)45-音視頻類結(jié)構(gòu)體參數(shù)的設(shè)計(jì)

    視頻監(jiān)控內(nèi)核組件重構(gòu)和完善花了一年多時(shí)間,整個(gè)組件個(gè)人認(rèn)為設(shè)計(jì)的最好的部分就是各種結(jié)構(gòu)體參數(shù)的設(shè)計(jì),而且分門別類,有枚舉值,也有窗體相關(guān)的結(jié)構(gòu)體參數(shù),解碼相關(guān)的結(jié)構(gòu)體參數(shù),同時(shí)將部分常用的結(jié)構(gòu)體參數(shù)的獲取和設(shè)置單獨(dú)提供了函數(shù),參閱海康大華等大

    2024年02月05日
    瀏覽(30)
  • FFmpeg 播放器實(shí)現(xiàn)音視頻同步的三種方式

    FFmpeg 播放器實(shí)現(xiàn)音視頻同步的三種方式

    我們基于 FFmpeg 利用 OpenGL ES 和 OpenSL ES 分別實(shí)現(xiàn)了對(duì)解碼后視頻和音頻的渲染,本文將實(shí)現(xiàn)播放器的最后一個(gè)重要功能:音視頻同步。 老人們經(jīng)常說, 播放器對(duì)音頻和視頻的播放沒有絕對(duì)的靜態(tài)的同步,只有相對(duì)的動(dòng)態(tài)的同步,實(shí)際上音視頻同步就是一個(gè)“你追我趕”的過

    2024年02月06日
    瀏覽(29)
  • 開源IM即時(shí)通訊源碼-社交+電商+音視頻+直播-pc+web+ios+安卓-uniapp+php+mysql

    開源IM即時(shí)通訊源碼-社交+電商+音視頻+直播-pc+web+ios+安卓-uniapp+php+mysql

    ? / 產(chǎn)品介紹 / ? ? 即時(shí)通訊源碼是一個(gè)平臺(tái)或聊天應(yīng)用程序,使用戶能夠發(fā)送和接收即時(shí)消息并進(jìn)行連接。如今,在線交流已成為一種新常態(tài)。目前據(jù)統(tǒng)計(jì)超過30億人定期使用聊天應(yīng)用程序而這一數(shù)字將保持持續(xù)增長(zhǎng)。目前您可能需要一個(gè)新的聊天應(yīng)用程序來簡(jiǎn)化您自己組織

    2024年02月05日
    瀏覽(29)
  • Qt/C++音視頻開發(fā)46-音視頻同步保存到MP4

    用ffmpeg單獨(dú)做視頻保存不難,單獨(dú)做音頻保存也不難,難的是音視頻同步保存到MP4中,重點(diǎn)是音視頻要同步,其實(shí)這也不難,只要播放那邊音視頻同步后的數(shù)據(jù),寫入到文件即可。最難的是在播放過程中不斷隨機(jī)的切換播放進(jìn)度,而且還會(huì)暫停播放、暫停錄制的情況出現(xiàn),這

    2024年02月17日
    瀏覽(39)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包