音視頻的基礎:音頻

直播流程

一次直播中主播端采集音視頻編碼上傳數據到服務器捣卤,觀眾端不斷的拉取數據四瘫,數據解碼音視頻渲染到手機耕肩。

音頻數據流格式的變化

音頻采集上來的數據格式是pcm因妇,pcm格式的數據非常龐大问潭,不適合在網絡上傳播,所以我們用編碼器把pcm數據格式處理為aac或者mp3格式婚被,編碼后的數據再加個殼封裝成flv或者mp4多媒體文件狡忙。在觀眾端音頻的數據格式走向相反。一般直播過程中不需要再把編碼后的aac數據封裝成多媒體文件址芯,而是直接在網絡中傳輸aac格式的音頻數據灾茁。

音頻采集三要素

采樣大小:一個采樣由多少bit存放,一般是16bit谷炸。

采樣率:采樣頻率8k北专、16k、32k旬陡、44.1k拓颓。

聲道數:單聲道、雙聲道描孟、多聲道驶睦。

采樣大小越大,聲音的強度越高匿醒,采樣率越大场航,聲音的還原度越高。

音頻編碼

有損壓縮

人類聽覺范圍在20Hz~20kHz廉羔,低于20Hz的是次聲波溉痢,高于20Hz的是超聲波。

根據頻域遮蔽效應蜜另,音頻中去除人類聽不到的音頻數據适室。

根據時域遮蔽效應,去除音頻中嘈雜的低音举瑰。

無損壓縮

對音頻數據熵編碼捣辆,熵編碼包括哈夫曼編碼、香農編碼此迅、算數編碼汽畴。

音頻編碼過程


編碼的代碼

?創(chuàng)建編碼器

? ? //avcodec_find_encoder(AV_CODEC_ID_AAC);

? ? AVCodec *codec = avcodec_find_encoder_by_name("libfdk_aac");


? ? //創(chuàng)建 codec 上下文

? ? AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);


? ? codec_ctx->sample_fmt = AV_SAMPLE_FMT_S16;? ? ? ? ? //輸入音頻的采樣大小

? ? codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO;? ? //輸入音頻的channel layout

? ? codec_ctx->channels =2;? ? ? ? ? ? ? ? ? ? ? ? ? ? //輸入音頻 channel 個數

? ? codec_ctx->sample_rate =44100;? ? ? ? ? ? ? ? ? ? //輸入音頻的采樣率

? ? codec_ctx->bit_rate =0; //AAC_LC: 128K, AAC HE: 64K, AAC HE V2: 32K

? ? codec_ctx->profile = FF_PROFILE_AAC_HE_V2;//閱讀 ffmpeg 代碼


? ? //打開編碼器

? ? ?ret = avcodec_open2(codec_ctx, codec,NULL)

?//將數據送編碼器

? ? ret = avcodec_send_frame(ctx, frame);

?//獲取編碼后的音頻數據

? ? ? ? ret = avcodec_receive_packet(ctx, pkt);

音頻采樣和重采樣

音頻采集命令行:

ffmpeg -f avfoundation -i :0 out.wav

音頻播放命令行:

ffplay out.wav

wav是音頻原始數據的一種格式,它實質上就是pcm數據包加上一個頭部耸序。這個頭部包含了很多的信息忍些,包括音頻的采樣率、采樣大小和聲道數坎怪。如果在音頻采集的時候罢坝,采集的數據格式為pcm格式

ffmpeg -f avfoundation -i :0 out.pcm

音頻播放命令就要指定音頻三要素的參數

ffplay -ar 44100 -ac 2 -f s16le out.pcm

ffmpeg代碼采集音頻流程


打開輸入設備

? ? avdevice_register_all();?//register audio device?

? ? //ctx

? ? AVFormatContext *fmt_ctx =NULL;

? ? AVDictionary *options =NULL;

? ? //[[video device]:[audio device]]

? ? char*devicename =":0";

? ? //get format

? ? AVInputFormat *iformat = av_find_input_format("avfoundation");

? ? //open device

ret = avformat_open_input(&fmt_ctx, devicename, iformat, &options)


數據包

FILE *outfile = fopen(path,'wb');

AVPacket ?pkt;

while(ret = av_read_frame(fmt_ctx,&pkt)== 0){

fwrite(pkt.data,pkt.size,1,outfile);

av_packet_unref(&pkt);

}

音頻重采樣是將音頻三元組采樣率、采樣大小搅窿、和通道數的值轉成另外一組值嘁酿。

例如:將441000/16/2轉成48000/16/2

為什么需要重新采樣

1 從設備采集的音頻數據和編碼器要求的數據不一致隙券。

2 揚聲器要求的音頻數據和要播放的音頻數據不一致。

采樣的代碼

?SwrContext* swr_ctx =NULL;

?swr_ctx = swr_alloc_set_opts(NULL,? ? ? ? ? ? ? ? //ctx

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AV_CH_LAYOUT_STEREO,//輸出channel布局

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AV_SAMPLE_FMT_S16,? //輸出的采樣格式

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 44100,? ? ? ? ? ? ? //采樣率

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AV_CH_LAYOUT_STEREO,//輸入channel布局

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AV_SAMPLE_FMT_FLT,? //輸入的采樣格式

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 44100,? ? ? ? ? ? ? //輸入的采樣率

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0,NULL);

?//重采樣

? ? ? ? swr_convert(swr_ctx,? ? ? ? ? ? ? ? ? ? //重采樣的上下文

? ? ? ? ? ? ? ? ? ? dst_data,? ? ? ? ? ? ? ? ? //輸出結果緩沖區(qū)

? ? ? ? ? ? ? ? ? ? 512,? ? ? ? ? ? ? ? ? ? ? ? //每個通道的采樣數

? ? ? ? ? ? ? ? ? ? (constuint8_t **)src_data,//輸入緩沖區(qū)

? ? ? ? ? ? ? ? ? ? 512);? ? ? ? ? ? ? ? ? ? ? //輸入單個通道的采樣數

注:本文代碼只是簡單示范闹司,實際操作中需要注意內存泄漏娱仔,設備狀態(tài)還有api返回值結果做些判斷。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末游桩,一起剝皮案震驚了整個濱河市牲迫,隨后出現的幾起案子,更是在濱河造成了極大的恐慌借卧,老刑警劉巖盹憎,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異谓娃,居然都是意外死亡脚乡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門滨达,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奶稠,“玉大人,你說我怎么就攤上這事捡遍⌒慷” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵画株,是天一觀的道長辆飘。 經常有香客問我,道長谓传,這世上最難降的妖魔是什么蜈项? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮续挟,結果婚禮上紧卒,老公的妹妹穿的比我還像新娘。我一直安慰自己诗祸,他們只是感情好跑芳,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布弟断。 她就那樣靜靜地躺著三热,像睡著了一般。 火紅的嫁衣襯著肌膚如雪末盔。 梳的紋絲不亂的頭發(fā)上功偿,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天盆佣,我揣著相機與錄音,去河邊找鬼。 笑死罪塔,一個胖子當著我的面吹牛投蝉,可吹牛的內容都是我干的养葵。 我是一名探鬼主播征堪,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼关拒!你這毒婦竟也來了佃蚜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤着绊,失蹤者是張志新(化名)和其女友劉穎谐算,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體归露,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡洲脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了剧包。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恐锦。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疆液,靈堂內的尸體忽然破棺而出一铅,到底是詐尸還是另有隱情,我是刑警寧澤堕油,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布潘飘,位于F島的核電站,受9級特大地震影響掉缺,放射性物質發(fā)生泄漏卜录。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一眶明、第九天 我趴在偏房一處隱蔽的房頂上張望艰毒。 院中可真熱鬧,春花似錦赘来、人聲如沸现喳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗦篱。三九已至,卻和暖如春幌缝,著一層夾襖步出監(jiān)牢的瞬間灸促,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浴栽,地道東北人荒叼。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像典鸡,于是被迫代替她去往敵國和親被廓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容