在音视频工作领域,很多人可能会陷入徘徊和迷茫的境地。音视频的知识纷繁复杂,自己学习非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验;不知道如何学,怎样才能查漏补缺自己的技术短板。
对于音视频工作领域,我总结了九个前景不不错的方向:直播、传输、算法、视频播放器、流媒体后端、短视频、音频播放、视频编辑、图像处理。具体的方向如下:

音视频自学的难点
- 音视频自学非常困难,网上通俗易懂的难找到
 - 网上部分资源是对应的开源版本较低,比如雷霄骅(雷神)博客的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+ +基础)
 


















