ffmpeg 音頻轉換

音頻轉換主要API
swr_alloc_set_opts 設置轉換的參數


  /**
         如果需要,分配SwrContext并設置/重置公共參數。
          此函數不需要使用swr_alloc()分配。 另一方面,swr_alloc()可以使用swr_alloc_set_opts()在分配的上下文上設置參數。
          
         * 初始化resampler
         * @param s               現有的Swr上下文(如果可用),否則為NULL
         * @param out_ch_layout   輸出通道布局(AV_CH_LAYOUT_ *)
         * @param out_sample_fmt  輸出樣本格式(AV_SAMPLE_FMT_ *)
         * @param out_sample_rate 輸出采樣率(頻率,單位:Hz)
         * @param in_ch_layout    輸入通道布局(AV_CH_LAYOUT_ *)
         * @param in_sample_fmt   輸入樣本格式(AV_SAMPLE_FMT_ *)
         * @param in_sample_rate  輸入采樣率(頻率,Hz)
         * @param log_offset      logging level offset
         * @param log_ctx          父日志記錄上下文,可以為NULL
          返回 錯誤時為NULL,否則分配上下文
          
         */


truct 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_convert 在上面轉換參數設置后,進行音頻轉換

  /**
     swr_convert 音頻數據轉換 (使用avcodec_decode_audio4函數來解碼音頻,但解碼得到的數據類型為float 4bit,而播放器播放的格式一般為S16(signed 16bit),就需要對解碼得到的數據進行轉換)     in和in_count可以設置為0,以清除最后幾個樣本
如果提供的輸入多于輸出空間,則將緩沖輸入。 您可以通過使用swr_get_out_samples()檢索給定數量的輸入樣本的所需數量的輸出樣本的上限來避免這種緩沖。 轉換將直接運行而無需復制。
        參數1 s: 分配的Swr上下文,并設置了參數
        參數2 out: 輸出緩沖區,如果打包了音頻,則僅需要設置第一個
        參數3 out_count: 每通道樣本中可用于輸出的空間量
        參數4 in: 輸入緩沖區,在打包音頻的情況下僅需要設置第一個
        參數5 in_count: 一個通道中可用的輸入樣本數
        返回每個通道輸出的樣本數,錯誤時為負值
 */
 int swr_convert(
        struct SwrContext *s, 
        uint8_t **out, 
        int out_count,
        const uint8_t **in ,
        int in_count);

音頻轉換的原則是時長不變,不管轉換成何種格式,音頻總時長一樣

影響音頻播放時長的因素是每幀的采樣數和采樣率。
現在有mp3 每幀1152, 采樣率48000
aac 每幀1024, 采樣率44100
44100的aac每幀的播放時長=1024/44100.每秒有44100/1024幀,每個aac采樣的播放時長是1/44100秒
48000的mp3,每幀的播放時長=1152/48000,每秒有48000/1152幀。每個mp3采樣的播放時長是1/48000秒
這里我們就能看出,不可能一個aac幀轉出一個mp3幀,比例不可能1:1 。具體能轉多少,需要計算。這就是上面的轉換在干的事,到底在轉換什么,實質就是轉換一個每幀aac里面有1024個采樣,看能轉出多個mp3性質的采樣。

把一幀aac變成一幀mp3,能從每幀aac的1024個采樣身上重采樣出多少個mp3幀的采樣,這個值記作K,就是上面的dst_nb_samples
根據我們的音頻總時長不變原則,
(44100/1024) * K * (1/48000)=1秒 (src_rate/src_nb_samples =dst_rate/K)

即1秒鐘的aac總幀數每個aac幀能轉換的mp3采樣數 每個mp3采樣的播放時長=轉換出來的mp3也是1s
計算得K=1114.57

1114.57是不夠一幀mp3幀的,這個數也是一個計算出來的理論值,實際采樣個數肯定也不可能是一個小數,實際到底轉了多少,sws_convert函數的返回值告訴你,實際編碼過程中,我們也是通過累計的方式,夠了1152個采樣,我們才組裝出一個mp3幀

swr_convert 返回的輸出樣本數,可以根據輸入樣本數計算出來

條件1: 首先需要滿足: out_count(輸出通道可以接收的樣本空間)> in_count (輸入樣本數)

否則輸入的數據過大,輸出接收空間不足以接收所有的輸入數據

滿足條件1后,可計算swr_convert 返回的輸出樣本數。
例如
1幀數據,
采樣數 pAudioFrame->nb_samples = 1024
輸入采樣率為 in_sample_rate = 44100
輸出采樣率 out_sample_rate = 44100 * 2
那么經過swr_convert轉換出來的結果就近似 2048 (具體數值以swr_convert返回值為準)
也滿足上面的公式

(44100/1024) * K * (1/44100 * 2)=1秒 

swr_alloc_set_opts設置的輸出采樣頻率越高,swr_convert轉換的采樣數越大,才能保證時間一致

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • 不同于視頻采集一幀編碼一幀,音頻采集和編碼之間稍微復雜一些,記錄下相關內容 音頻采集 在windows上獲取音頻的...
    玖零儛閱讀 12,756評論 0 7
  • Android音頻開發(1):基礎知識 導讀 人的說話頻率基本上為300Hz3400Hz,但是人耳朵聽覺頻率基本上...
    我們都很努力著閱讀 751評論 0 2
  • 概述 本片文章主要介紹音頻基礎,在做音頻開發之前首先必須要對音頻的相關概念了解。以下是具體內容概述: 常見的音頻格...
    iosmedia閱讀 2,707評論 0 1
  • 采樣頻率是指將模擬聲音波形進行數字化時,每秒鐘抽取聲波幅度樣本的次數。。正常人聽覺的頻率范圍大約在20Hz~20k...
    rogerwu1228閱讀 12,376評論 0 3
  • [TOC] 開始前的BB 有些沒有接觸過的童鞋可能還不知道音視頻同步是什么意思,大家印象中應該看到過這樣的視頻,畫...
    Mirs閱讀 2,260評論 0 10