part05_ffmpeg實(shí)現(xiàn)本地音頻轉(zhuǎn)碼pcm輸出

一帕识、音頻基礎(chǔ)知識(shí)

  • 【通道數(shù)】

    即聲音的通道的數(shù)目泛粹。常有單聲道和立體聲之分,單聲道的聲音只能使用一個(gè)喇叭發(fā)聲(有的也處理成兩個(gè)喇叭輸出同一個(gè)聲道的聲音)肮疗,立體聲可以使兩個(gè)喇叭都發(fā)聲(一般左右聲道有分工) ,更能感受到空間效果扒接,當(dāng)然還有更多的通道數(shù)伪货。

  • 【采樣頻率】

    采樣頻率即取樣頻率, 指每秒鐘取得聲音樣本的次數(shù)。采樣頻率越高,聲音的質(zhì)量也就越好,聲音的還原也就越真實(shí)钾怔,但同時(shí)它占的資源比較多碱呼。由于人耳的分辨率很有限,太高的頻率并不能分辨出來。22050 的采樣頻率是常用的, 44100已是CD音質(zhì), 超過48000或96000的采樣對(duì)人耳已經(jīng)沒有意義宗侦。

    根據(jù)奈奎斯特采樣定理愚臀,當(dāng)采樣頻率fs.max大于信號(hào)中最高頻率fmax的2倍時(shí)(fs.max>2fmax),采樣之后的數(shù)字信號(hào)完整地保留了原始信號(hào)中的信息矾利。我們?nèi)硕梢月牭降穆曇纛l率在20Hz-220KHz之間的聲波姑裂,所以我們做音頻采樣時(shí)一般采用22000 * 2 + 100 = 44100 Hz(多采100Hz的偏差)

  • 【采樣位數(shù)】

    采樣位數(shù)即采樣值或取樣值(就是將采樣樣本幅度量化)。它是用來衡量聲音波動(dòng)變化的一個(gè)參數(shù)男旗,也可以說是聲卡的分辨率舶斧。它的數(shù)值越大,分辨率也就越高察皇,所發(fā)出聲音的能力越強(qiáng)茴厉。

      每個(gè)采樣數(shù)據(jù)記錄的是振幅, 采樣精度取決于采樣位數(shù)的大小:
      1 字節(jié)(也就是8bit) 只能記錄 256 個(gè)數(shù), 也就是只能將振幅劃分成 256 個(gè)等級(jí);
      2 字節(jié)(也就是16bit) 可以細(xì)到 65536 個(gè)數(shù), 這已是 CD 標(biāo)準(zhǔn)了;
      4 字節(jié)(也就是32bit) 能把振幅細(xì)分到 4294967296 個(gè)等級(jí), 實(shí)在是沒必要了.
    
  • 【音頻播放】

    原生的音頻格式為pcm,即我們平時(shí)的.MP3等音頻封裝格式文件最終到喇叭播放時(shí)已經(jīng)將其轉(zhuǎn)碼為pcm格式的音頻數(shù)據(jù)什荣,pcm的音頻數(shù)據(jù)體積比壓縮格式要大很多倍矾缓。

二、本地音頻轉(zhuǎn)碼成pcm輸出到文件

    extern "C" {
    //封裝格式
    #include "libavformat/avformat.h"
    //解碼
    #include "libavcodec/avcodec.h"
    //縮放
    #include "libswscale/swscale.h"
    //重采樣
    #include "libswresample/swresample.h"
    };
    /**
     * 將本地音頻文件轉(zhuǎn)碼為pcm格式并保存到一個(gè)新文件上
     * input: 本地音頻文件路徑
     * output:轉(zhuǎn)換后的硬盤存儲(chǔ)路徑
     */
    void musicPlayer(const char *input,const char *output){
        av_register_all();
        AVFormatContext *pFormatCtx = avformat_alloc_context();
        //打開音頻文件
        if (avformat_open_input(&pFormatCtx, input, NULL, NULL) != 0) {
            LOGI("%s", "無法打開音頻文件");
            return;
        }
        //獲取輸入文件信息
        if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
            LOGI("%s", "無法獲取輸入文件信息");
            return;
        }
        //獲取音頻流索引位置
        int i = 0, audio_stream_idx = -1;
        for (; i < pFormatCtx->nb_streams; i++) {
            if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
                audio_stream_idx = i;
                break;
            }
        }
        //獲取解碼器
        AVCodecContext *codecCtx = pFormatCtx->streams[audio_stream_idx]->codec;
        AVCodec *codec = avcodec_find_decoder(codecCtx->codec_id);
        //打開解碼器
        if (avcodec_open2(codecCtx, codec, NULL) < 0) {
            LOGI("%s", "無法打開解碼器");
            return;
        }
        //壓縮數(shù)據(jù)
        AVPacket *packet = (AVPacket *) av_malloc(sizeof(AVPacket));
        //解壓縮數(shù)據(jù)
        AVFrame *frame = av_frame_alloc();
        //frame->16bit 44100 PCM 統(tǒng)一音頻采樣格式與采樣率
        SwrContext *swrContext = swr_alloc();
        //音頻格式  重采樣設(shè)置參數(shù)
        AVSampleFormat in_sample = codecCtx->sample_fmt;//原音頻的采樣位數(shù)
        //輸出采樣格式
        AVSampleFormat out_sample = AV_SAMPLE_FMT_S16;//16位
        int in_sample_rate = codecCtx->sample_rate;// 輸入采樣率
        int out_sample_rate = 44100;//輸出采樣
    
        //輸入聲道布局
        uint64_t in_ch_layout = codecCtx->channel_layout;
        //輸出聲道布局
        uint64_t out_ch_layout = AV_CH_LAYOUT_STEREO;//2通道 立體聲
    
        /**
         * struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
          int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
          int64_t  in_ch_layout, enum AVSampleFormat  in_sample_fmt, int  in_sample_rate,
          int log_offset, void *log_ctx);
         */
        swr_alloc_set_opts(swrContext, out_ch_layout, out_sample, out_sample_rate, in_ch_layout, in_sample,
                           in_sample_rate, 0, NULL);
        swr_init(swrContext);
        int got_frame = 0;
        int ret;
        int out_channerl_nb = av_get_channel_layout_nb_channels(out_ch_layout);
        LOGE("聲道數(shù)量%d ", out_channerl_nb);
        int count = 0;
        //設(shè)置音頻緩沖區(qū)間 16bit   44100  PCM數(shù)據(jù)
        uint8_t *out_buffer = (uint8_t *) av_malloc(2 * 44100);
        FILE *fp_pcm = fopen(output, "wb");//輸出到文件
        while (av_read_frame(pFormatCtx, packet) >= 0) {
    
            ret = avcodec_decode_audio4(codecCtx, frame, &got_frame, packet);
            LOGE("正在解碼%d", count++);
            if (ret < 0) {
                LOGE("解碼完成");
            }
            //解碼一幀
            if (got_frame > 0) {
                /**
                 * int swr_convert(struct SwrContext *s, uint8_t **out, int out_count,
                                    const uint8_t **in , int in_count);
                 */
                swr_convert(swrContext, &out_buffer, 2 * 44100,
                            (const uint8_t **) frame->data, frame->nb_samples);
                /**
                 * int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
                                   enum AVSampleFormat sample_fmt, int align);
                 */
                int out_buffer_size = av_samples_get_buffer_size(NULL, out_channerl_nb, frame->nb_samples,
                                                                 out_sample, 1);
                fwrite(out_buffer, 1, out_buffer_size, fp_pcm);//輸出到文件
            }
        }
        fclose(fp_pcm);
        av_frame_free(&frame);
        av_free(out_buffer);
        swr_free(&swrContext);
        avcodec_close(codecCtx);
        avformat_close_input(&pFormatCtx);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稻爬,一起剝皮案震驚了整個(gè)濱河市嗜闻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌因篇,老刑警劉巖泞辐,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竞滓,居然都是意外死亡咐吼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門商佑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锯茄,“玉大人,你說我怎么就攤上這事〖∮模” “怎么了晚碾?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喂急。 經(jīng)常有香客問我格嘁,道長,這世上最難降的妖魔是什么廊移? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任糕簿,我火速辦了婚禮,結(jié)果婚禮上狡孔,老公的妹妹穿的比我還像新娘懂诗。我一直安慰自己,他們只是感情好苗膝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布殃恒。 她就那樣靜靜地躺著,像睡著了一般辱揭。 火紅的嫁衣襯著肌膚如雪离唐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天界阁,我揣著相機(jī)與錄音侯繁,去河邊找鬼。 笑死泡躯,一個(gè)胖子當(dāng)著我的面吹牛贮竟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播较剃,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼咕别,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了写穴?” 一聲冷哼從身側(cè)響起惰拱,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啊送,沒想到半個(gè)月后偿短,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馋没,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年昔逗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篷朵。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勾怒,死狀恐怖婆排,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笔链,我是刑警寧澤段只,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站鉴扫,受9級(jí)特大地震影響赞枕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坪创,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一鹦赎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧误堡,春花似錦、人聲如沸雏吭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖们。三九已至悉抵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摘完,已是汗流浹背姥饰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孝治,地道東北人列粪。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像谈飒,于是被迫代替她去往敵國和親岂座。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 前言 說到視頻,大家自己腦子里基本都會(huì)想起電影手素、電視劇鸳址、在線視頻等等,也會(huì)想起一些視頻格式 AVI泉懦、MP4稿黍、RMV...
    ForestSen閱讀 22,820評(píng)論 10 202
  • 前言 本篇開始講解在Android平臺(tái)上進(jìn)行的音頻編輯開發(fā),首先需要對(duì)音頻相關(guān)概念有基礎(chǔ)的認(rèn)識(shí)祠斧。所以本篇要講解以下...
    Ihesong閱讀 7,753評(píng)論 2 18
  • 音頻技術(shù)開發(fā)闻察,我們得對(duì)聲音有所了解,掌握音頻的基礎(chǔ)知識(shí),這才能更好地去做技術(shù)開發(fā)辕漂。首先介紹音頻基礎(chǔ)知識(shí)呢灶,然后介紹音...
    安仔夏天勤奮閱讀 7,431評(píng)論 3 18
  • 原來視頻里說的是真的,“等我有時(shí)間我就回家钉嘹,等我有時(shí)間我就給您做頓好吃的鸯乃,等我看完這段我就和你嘮嗑”,每次和父母跋涣,...
    懿米柒柒閱讀 355評(píng)論 0 1
  • 靜思/文 從小在記憶中,我們父母輩的婚姻是在吵吵打打鬧鬧中過的沛贪,幾乎沒有哪家不吵不打不鬧的陋守。女人總是吵著,說的硬話...
    言靜思閱讀 650評(píng)論 6 13