在音视频工作领域,很多人可能会陷入徘徊和迷茫的境地。音视频的知识纷繁复杂,自己学习非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验;不知道如何学,怎样才能查漏补缺自己的技术短板。
对于音视频工作领域,我总结了九个前景不不错的方向:直播、传输、算法、视频播放器、流媒体后端、短视频、音频播放、视频编辑、图像处理。具体的方向如下:
音视频自学的难点
- 音视频自学非常困难,网上通俗易懂的难找到
- 网上部分资源是对应的开源版本较低,比如雷霄骅(雷神)博客的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+ +基础)