在音視頻工作領域,很多人可能會陷入徘徊和迷茫的境地。音視頻的知識紛繁復雜,自己學習非常困難,既需要非常扎實的基礎知識,又需要有很多的工程經驗;不知道如何學,怎樣才能查漏補缺自己的技術短板。
對于音視頻工作領域,我總結了九個前景不不錯的方向:直播、傳輸、算法、視頻播放器、流媒體后端、短視頻、音頻播放、視頻編輯、圖像處理。具體的方向如下:
音視頻自學的難點
- 音視頻自學非常困難,網上通俗易懂的難找到
- 網上部分資源是對應的開源版本較低,比如雷霄驊(雷神)博客的FFmpeg版本較低
- 音視頻涉及大量的開源庫和協議
- 比如ffmpeg的編譯,如果不熟悉各種編譯報錯
- Janus編譯涉及各種開源組件編譯不通過
- 比如WebRTC涉及的RTP RTCP SDP STUN等協議
- 部分嵌入式音視頻的朋友技術面窄,技術不深入
- 比如有同學做了2年的音視頻驅動,一幀音頻能持續播放多久都不明白
2024全新,音視頻流媒體高級開發學習路線
一、音視頻基礎
1.1、音頻基礎知識
- 聲音的采集原理及模數轉換
- 高品質音頻采樣率必須大于等于44.1KHz的原因
- 什么是PCM(脈沖編碼調制)
- 用多少位來表示一個采樣點
- 采樣值是用整數還是浮點數來表示
- 音量大小與采樣值的關系
- 每個音頻幀包含多少個采樣點
- 左右通道的采樣數據如何排列
- 音頻編碼原理
1.2、視頻基礎知識
- RGB彩色原理
- YUV格式的必要性
- 什么是像素
- 分辨率、幀率、碼率的概念
- 不同的YUV數據存儲格式的區別
- YUV內存對齊問題
- 為什么會出現綠屏畫面
- H264編碼原理
- H264中I、P和B幀的關系(IPB幀)
1.3、解復用基礎知識
- 解復用的概念,例如MP4格式
- 不同復用格式的必要性
- 常見的復用格式:MP4、FLV、TS
1.4、FFmpeg開發環境搭建
- 在Windows、Ubuntu和MAC三大平臺下搭建開發環境
- QT的安裝
- FFmpeg命令行環境的配置
- FFmpeg API環境的配置
- FFmpeg的編譯方法
- 在Windows平臺下安裝vs2019
1.5、音視頻開發常用工具
- 使用Medialnfo分析視頻文件
- 使用mp4box分析MP4文件
- 使用VLC播放器進行測試播放
- 使用audacity分析音頻PCM數據
- 使用EasyICE分析TS流
- 使用Elecard_ streamEye分析H264視頻
- 使用flvAnalyser分析FLV文件
- 使用海康YUVPlayer分析YUV數據
二、FFmpeg實戰教程
2.1、FFmpeg命令
- 提取音頻PCM/AAC文件
- 提取視頻YUV/H264文件
- 解復用和復用
- 音視頻錄制
- 視頻裁剪和合并
- 圖片/視頻轉換
- 直播推流和拉流
- 水印/畫中畫/九宮格濾鏡 目的:快速掌握FFmpeg的功能,加深對音視頻的理解。
2.2、SDL跨平臺
- 多媒體開發庫實戰
- SDL環境搭建
- SDL事件處理
- SDL線程處理
- 視頻YUV畫面渲染
- 音頻PCM聲音輸出 SDL兼容Win、Ubuntu、Mac等平臺,用于項目的畫面顯示和聲音輸出。
2.3、FFmpeg基石精講
- FFmpeg框架
- FFmpeg內存引用計數模型
- 解復用相關AVFormat
- 編解碼相關AVCodec
- 壓縮數據AVPacket
- 未壓縮數據AVFrame
- FFmpeg面向對象思想
- Packet/Frame數據零拷貝 目的:熟悉FFmpeg常用結構體和函數接口。
2.4、FFmpeg過濾器
- FFmpeg過濾鏈框架
- 音頻過濾器框架
- 視頻過濾器框架
- 多路音頻混音amix
- 視頻水印watermark
- 視頻區域裁剪和翻轉
- 視頻添加logo
2.5、FFmpeg音視頻解復用+解碼
- 解復用流程
- 音頻解碼流程
- 視頻解碼流程
- FLV封裝格式分析
- MP4封裝格式分析
- FLV和MP4 seek的區別
- FLV格式用于直播的原因
- MP4不能用于直播的原因
- MP4用于點播的可能性
- AAC ADTS分析
- H264 NALU分析
- AVIO內存輸入模式
- 音頻重采樣實戰
- 重采樣后的數據播放時長一致性
- 重采樣后PTS的表示方式
- 視頻解碼后YUV內存對齊問題
- 音頻解碼后PCM排列格式問題
- 硬件解碼dxva2/nvdec/cuvid/qSV
- 硬件GPU數據轉移到CPU
- H265解碼 目的:學習FFmpeg API,掌握音視頻解復用、解碼和復用合成視頻。
2.6、ffplay播放器
- ffplay.c的意義
- ffplay框架分析
- 解復用線程
- 音頻解碼線程
- 視頻解碼線程
- 聲音輸出回調
- 畫面渲染時間間隔
- 音頻重采樣
- 畫面尺寸格式變換
- 音頻、視頻、外部時鐘同步的區別
- 以視頻為基準時音頻重采樣補償
- 音量靜音、調節大小的本質
- 音視頻packet隊列大小限制
- 音視頻packet隊列的線程安全性
- 音視頻frame隊列大小限制
- 音視頻frame隊列的線程安全性
- 暫停、播放實現機制
- seek播放導致的畫面卡住問題
- seek播放數據隊列、同步時鐘處理
- 逐幀播放實現方法
- 播放器退出的流程要點 目的:掌握ffplay.c源碼,對自己開發播放器有事半功倍的效果。
2.7、FFmpeg音視頻編碼+復用合成視頻
- AAC音頻編碼
- H264視頻編碼
- PCM+YUV復用合成MP4/FLV
- H264編碼原理
- IDR幀和幀的區別
- 動態修改編碼碼率
- GOP間隔參考值
- 復用合成MP4音視頻不同步問題
- 編碼、復用timebase問題
- MP4合成IOS不能播放問題
- 重采樣后PTS的表示方式
- 視頻編碼YUV內存對齊問題
- 硬件編碼dxva2/nvenc/cuvid/qsv
- H265編碼原理
- H264、H265編碼互轉
2.8、ffmpeg多媒體
- 視頻處理工具
- ffmpeg.c的意義
- ffmpeg框架分析
- 音視頻編碼
- 封裝格式轉換
- 提取音頻
- 提取視頻
- logo疊加
- 音視頻文件拼接
- filter機制
- 命令行解析流程
- MP4轉FLV不重新編碼邏輯
- MP4轉FLV重新編碼邏輯
- MP4轉FLV scale
注: ffmpeg.c是ffmpeg命令的源碼,掌握ffmpeg.c的大體框架對于我們要實現一些不知道怎么編寫代碼的功能(用ffmepg命令行可以但不知道怎么調用ffmpeg api時可以參考ffmepg.c的邏輯)有極大的幫助,比如要裁剪視頻長度。
2.9、FFmpeg+ QT播放器
- 常見開源播放器分析
- CUVID/D3D11VA硬解
- 界面和播放核心分離框架分析
- 音量頻譜展示
- 播放器模塊劃分
- 音頻均衡器
- 解復用模塊
- 畫面旋轉、翻轉
- 音視頻解碼
- 畫面亮度、飽和度調節
- 播放器控制
- 畫面4:3 16:9切換
- 音視頻同步
- 碼流信息分析
3、流媒體客戶端
3.1、RTMP推拉流項目實戰
- RTMP協議分析
- 使用wireshark進行抓包分析
- H264 RTMP封裝
- AAC RTMP封裝
- RTMP拉流實戰
- H264 RTMP解析
- AAC RTMP解析
- RTMP推流實戰
- 判斷無MetaData時是否能播放
- RTMP推流是否會導致延遲
- 如何動態調整RTMP推流的碼率
- 如何動態調整RTMP推流的幀率
- RTMP拉流是否會導致延遲
- 如何檢測RTMP拉流的延遲
- 如何解決RTMP播放的延遲問題
- ffplay和vlc是否適合用來測試播放延遲
- RTMP拉流播放變速策略設置
3.2、RTSP流媒體實戰
- RTSP協議分析
- RTP協議分析
- H264 RTP封裝
- H264 RTP解析
- AAC RTP封裝
- AAC RTP解析
- RTCP協議分析
- RTSP流媒體服務器搭建
- RTSP推流實戰
- RTSP拉流實戰
- 使用wireshark進行抓包分析
- RTP頭部序號的作用
- RTCP的NTP和RTP的TS的區別
- RTSP交互過程
- 花屏可能的原因
- 如何發送SPS和PPS
- SDP封裝音視頻信息
3.3、HLS拉流分析
- HLS協議分析
- HLS拉流實戰
- HTTP協議分析
- FFmpeg HLS源碼分析
- TS格式分析
- HLS多碼率機制
- m3u8文件解析
- 如何解決HLS高延遲問題
- 使用wireshark進行抓包分析 注:理解HLS的拉流機制有助于解決HLS播放延遲過高的問題。
4、流媒體服務器
4.1、SRS源碼剖析協程
- 整體框架分析
- 連接和協程的關系
- RTMP推流分析
- 如何更快速掌握SRS源碼
- RTMP拉流分析
- 流媒體服務器是否導致延遲
- HLS拉流分析
- 如何降低流媒體服務器的延遲
- HTTP-FLV拉流分析
- 怎么獲取流媒體服務器推流信息
- FFmpeg轉碼分析
- 怎么獲取流媒體服務器拉流信息
- 首屏秒開技術分析
- 首屏秒開能降低延遲嗎
- forward集群源碼分析
- 推流->服務器轉發->拉流延遲分析
- edge集群源碼分析
- 負載均衡部署方式
注:對于SRS流媒體服務器,長期更新,從3.0->4.0->5.0
4.2、ZLMediaKit源碼剖析
- 整體框架分析
- 數據轉發模型
- 線程模塊劃分
- SDP解析
- RTSP推流連接處理
- RTP H264解析
- RTSP拉流連接處理
- RTP AAC解析
注: ZLMediaKit主要講解RTSP流媒體服務器相關的模塊,其他模塊RTMP/HLS等參考SRS。
5、WebRTC項目實戰
5.1、WebRTC中級開發實踐指南
- 理解WebRTC通話原理
- 搭建WebRTC開發環境
- 最佳coturn服務器搭建方法
- 音視頻數據采集技巧
- 一對一通話時序分析
- 信令服務器設計技巧
- SDP分析方法
- Candidate類型分析
- Web端一對一通話
- Web和Android通話
- 快速演示AppRTC
- 設置編碼器優先級技巧
- 最大碼率限制方法
- 了解信令服務器的本質
- Web和Android的SDP差異
- 如何確定通話目標存在性
- 新增C++和IOS客戶端兩個版本
注:建議從Web端入手學習WebRTC,可以直接調用JavaScript接口,先對WebRTC通話流程有清晰的理解,然后再考慮其他端的開發。
5.2、WebRTC高級開發-SRS 4.0/5.0源碼分析
- RTMP轉發至WebRTC的邏輯分析
- WebRTC轉發至RTMP的邏輯分析
- WebRTC音視頻一對一通話
- WebRTC多人通話
- WebRTC SFU模型分析
- SRTP協議分析
- RTCP協議分析
- SDP分析方法
- NACK協議分析
- turn服務器分析
- stun服務器分析
- 擁塞控制算法
- FEC技術
- 抖動緩沖區
5.3、WebRTC高級開發-MESH模型多人通話
- 自定義攝像頭分辨率
- 碼率限制技巧
- 調整編碼器順序
- MESH模型多方通話分析
- 多人通話信令服務器開發
- 動態分配stun/turn服務器
- Web客戶端源碼分析
- Android客戶端源碼分析
5.4、WebRTC高級開發-Janus SFU模型多人通話
- Janus框架分析
- Janus信令設計
- 基于Janus實現會議系統
- Janus Web客戶端源碼分析
- Janus Android客戶端源碼分析
- Janus Windows客戶端源碼分析
- 基于Full ICE的部署
- 基于Lite ICE的部署
- Full ICE和Lite ICE的區別
- 發布訂閱模型技術解析
6、Android NDK
6.1、Android NDK開發基礎
- So庫適配總結
- GDB調試技巧
- Makefile_ I程組織
- CMake工程組織
- 生成指定CPU平臺的so庫
- JNI基礎和接口生成
- JNI Native層構建Java對象
- JNI異常處理
6.2、Android FFmpeg編譯和應用
- 編譯x264
- 編譯x265
- 編譯mp3
- 編譯fdk-aac
- 編譯FFmpeg
- 使用ffmpeg實現mp4轉格式
- 使用FFmpeg開發播放器
6.3、Android RTMP推拉流
- RTMP推流協議實現
- RTMP拉流協議實現
- RTMP拉流音視頻同步
- MediaCodec硬件編碼
- MediaCodec硬件解碼
- OpenSL ES播放音頻數據
- MediaCodec硬件解碼
- OpenGL ES Shader顯示視頻
6.4、Android Ijkplayer源碼分析
- 編譯ijlplayer和實踐
- 項目框架分析
- 播放狀態轉換
- 拉流分析
- 解碼分析
- 音頻播放流程
- 視頻渲染流程
- OpenSL ES播放音頻數據
- MediaCodec硬件解碼
- OpenGL ES Shader顯示視
- 變速播放實現原理
- 低延遲播放實現
- 緩存隊列設計機制分析
7、iOS音視頻開發
7.1、iOS FFmpeg 6.0編譯和應用
- Xcode調試FFmpeg
- iOS調用FFmpeg
- QT調試FFmpeg
7.2、iOS FFmpeg RTMP推拉流
- AVFoundation視頻采集
- Metal視頻渲染
- Audio Unit音頻采集
- Audio Unit音頻播放
- FFmpeg推流
- FFmpeg拉流
- 直播延遲和解決方法
7.3、VideoToolbox硬件編解碼
- VideoToolbox框架的流程
- 硬件編解碼步驟
- CVPixelBuffer解析
- 如何獲取SPS/PPS信息
- 判斷是否關鍵幀
- 編碼參數優化
7.4、iOS jkplayer編譯和應用
- 本地視頻播放
- RTMP拉流播放
- HTTP點播
- 音頻播放流程
- 視頻渲染流程
7.5、iOS ijkplayer編譯和應用
- 基于Mesh一對一通話
- 基于SFU多人通話
8、音視頻項目實戰
- FFmpeg
- QMPlay2
- ijkplayer
- 0OBS
- AppRTC
- WebRTC
- Janus
- SRS
- ZLMediaKit
9、相關的開源網站與地址如下:
FFmpeg | https://ffmpeg.org/ |
WebRTC | https://webrtc.org.cn/ |
RTC社區 | https://rtcdeveloper.agora.io/ |
RFC協議 | https://www.rfc-editor.org/rfc/ |
OpenGL | https://learnopengl-cn.github.io/ |
GPUImage | https://github.com/BradLarson/GPUImage |
VideoLan | https://www.videolan.org/projects/ |
AOMedia | https://aomedia.org/ |
http://xiph.org | https://gitlab.xiph.org/ |
VP9 | https://www.encoding.com/vp9/ |
soundtouch | http://soundtouch.surina.net/ |
sox | http://sox.sourceforge.net/ |
10、以上音視頻開發學習路線涵蓋最主流的音視頻全棧開發技術,適合各類技術人員)
- 從事音視頻崗位開發,但沒有時間系統學習的在職工程師
- 從事嵌入式方向開發,想轉入音視頻開發的在職工程師
- 從事Qt/MFC等桌面開發的,薪資多年漲幅不大的在職工程師
- 從事Android/IOS移動開發,想往音視頻方向發展的在職工程師
- 從事C/C+ +后臺開發,想往流媒體服務器方向發展的在職工程師
- 自己研究學習速度較慢,不能系統構建音視頻知識體系的開發人員
- 計算機相關專業想進入大廠的在校生(本科及以上學歷,有c/C+ +基礎)