本系列筆記為博主學習李超老師課程的課堂筆記,僅供參閱
音視頻小白系統入門課 音視頻基礎+ffmpeg原理
緒論
ffmpeg推流 ffplay/vlc拉流 使用rtmp協議
ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path>
為什么會推流失敗?
默認命令行方式可能導致音頻和視頻不同步原始是最快的播放速率,修改為`ffmpeg -re -i <source_path> -f flv rtmp://<rtmp_server_path>` 以原始播放速率播放
為什么清晰度不高?
`-f flv` 會按照默認方式對視頻重新進行編碼,導致視頻質量下降`ffmpeg -re -i <source_path> -c:v copy -f flv rtmp://<rtmp_server_path>`
環境變量
`PATH` :命令行程序如果不是通過地址指定,將通過`PATH`進行搜索
`PKG_CONFIG_PATH` :`pkg-config`參數在這個環境變量的目錄下找庫的執行文件和頭文件,實際上是找到對應庫的`.pc`文件,而`.pc`文件中包含有庫和頭文件的信息
在`~/.bashrc | ~/.bash_profile`文件中設置Linux | Mac 的環境變量,然后通過`source`命令生效
PKG_CONFIG_PATH
與LD_LIBRARY_PATH
有什么區別?
https://www.cnblogs.com/doubleconquer/p/17862780.html`pkg-config` 輸出的參數最終會被 `gcc/clang` 和 `ld` 使用,但 **它本身不參與鏈接或運行**。
安裝ffmpeg
Mac系統可以直接使用brew
安裝,類Unix系統可以使用源碼安裝,源碼安裝好處是更加靈活。Windows系統安裝稍微復雜
可執行工具:
`ffmpeg`:推流,音視頻處理`ffplay`:拉流,播放流媒體文件`ffprobe`:偵測多媒體文件格式、基本信息
庫:
`libavcodec`:編解碼`libavdevice`:管理設備`libavfilter`:過濾,特效`libavformat`:多媒體格式處理`libavutil`:基本工具`libpostproc`:沒什么用`libswresmaple`:音頻重采樣`libswscale`:視頻縮放默認生成動態庫(`.dylib/.so`),也可以生成靜態庫(`.a`)
為什么有時候ffmpeg編譯出來沒有ffplay工具?
https://blog.csdn.net/chendongpu/article/details/123688442應該是舊版本需要手動enable
音頻基礎
處理流程
共享端:音視頻采集(調用API) → 音視頻編碼
傳輸
觀看端:音視頻解碼 → 音視頻渲染 (調用驅動API)
音頻數據流
采集后得到數字信號PCM數據 → 編碼器aac/mp3編碼 → 壓縮后的數據aac/mp3 → 套馬甲形成多媒體文件mp4/flv
多媒體文件mp4/flv → 脫馬甲(解封裝) → 解碼 → PCM
為什么要套馬甲(封裝)?
1. 便于傳輸和存儲:多媒體文件格式(如mp4/flv)提供了標準化的容器,可以同時存儲音頻、視頻、字幕等多種數據2. 包含元數據:多媒體容器可以存儲諸如時長、創建時間、編碼格式等重要信息3. 支持流媒體:特定的容器格式支持流式傳輸,允許在下載完整文件前就開始播放4. 同步音視頻:容器格式包含時間戳等信息,確保音視頻在播放時能夠正確同步
音頻基礎知識
聲音:物體振動 → 通過介質傳輸能量 → 介質刺激耳膜 → 被人腦識別
人類的聽覺頻率范圍(介質振動頻率):次聲波 20Hz 可聽聲波 20kHz 超聲波
說話:85 — 1100 Hz
聲音的三要素 → 波的三要素
音調 → 波的頻率 頻率較高悅耳
音量 → 波的振幅
音色 → 諧波
什么是諧波?
諧波是在基頻(基本頻率)上疊加的整數倍頻率的波。當一個物體振動時,除了產生基本頻率的聲波外,還會同時產生2倍、3倍等整數倍頻率的波。這些波的疊加形成了獨特的音色。例如:當一根琴弦振動時,除了產生基頻(最低頻率的聲波),還會產生2倍頻率(第二諧波)、3倍頻率(第三諧波)等。不同樂器發出相同音調的聲音聽起來不一樣,就是因為它們產生的諧波組成不同。
諧波有什么用?
1. 音質優化:在音頻處理中,了解諧波可以幫助進行更好的音質調節和優化2. 音頻壓縮:某些音頻壓縮算法會考慮諧波特性來實現更有效的壓縮3. 音色合成:在音樂制作中,通過調整諧波可以創造不同的音色效果
模擬信號經過采樣得到數字信號(根據奈奎斯特定理,采樣率超過最高頻率的2倍不會失真),普遍采樣率在48kHz
為什么采樣率需要是最高頻率的2倍?
1. 重建原始信號:根據奈奎斯特定理,要完整重建一個連續的模擬信號,采樣率必須至少是信號最高頻率的2倍。這是因為每個周期至少需要兩個采樣點才能確定一個正弦波的頻率和相位。2. 避免混疊效應:如果采樣率低于信號最高頻率的2倍,高頻信號會被錯誤地解釋為低頻信號,這種現象稱為"混疊"。這會導致重建的信號失真。3. 數學證明:假設采樣率低于2倍頻率,那么在信號重建時,由于采樣點不足,同一組采樣點可能對應多個不同頻率的正弦波,系統無法確定原始信號的真實頻率。4. 實際應用:在實踐中,為了保證更好的信號質量,通常會采用更高的采樣率,比如音頻常用的44.1kHz或48kHz。
位深/采樣大小:一個采樣用多少bit存放。常用16bit
采樣率:采樣頻率 8k(打電話) 16k 32k 44.1k 48k
聲道數:單聲道、雙聲道(人耳)、多聲道
碼率:采樣率 x 聲道數 x 位深
PCM格式:裸數據,記錄采樣信息
WAV格式:封裝數據,一般用于封裝PCM數據,加上元信息,最主要就是位深、采樣率和聲道數(以及其他一些大小等)
RIFF 是 WAV 的容器格式,通過分塊(Chunk)組織數據,使用小端序存儲數字。
大端序(Big-Endian)和 小端序(Little-Endian)是兩種不同的字節存儲順序,用于定義多字節數據(如整數、浮點數)在內存或文件中的排列方式。它們的區別主要體現在字節的排列順序上,直接影響數據的解析和跨平臺兼容性。
- 關鍵塊:
"RIFF"
(頂層)、"fmt "
(參數)、"data"
(音頻數據)。 - 應用場景:WAV、AVI、WebP 等均基于 RIFF 結構。