音视频开发1 学习路线
零 . 参考零声教育关于 音视频的学习知识点如下.
一 基础知识--音频基础知识
1.如何采集声音--模数转换原理
2.为什么高品质音频采样率要 大于等于 44.1KHZ
3.什么是PCM?
4.一个采样点 用多少位表示
5.采样值用整数还是浮点数表示
6.音量大小和采样值的关系
7.多少个采样点作为一帧数据
8.左右通道的采样数据如何排列
9.音频编码原理
二 基础知识--视频基础知识
1.RGB彩色原理
2.YUV
3.像素,分辨率,帧率,码率
4.YUV数据存储格式
5.YUV内存对齐问题
6.画面绿屏
7.H264编码原理
8.H264 I,P,B帧的关系
三 基础知识-- 解复用基础知识
1.什么是解复用?比如mp4格式
2.为什么需要不同的复用格式 mp4/FLV/TS
3.常见的复用格式 mp4/FLV/TS
四 基础知识--FFmpeg环境搭建
1.windows ,Unbutun,MAC
2.QT
3.FFmpeg 命令行环境
4.FFmpeg API环境
5.FFmpeg编译
6.vs2019安装
五 基础知识--音视频开发常用工具
1.mediainfo,用途是分析视频工具
2.VLC播放器,用途是测试播放
3.EasyICE 用途是分析TS流
4.flvAnalyser,用途是分析FLV
5.mp4box,用途是分析mp4
6.audacity,用途是分析音频pcm
7.ELecard_streamEye, 用途是分析H264
8.海康YUVPlayer,分析YUV
六 FFmpeg 实战 -- FFmpeg命令
掌握FFmpeg的目的:快速掌握FFmpeg能做什么?加深对音视频的理解
1.音频pcm/aac文件提取
2.视频yuv/h264文件提取
3.解复用/复用
4.音视频录制
5.视频裁剪和合并
6.图片/视频转换
7.直播推流和拉流
8.水印/画中画/九宫格滤镜
七 FFmpeg 实战 SDL 跨平台多媒体开发库实战
1.SDL环境搭建
2.SDL事件处理
3.SDL线程处理
4.视频YUV画面渲染
5.音频PCM声音输出
八 FFmpeg 实战-FFmpeg 基石精讲
目的:熟悉FFmpeg 常用结构体和函数接口
1.FFmpeg 框架
2.FFmpeg 内存引用计数模型
3.解复用相关AVFormatXXX 等
4.编解码相关 AVCodecXXX 等
5.压缩数据AVPacket
6.未压缩数据AVFrame
7.FFmpeg 面相对象思想
8.packet/Frame数据零拷贝
九 FFmpeg 实战--FFmpeg 音视频解复用+解码
注:FFmpeg API学习--视频解复用--->解码--->编码--->复用合成视频
1.解复用流程
2.音频解码流程
3.视频解码流程
4.FLV封装格式分析
5.MP4封装格式分析
6.FLV和MP4 seek有什么区别
7.为什么FLV格式能用于直播?
8.为什么mp4不能用于直播?
9.MP4能否用来做点播?
10.AAC ADTS分析
11.H264 NALU分析
12. AVIO内存输入模式
13.音频重采样实战
14.重采样后的数据播放时长是否一致
15.音频重采样后PTS如何表示
16.视频解码后YUV内存对齐问题
17.音频解码后PCM排列格式问题
18.硬件解码 dxva2/nvdec/cuvid/qsv
19.硬件gpu数据转移到内存
20.H265解码
十 FFmpeg 实战--FFmpeg 过滤器
filter在视频剪辑领域广泛使用,这一节 将过滤器的框架搞清楚,是重点。
1.FFmpeg 过滤chain框架
2.音频过滤器框架
3.视频过滤器框架
4.多路音频泥音 amix
5.视频水印 watermark
6.视频区域裁剪和翻转
7.视频加logo
十一 FFmpeg 实战--ffplay播放器 源码分析
注:ffplay.c 是 ffplay命令源码。掌握 ffplay.c对于我们开发播放器很有好处
1.掌握ffplay.c
2.ffplay框架分析
3.解复用线程
4.音频解码线程
5.视频解码线程
6.声音输出回调
7.画面渲染时间间隔
8.音频重采样
9.画面尺寸格式变换
10.音频,视频,外部时钟同步区别
11.以视频为基准时,音频重采样补偿
12.音量静音,调节大小的本质
13.音视频packet队列大小限制
14.音视频packet队列线程安全
15.音视频frame队列大小限制
16.音视频frame队列线程安全
17.暂停,播放实现机制
18.seek播放导致的画面卡住问题
19.seek播放数据队列,同步时针处理
20.如何做到逐帧播放
21.播放器退出的流程要点
十二 FFmpeg 实战--ffmpeg多媒体视频处理工具--源码分析
注:ffmpeg.c是ffmpeg命令的源码。掌握ffmpeg.c的大体框架对于我们要实现一些不知道怎么编码实现的一些功能 有参考的功能,因此要要好好看一下,但是这个代码难度比较大,建议结合 baidu学习,自己慢慢看难度比较大。
1.掌握ffmepg.c的意义
2.FFmpeg框架分析
3.音视频编码
4.封装格式转换
5.提取音频
6.提取视频
7.logo叠加
8.音视频文件拼接
9.filter机制
10.命令行解析流程
11.mp4转flv不重新编码逻辑
12.MP4转flv重新编码逻辑
13.MP4转flv timebase问题
14.MP4转flv scale(规模)
十三 FFmpeg 实战---FFmpeg +QT QMplay2播放器
注:该项目难度大,如果要开发播放器,这部分要好好看
1.QMPlay2开源播放器讲解
2.QMPlay2框架分析
3.播放器模块划分
4.解复用模块
5.音视频解码
6.播放器控制
7.音视频同步
8.CUVID/D3D11VA硬解
9.音量频谱展示
10.音频均衡器
11.画面旋转,翻转
12.画面亮,饱和度细节
13.画面4:3 16:9 切换
14.码流信息分析
十四 FFmpeg 实战--OBS推流录制源码分析
该项目难度大,深入学习推流项目可以参考这个源码
1.OBS vs2019+QT5.15.2编译
2.音频配置和初始化分析
3.音频线程模块采集和编码分析
4.视频配置和初始化分析
5.视频线程模块采集和编码分析
6.OBS初始化分析过程
7.录制流程分析
8.麦克风采集分析
9.桌面采集分析
10.X264编码分析
11.系统声音+麦克风混音
12.推流模块分析
十五 流媒体客户端--RTMP推拉流项目实战
RTMP 推拉流是我们进入音视频流媒体的第一个项目。
从数据采集--->编码--->推流--->流媒体服务器转发--->拉流--->解码--->播放,整个逻辑必须清楚
1.RTMP协议分析
2.wireshark 抓包分析
3.h264 RTMP封装
4.AAC RTMP封装
5.RTMP 拉流实战
6.H264 RTMP解析
7.AAC RTMP解析
8.RTMP推流实战
9.RTMP推流如何动态调整码流
10.RTMP推流如何动态调整帧流
11.RTMP拉流是否会导致延迟
12.如何检测 RTMP拉流延迟
13.如何解决RTMP播放延迟
14.ffplay vlc能否用来测试播放延迟
15. RTMP 拉流播放变速策略设置
十六 流媒体客户端--HLS拉流分析
1.HLS 协议分析
2.HTTP协议分析
3.TS格式分析
4.m3u8文件解析
5.wireshark 抓包分析
6.HLS拉流实战
7.FFmpeg HLS源码分析
8.HLS多码率机制
9.没有metadata 能否播放
10.如何解决HLS延迟高的问题
11.RTMP推流是否会导致延迟
十七 流媒体客户端 -- RTSP流媒体实战
1.RTSP协议分析
2.RTP协议分析
3.H264RTP封装
4.H264RTP解析
5.AAC RTP封装
6.AAC RTP解析
7.RTCP协议分析
8.RTSP流媒体服务器搭建
9.RTSP推流实战
10.RTSP拉流实战
11.wireshark抓包分析
12. RTP头部序号的作用
13.RTCP的NTP和RTP的TS的区别
14.RTSP交互过程
15.花屏可能的原因
16.SPS,PPS如何发送?
17.SDP封装音视频信息
RTSP涉及的技术不单单在安防领域,其中的RTCP RTP SDP等协议在webRTC也有应用。
十八 流媒体服务器-SRS3.0源码剖析
1.整体框架分析
2.RTMP推流分析
3.RTMP拉流分析
4.HLS拉流分析
5.HTTP-flv 拉流分析
6.ffmpeg 转码分析
7.首屏秒开技术分析(为了能快速显示画面,并不能解决延迟)
8.forward集群源码分析
9.edge集群源码分析
10.负载均衡部署方式
11.连接和协程的关系
12.如何快速掌握SRS源码
13.流媒体服务器是否导致延迟
14.如何降低流媒体服务器的延迟
15.怎么获取流媒体服务器推流信息
16.怎么获取流媒体服务器拉流信息
17. 推流--->服务器转发--->拉流延迟分析
18 SRS4.0/5.0
十九 流媒体服务器 ZLMediakit 源码剖析
注:ZLMediakit 主要讲解RTSP流媒体服务器相关的模块,其他模块RTMP/HLS等参考SRS
1.整体框架分析
2.线程模块划分
3.RTSP推流连接处理
4.RTSP拉流连接处理
5.数据转发模型
6.SDP解析
7.RTP H264解析
8.RTP AAC解析
二十 webRTC 项目实战--webRTC 中级开发,手把手写代码
学习webRTC建议从web端入手,可以直接调用js接口,刚开始不建议编译webrtc源码,对webRtc通话流程有清晰的理解后,在编译源码
1.webRTC 通话原理分析
2.webRTC 开发环境搭建
3.coturn 最佳搭建方法
4.如何采集音视频数据
5.一对一通话时序分析
6.信令服务器涉及
7.SDP分析
8.candidate类型分析
9.web一对一通话
10.web 和 android 通话
11.AppRtc 快速演示
12.如何设置编码器优先级
13.如何限制最大码率
14.信令服务器的本质是什么?
15.为什么从接口获取SDP后还要再次设置
16web 和 android 的SDP差异
17 A要和B通话,A怎么知道B的存在
二十一 webRTC 项目实战--webrtc高级开发--mech模型多人通话
1.自定义摄像头分辨率
2.码率限制
3.调整编码器顺序
4.mesh模型多方通话分析
5.多人通话信令服务器开发
6.动态分配stun/turn 服务器
7.web客户端源码
8.android客户端源码
二十二 webRTC 项目实战-- Janus SFU 模型多人通话
Janus是一个非常出名的SFU webrtc服务器,不少企业基于该开源项目做二次开发
1.Janus框架分析
2.Janus信息设计
3.基于Janus实现会议系统
4.Janus web客户端源码分析
5.Janus android 客户端源码分析
6.Janus windows客户端源码分析
7.基于Full ICE的部署
8.基于LiteICE 的部署
9.Full ICE和 Lite ICE区别
10.发布订阅模式
二十三,webRTC 项目实战--web高级开发 SRS4.0/5.0源码分析
1.RTMP转发webrtc 逻辑
2.webrtc转发RTMP逻辑
3,webrtc 音视频一对一通话
4. webRtc多人通话
5.webrtc SFV模型分析
6.SRTP分析
7.RTCP分析
8.SDP分析
9.NACK分析
10.stun分析
11.拥塞控制算法
12.FEC
13 jitter buffer
二十四 android NDK开发 -- android NDK开发基础
1.so库适配总结
2.GDB调试技巧
3.makefile工程组织
4.cmake工程组织
5.生成指定CPU平台的so库
6.JNI基础和接口生成
7.JNI Native层构建java对象
8.JNI异常处理
二十五 android FFmpeg 编译和应用
1.编译x264
2.编译x265
3.编译mp3
4.编译fdk-aac
5.编译ffmpeg
6.使用ffmpeg实现mp4转格式
7.使用ffmpeg开发播放器
二十六 android RTMP 推拉流
1.RTMP 推流协议实现
2.RTMP拉流协议实现
3.RTMP拉流音视频同步
4.MediaCodec硬件编码
5.MediaCodec硬件解码
6.openGL ES 播放音频数据
7.openGL ES shader显示视频
二十七 android Ijkplayer 源码分析
1.编译ijkplayer和实践
2.项目框架分析
3.播放状态转换
4.拉流分析
5.解码分析
6.音频播放流程
7.视频渲染流程
8.openSL ES播放音频数据
9.mediacodec硬件解码
10.openGLES shader 显示视频
11.变速播放实现原理
12.低延迟播放实现
13.缓存队列设计机制分析
二十八整理 上述学习过程中-学习到的大型开源项目
FFMPEG
QMplay2
Ijkplayer
OBS
AppRTC
webRTC
Janus
SRS
ZLMediakit
二十九 整理 项目中涉及到的源码
1.SDL音频播放
2.SDL视频播放
3.FFMpeg 内存引用计数
4.mp4/flv/ts 解复用
5.提取H264
6.提取AAC
7.H264/H265解码
8 AAC/MP3 解码
9. AVIO内存输入模式
10.音频重采样
11. 视频尺寸格式变换
12. DXVA2解码
13. NVDEC解码
14. CUVID解码
15. QSV 解码
16.AAC编码优化
17.H264编码优化
18.H265编码优化
19.AAC转mp3
20. H264转H265
21. DXVA2编码
22.NVENC编码
23. CUVID编码
24. QSV编码
25.MP4合成
26.flv合成
27.多路音频混音
28.视频添加水印
29.视频区域裁剪
30.视频翻转
31.视频添加logo
32.ffplay播放器
33.ffmpeg多媒体处理工具
34. ovoice QT播放器
35.基于QMPlay2 原理开发的播放器
36. 基于OBS开发的录制和推流器
37.RTMP推流
38.RTMP拉流
39.HLS拉流
40 RTSP推流
41.RTSP拉流
42 SRS3.0/4.0/5.0源码分析
43 ZLMediakit 源码分析
44 一对一音视频通话(web android)
45 APPRTC 一对一音视频通话
46 基于mesh 模型多人音视频通话(web android)
47 Janus SFU 视频会议(web android windows)
48 android 简单播放器
49 android RTMP推流
50 android RTMP拉流
51 android Ijkplayer 源码分析
------------------------------------------
一、音视频开发基础
1、音频基础
音频包括:采样率、声道数与声道布局、采样格式、PCM与波形图、音质、音频编码格式、音频封装格式。
2、通用基础
通用包括:编码原理、C/C++基础、视频分析工具、FFmpeg常用命令、平台相关多媒体API。
3、视频基础
视频包括:帧率、码率、分辨率、像素格式、色彩空间、I帧P帧B帧、DTS与PTS、YUV与RGB、位深与色域、视频编码格式、视频封装格式。具体如下图所示:
二、音视频进阶成长
1、音频进阶
音视频进阶成长也是分为:音频、通用、视频。其中音频包括:录音、麦克风采集、音频编解码、音频播放、音频分析、音效。
2、通用进阶
通用包括:熟悉流媒体协议、音视频传输、音视频同步播放、平台相关多媒体运用、FFmpeg相关API运用、OpenGL渲染、音视频编辑。
3、视频进阶
视频包括:录像、摄像头采集、视频编解码、视频播放、滤镜特效、视频转码。在熟悉音视频基础上深入学习,如下图所示:
三、音视频工作方向
相信很多伙伴在音视频工作方向这个十字路口,有过徘徊、迷茫。个人建议是选择自己喜欢的方向,如果还没找到自己所爱,努力去寻找,借用雷总的话“不要害怕做出选择”。一旦做出选择,就要把工作当做事业,不仅仅是为了工作而工作,借用乔布斯的话“Do what you love, love what you do”。把音视频工作方向总结为9个(可能不够准确,仅是个人观点):直播、传输、算法、视频播放器、流媒体后端、短视频、音频播放、视频编辑、图像处理。具体方向如下:
四、音视频开源库
1、多媒体处理
多媒体处理包括:FFmpeg、libav、Gstreamer。其中FFmpeg是目前最常用的音视频处理库,包括封装格式、编解码、滤镜、图像缩放、音频重采样等模块。
2、流媒体传输
流媒体传输包括WebRTC、live555。其中WebRTC是目前最常用的RTC库,比较著名的模块有JitterBuffer、NetEQ、pacer、网络带宽估计。
3、播放器
播放器包括:ijkplayer、exoplayer、vlc。其中ijkplayer是B站开源的跨平台播放器,exoplayer是Google开源的Android平台播放器,vlc属于VideoLAN非盈利组织所开源。
4、编解码
常用的编解码包括:aac、mp3、opus、vp9、x264、av1。其中aac一般用于点播、短视频,opus用于RTC直播。vp9是Google开源的编码器,VideoLAN有提供x264编码器,av1是AOMedia(开放媒体联盟)开源的新一代视频编码器。
5、音频处理
音频处理的开源库包括:sox、soundtouch、speex。其中sox称为音频处理界的瑞士军刀,可以做各种音效、提供各种滤波器。soundtouch用于变速变调、变速不变调。speex严格意义上讲,它是一个编码器,但是它有丰富的音频处理模块:PLC(丢包隐藏)、VAD(静音检测)、DTX(非连续传输)、AEC(回声消除)、NS(噪声抑制)。
6、流媒体服务器
流媒体服务器主流的有:SRS、janus。其中SRS是一款简单高效的视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT。而janus是MeetEcho公司开源的基于WebRTC的流媒体服务器,严格意义上讲它是一个网关。
7、音视频分析
做音视频开发绕不开分析工具,掌握使用分析工具至关重要。常用的音视频分析工具包括但不限于:Mp4Parser、VideoEye、Audacity。其中Mp4Parser用于分析mp4格式及其结构。VideoEye是雷神开源的基于Windows平台分析视频码流工具(在此致敬雷神的开源精神)。Audacity是一款开源的音频编辑器,可用于添加各种音效、分析音频波形图。
8、视频渲染
视频渲染相关开源库有:GPUImage、Grafika、LearnOpenGL。其中GPUImage可用于添加各种滤镜特效。Grafika是Google一位工程师开源的基于Android平台渲染示例库。LearnOpenGL主要是配套其网站的学习OpenGL教程。
五. 相关的开源网站与地址如下:
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/ |
六、流媒体协议
1、流媒体传输协议
常见的流媒体传输协议有:RTP、SRTP、RTMP、RTSP、RTCP等。其中RTP(Real-time Transport Protocol)是实时传输协议,而SRTP是安全实时传输协议,即在RTP基础上加密传输,防止音视频数据被窃取。RTMP(Real Time Messaging Protocol)是Adobe开源的实时消息传输协议,基于TCP,基本协议包括:RTMPE、RTMPS、RTMPT。RTSP(Real Time Streaming Protocol)是实时流传输协议,字段包括:OPTIONS、DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN等。RTCP(RTP Control Protocol)是RTP传输控制协议,用于统计丢包、发送延时。
2、流媒体应用协议
流媒体应用协议有:HLS、DASH。其中HLS是Apple公司开源的流媒体传输应用协议,同时涉及m3u8协议和ts流。而DASH是Google在广泛运用的流媒体协议,使用fmp4切片,支持自适应码率、多码率的无缝切换。
3、WebRTC信令协议
WebRTC信令协议有:SDP、ICE、NAT、STUN、TURN。当然,WebRTC的网络传输协议也有用到上面提及的流媒体传输协议。
4、音视频编码协议
常用的音频编码协议有:MP3、AAC、OPUS、FLAC、AC3、EAC3、AMR_NB、PCM_S16LE。视频编码协议有:H264、HEVC、VP9、MPEG4、AV1等。
5、音视频封装格式
常用的视频封装格式有:mp4、mov、mkv、webm、flv、avi、ts、mpg、wmv等。常用的音频封装格式有:mp3、m4a、flac、ogg、wav、wma、amr等。封装格式是多媒体容器,包含多媒体信息、音视频码流。其中多媒体信息包括:时长、分辨率、帧率、码率、采样率、声道数等等,即上面提及的音视频开发基础的相关概念。而音视频码流是原始数据经过编码压缩得到的若干帧组成的stream,字幕码流一般是由特定格式的文本或位图组成。
以上涉及的协议具体如下:
相关视频推荐
【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发免费学习地址
【纯干货免费分享】C++音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)
本文内容来自音视频开发成长之路与音视频知识总结 - 知乎
感谢作者帮忙整理