音視頻小白系統入門課-2

本系列筆記為博主學習李超老師課程的課堂筆記,僅供參閱

往期課程筆記傳送門:

  • 音視頻小白系統入門筆記-0
  • 音視頻小白系統入門筆記-1

課程實踐代碼倉庫:傳送門

音視頻編解碼

可以通過ffmpeg -f avfoundation -list_devices true -i "" 查看Mac設備支持的設備編號

編解碼器

上下行網絡一般是非對稱的(下行帶寬一般更大,因為大多數終端都是拉取數據)

壓縮-質量 trade off

壓縮方法:

  • 消除冗余信息:有損壓縮

    • 剔除人類聽覺范圍外的音頻 (20Hz-20kHz)

    • 被遮蔽的音頻信號(心理聲學模型)

      • 頻域遮蔽
        請添加圖片描述

      • 時域遮蔽

      請添加圖片描述

  • 無損壓縮:熵編碼

    • 哈夫曼編碼
    • 算數編碼
    • 香農編碼

    請添加圖片描述

常見的音頻編解碼器:

  • OPUS:新興、延遲小、壓縮率高,WebRTC
  • AAC:應用廣泛,支持好,取代mp3
  • Ogg:收費
  • Speex:混音消除,以前流行
  • G.711:窄帶音頻,固定電話,聲音損耗嚴重

壓縮效果:OPUS > AAC > Ogg

請添加圖片描述
請添加圖片描述

AAC編解碼器:

  • AAC LC(基礎,128k)
  • AAC HE V1(廢棄,按64k左右)+ SBR技術,按頻譜分開保存
  • AAC HE V2(添加新技術)+ PS技術,多聲道差異保存

AAC格式:

  • ADIF(Audio Data Interchange Format):從頭解碼,多用在磁盤文件
  • ADTS(Audio Data Transport Stream):每一幀有一個同步字,大一些,可以在音頻流的任意位置解碼

ADTS結構:7/9個字節,2字節CRC校驗

請添加圖片描述

Audio Object Types:

1 AAC Main
2 AAC LC

5 SBR : AAC HE V1

29 PS:AAC HE V2

Sampling Frequency Index:

4 44100 Hz

11 48000 HZ

ADTS頭規范驗證:http://p23.nl/projects/aac-header

  • ffmpeg -i demo.mp3 -vn -c:a libfdk_aac -ar 44100 -channel_layout mono/stereo -profile:a aac_he_v2 demo_mp3.aac
    • -i 指定輸入源
    • -vn 過濾視頻
    • -c:a libfdk_aac codec:audio 音頻編碼器指定為fdk_aac
    • -ar 44100 采樣率44.1kHz
    • -channel_layout stereo 立體聲采樣
    • -profile:a aac_he_v2設置音頻編碼格式

為了支持libfdk_aac庫,對于brew安裝的ffmpeg需要使用homebrew-ffmpeg第三方庫安裝支持fdk-aac的版本;對于源碼安裝的ffmpeg,需要在configure時打開libfdk-aac選項重新編譯

音頻重采樣:轉換音頻三元組(采樣率、位深/采樣大小、通道數)

什么是重采樣?

  • 目標:將音頻從一種采樣格式(如 48000Hz F32LE 單聲道)轉換為另一種(如 44100Hz S16LE 單聲道)。
  • 關鍵操作:
    • 采樣率轉換(如 48kHz → 44.1kHz):通過插值/抽取算法(如線性插值、sinc 濾波)調整樣本數量。
    • 格式轉換(如 F32LES16LE):量化位深,可能涉及縮放(如 float [-1,1]int16 [-32768,32767])。
    • 聲道布局調整(如 立體聲 → 單聲道):混合或選擇聲道。

為什么要重采樣:

  • 音頻設備采集數據與編碼器要求數據不一致
  • 揚聲器要求的音頻數據和播放數據不一致
  • 方便運算:混音消除等場景使用單聲道會方便運算

如何知道對應設備要求的規格?

  1. 了解音頻設備的參數
  2. 查看ffmpeg的源碼

為什么不把swr_init合并到swr_alloc_set_opts2中?

(1) 靈活性:允許動態修改配置- 用戶可能在 `alloc` 后需要 調整參數(例如根據實際輸入動態修改聲道布局),再調用 `swr_init()`。如果合并,每次修改都要重新分配內存,效率更低。(2) 延遲初始化:節省資源- 某些場景下,`SwrContext` 可能被創建但 不立即使用(如預初始化一組轉換器)。合并會導致無用的計算(如濾波器系數)提前執行。(3) 錯誤處理的清晰性- 分離設計允許:- 先檢查 `alloc` 是否成功(內存分配問題)。- 再檢查 `init` 是否成功(參數兼容性問題)。合并后難以區分錯誤類型。

為什么可以逐幀處理?

- 狀態保持:`SwrContext` 內部會緩存部分樣本,處理跨幀的連續性(例如 48kHz → 44.1kHz 時,一幀輸入可能對應不完整輸出幀)。
- 增量處理:每次調用 `swr_convert()` 時:- 輸入:當前幀的音頻數據(如 `2048字節 F32LE`)。- 輸出:盡可能多的重采樣后數據(可能比輸入少/多,取決于采樣率比)。- 剩余未處理的樣本會暫存在 `SwrContext` 中,等待下一幀輸入。

nb_sample 的作用

(1)定義- `nb_sample` 表示 單次處理的音頻樣本數(注意是“樣本數”而非“字節數”)。- 例如:若音頻是單聲道 `F32LE`(每個樣本占4字節),`2048字節` 對應 `2048 / 4 = 512` 個樣本,此時 `nb_sample = 512`。
- 它決定了每次調用 `swr_convert()` 時,輸入/輸出緩沖區的有效數據量。(2)為什么需要它?- 分塊處理:音頻數據通常是流式分塊傳輸的(比如每次從設備讀取一幀),`nb_sample` 告訴重采樣器當前塊有多少有效樣本需要處理。
- 緩沖區管理:輸入/輸出緩沖區需要預分配足夠空間,`nb_sample` 用于計算緩沖區大小(如 `av_samples_alloc_array_and_samples()`)。

為什么 swr_src_datauint8_t**(二級指針)?

根本原因:FFmpeg 對多聲道音頻的通用設計FFmpeg 的音頻處理 API(如 `swr_convert`、`av_samples_alloc_array_and_samples`)需要兼容 多聲道音頻的平面(Planar)存儲格式。對于多聲道音頻(如立體聲、5.1聲道),數據可能按以下兩種方式存儲:- 交錯(Interleaved):`[LRLRLR...]`(左右聲道數據交替排列)
- 平面(Planar):`[LLLL...]` + `[RRRR...]`(每個聲道單獨連續存儲)**內存布局示例**假設立體聲(2聲道)音頻:- **Planar 模式**:```cswr_src_data[0] = 左聲道數據指針 (LLLL...)swr_src_data[1] = 右聲道數據指針 (RRRR...)```- **Interleaved 模式**:```cswr_src_data[0] = 所有聲道交織數據指針 (LRLRLR...)swr_src_data[1] = NULL (未使用)```

AAC 編碼器的輸入要求

AAC 編碼器(如 `libfdk_aac` 或 FFmpeg 內置的 `aac`)通常支持以下格式:**采樣格式(Sample Format)**:- 必須為 **`AV_SAMPLE_FMT_S16`(16位整型)** 或 **`AV_SAMPLE_FMT_FLTP`(32位浮點平面格式)**。
- 如果設備采集的是其他格式(如 `AV_SAMPLE_FMT_U8`、`AV_SAMPLE_FMT_S32`),需轉換。**聲道布局(Channel Layout)**:- 支持單聲道(`AV_CH_LAYOUT_MONO`)或立體聲(`AV_CH_LAYOUT_STEREO`)。
- 若設備采集的是多聲道(如5.1),需降混(Downmix)或明確編碼器是否支持。**采樣率(Sample Rate)**:- 常見支持 16kHz、32kHz、44.1kHz、48kHz。
- 若設備采集的采樣率不匹配(如8kHz),需重采樣。

AVFrame:編碼前的數據

AVPacket:編碼后的數據

調用libfdk_aac編碼時運行報錯:

[libfdk_aac @ 0x138e82c90] frame_size (2048) was not respected for a non-last frame
avcodec_send_frame error -22: Invalid argument

經過查閱資料發現,libfkd-aac編碼器對每次發送幀的采樣數有要求

  • 單通道:必須是2048個采樣
  • 雙通道:必須是1024個采樣

前兩幀和最后一幀可以不滿足條件。我們音頻設備采集的一幀數據經過重采樣轉換往往不滿足條件,因此必須做一定的緩沖處理。

Swift調用C++:https://juejin.cn/post/7265999062242033724

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76908.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

外賣“三國殺”開新局,餓了么已手握AI牌

【潮汐商業評論/原創】 01 新戰役,新變量 外賣行業,又迎來了新一輪戰役。 前有京東宣布斥資百億進軍外賣市場,后有美團宣布發布即時零售品牌“美團閃購”。雙方在隔空秀肌肉、彰顯自身實力的同時,行業巨頭圍繞本地生活服務的攻…

HAProxy 和 Keepalived 區別

HAProxy 和 Keepalived 是在構建高可用和可擴展Web服務時常用的兩個開源軟件,但它們的核心功能和目的有顯著區別。 簡單來說: HAProxy: 主要是一個 負載均衡器 (Load Balancer) 和 反向代理 (Reverse Proxy)。它負責將客戶端的請求智能地分發到后端的多…

YOLO算法的革命性升級:深度解析Repulsion損失函數在目標檢測中的創新應用

## 一、目標檢測的痛點與YOLO的局限性 在自動駕駛、智能監控等復雜場景中,目標檢測算法常面臨致命挑戰——遮擋問題。當多個物體相互遮擋時,傳統檢測器容易出現漏檢、誤檢現象,YOLO系列算法盡管在速度與精度上表現優異,但在處理密集遮擋目標時仍存在明顯短板。 ### 1.1 遮…

第一篇:Django簡介

第一篇:Django簡介 文章目錄 第一篇:Django簡介一、純手寫一個簡易版的web框架1、軟件開發架構2、HTTP協議3、簡易的socket服務端4、wsgiref模塊5、動靜態網頁6、后端獲取當前時間展示到html頁面上7、字典數據傳給html文件8、數據從數據庫中獲取的展示到…

【筆記】CentOS7部署K8S集群

一、初始化(所有節點機器都要執行) 1. 關閉firewall防火墻 systemctl disable firewalld.service systemctl stop firewalld.service2. 關閉SELinux 臨時關閉 setenforce 0永久關閉 vim /etc/selinux/config SELINUXenforcing 改成 SELINUXdisable…

Ethan獨立開發產品日報 | 2025-04-22

1. Agent Simulate 用數千個數字人來測試你的人工智能應用。 Agent Simulate 讓你在發布之前,能夠在一個安全的環境中模擬和測試大型語言模型(LLM)代理。它幫助你調試行為、加快迭代速度,并降低生產風險,專為代理開發…

Photoshop安裝與配置--簡單攻略版

下載地址:Photoshop軟件工具下載 安裝完成后,即可運行Photoshop.exe;打開工具頁面后,按照下面簡單配置即可 1.編輯-》首選項-》常規 或者直接快捷鍵CtrlK 暫存盤:一定要設置為非C盤 2.性能 3.文件處理 以上配置比較基礎&#xf…

新手村:正則化

機器學習-正則化方法 新手村:正則化 什么是正則化? 正則化(Regularization) 是一種用于防止機器學習模型 過擬合(Overfitting)的技術。它通過在模型的 損失函數 中添加一個 懲罰項(Penalty Ter…

C語言 ——— 分支循環語句

目錄 分支循環語句 單分支 多分支 switch 分支語句 牛刀小試 判斷一個數是否是奇數 輸出 1-100之間 的奇數 計算 n 的階乘 計算 1! 2! 3! ... n! 在一個有序數組中查找具體的某一個數字 打印 100-200 之間的素數 求兩個整數的最大公約數 getchar函數 和 putc…

Element UI、Element Plus 里的表單驗證的required必填的屬性不能動態響應?

一 問題背景 想要實現: 新增/修改對話框中(同一個),修改時“備注”字段非必填,新增時"備注"字段必填 結果發現直接寫不生效-初始化一次性 edit: [{ required: true, message: "請輸入備注", trigger: "blur" }…

秀丸編輯器 使用技巧

參考資料 第II部?知っていると便利な秀丸の機能 検索テキストファイルの16進表示について秀丸エディタヘルプ目次秀丸エディタQ&A集(第9.6版)(HTML 形式)テンプレート(Ver9.43対応版) 目錄 零…

【期末復習-考試】軟件質量測試與保考試題庫(選擇題+填空題)

軟件質量測試與保證考試題庫(選擇題 填空題) 一、軟件測試基礎理論(200 題) (一)選擇題(100 題) 軟件測試的根本目的是( 發現軟件中的缺陷)A. 證明軟件無…

數據結構與算法學習筆記(Acwing提高課)----動態規劃·數字三角形

數據結構與算法學習筆記----動態規劃數字三角形 author: 明月清了個風 first publish time: 2025.4.23 ps??終于開始提高課的題啦,借的人家的號看,以后給y總補票叭,提高課的題比之前的多很多啊哈哈哈哈,基本上每種題型都對應了…

阿里巴巴安全工程師面試題:BAS

阿里巴巴新發布了針對應屆生的安全工程師招聘崗位,崗位要求: 研究新型前沿攻防技術,驗證正向和防御安全產品能力的有效性,挖掘其規則或引擎漏洞,并利用BAS(Breach and Attack Simulation)建立自…

【正則表達式】正則表達式使用總結

正則表達式除了匹配普通字符外,還可以匹配特殊字符,這些特殊字符被稱為“元字符”。? 特殊字符(元字符) ?限定符?:用于指定正則表達式中某個組件的出現次數。常見的限定符包括: *:0次或多次 +:1次或多次 ?:0次或1次 {n}:恰好n次…

數據庫對象與權限管理-Oracle數據字典詳解

1. 數據字典概念講解 Oracle數據字典是數據庫的核心組件,它存儲了關于數據庫結構、用戶信息、權限設置和系統性能等重要的元數據信息。這些信息對于數據庫的日常管理和維護至關重要。數據字典在數據庫創建時自動生成,并隨著數據庫的運行不斷更新。 數據…

鏈表系列一>兩數相加

目錄 題目:解析:方法:代碼:鏈表常用技巧: 題目: 鏈接: link 解析: 方法: 代碼: /*** Definition for singly-linked list.* public class ListNode {* int val;* …

FreeRTOS深度解析:隊列集(Queue Sets)的原理與應用

FreeRTOS深度解析:隊列集(Queue Sets)的原理與應用 什么是隊列集? 在FreeRTOS中,隊列集(Queue Sets,英文名xQueueSet)是一種強大的數據結構,用于高效管理多個隊列。它的…

QT creater和vs2017文件路徑問題

1. \\雙反斜杠,傳統寫法,需轉義 在 C/C 字符串中,\ 具有特殊含義,例如: \n 表示換行 \t 表示制表符 \" 表示雙引號 如果要表示一個真正的反斜杠,必須寫成 \\,否則編譯器會將其解釋為轉…

對流對象的理解

在c里,“流”可以理解為數據傳輸與操作的“介質”。 從輸入輸出角度來看,有輸入流(比如cin)和輸出流(cout)。對于輸入流,數據通過它從外部設備(例如鍵盤)“流入”程序內…