2024年 C++音视频开发学习路线(ffmpeg/rtsp/srs/webrtc/hls)

在音视频工作领域,很多人可能会陷入徘徊和迷茫的境地。音视频的知识纷繁复杂,自己学习非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验;不知道如何学,怎样才能查漏补缺自己的技术短板。

对于音视频工作领域,我总结了九个前景不不错的方向:直播、传输、算法、视频播放器、流媒体后端、短视频、音频播放、视频编辑、图像处理。具体的方向如下:

音视频自学的难点

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

  1. 提取音频PCM/AAC文件
  2. 提取视频YUV/H264文件
  3. 解复用和复用
  4. 音视频录制
  5. 视频裁剪和合并
  6. 图片/视频转换
  7. 直播推流和拉流
  8. 水印/画中画/九宫格滤镜 目的:快速掌握FFmpeg的功能,加深对音视频的理解。

2.2、SDL跨平台

  1. 多媒体开发库实战
  2. SDL环境搭建
  3. SDL事件处理
  4. SDL线程处理
  5. 视频YUV画面渲染
  6. 音频PCM声音输出 SDL兼容Win、Ubuntu、Mac等平台,用于项目的画面显示和声音输出。

2.3、FFmpeg基石精讲

  1. FFmpeg框架
  2. FFmpeg内存引用计数模型
  3. 解复用相关AVFormat
  4. 编解码相关AVCodec
  5. 压缩数据AVPacket
  6. 未压缩数据AVFrame
  7. FFmpeg面向对象思想
  8. Packet/Frame数据零拷贝 目的:熟悉FFmpeg常用结构体和函数接口。

2.4、FFmpeg过滤器

  1. FFmpeg过滤链框架
  2. 音频过滤器框架
  3. 视频过滤器框架
  4. 多路音频混音amix
  5. 视频水印watermark
  6. 视频区域裁剪和翻转
  7. 视频添加logo

2.5、FFmpeg音视频解复用+解码

  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数据转移到CPU
  20. H265解码 目的:学习FFmpeg API,掌握音视频解复用、解码和复用合成视频。

2.6、ffplay播放器

  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. 播放器退出的流程要点 目的:掌握ffplay.c源码,对自己开发播放器有事半功倍的效果。

2.7、FFmpeg音视频编码+复用合成视频

  1. AAC音频编码
  2. H264视频编码
  3. PCM+YUV复用合成MP4/FLV
  4. H264编码原理
  5. IDR帧和帧的区别
  6. 动态修改编码码率
  7. GOP间隔参考值
  8. 复用合成MP4音视频不同步问题
  9. 编码、复用timebase问题
  10. MP4合成IOS不能播放问题
  11. 重采样后PTS的表示方式
  12. 视频编码YUV内存对齐问题
  13. 硬件编码dxva2/nvenc/cuvid/qsv
  14. H265编码原理
  15. H264、H265编码互转

2.8、ffmpeg多媒体

  1. 视频处理工具
  2. ffmpeg.c的意义
  3. ffmpeg框架分析
  4. 音视频编码
  5. 封装格式转换
  6. 提取音频
  7. 提取视频
  8. logo叠加
  9. 音视频文件拼接
  10. filter机制
  11. 命令行解析流程
  12. MP4转FLV不重新编码逻辑
  13. MP4转FLV重新编码逻辑
  14. MP4转FLV scale

注: ffmpeg.c是ffmpeg命令的源码,掌握ffmpeg.c的大体框架对于我们要实现一些不知道怎么编写代码的功能(用ffmepg命令行可以但不知道怎么调用ffmpeg api时可以参考ffmepg.c的逻辑)有极大的帮助,比如要裁剪视频长度。

2.9、FFmpeg+ QT播放器

  1. 常见开源播放器分析
  2. CUVID/D3D11VA硬解
  3. 界面和播放核心分离框架分析
  4. 音量频谱展示
  5. 播放器模块划分
  6. 音频均衡器
  7. 解复用模块
  8. 画面旋转、翻转
  9. 音视频解码
  10. 画面亮度、饱和度调节
  11. 播放器控制
  12. 画面4:3 16:9切换
  13. 音视频同步
  14. 码流信息分析

3、流媒体客户端

3.1、RTMP推拉流项目实战

  1. RTMP协议分析
  2. 使用wireshark进行抓包分析
  3. H264 RTMP封装
  4. AAC RTMP封装
  5. RTMP拉流实战
  6. H264 RTMP解析
  7. AAC RTMP解析
  8. RTMP推流实战
  9. 判断无MetaData时是否能播放
  10. RTMP推流是否会导致延迟
  11. 如何动态调整RTMP推流的码率
  12. 如何动态调整RTMP推流的帧率
  13. RTMP拉流是否会导致延迟
  14. 如何检测RTMP拉流的延迟
  15. 如何解决RTMP播放的延迟问题
  16. ffplay和vlc是否适合用来测试播放延迟
  17. RTMP拉流播放变速策略设置

3.2、RTSP流媒体实战

  1. RTSP协议分析
  2. RTP协议分析
  3. H264 RTP封装
  4. H264 RTP解析
  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封装音视频信息

3.3、HLS拉流分析

  1. HLS协议分析
  2. HLS拉流实战
  3. HTTP协议分析
  4. FFmpeg HLS源码分析
  5. TS格式分析
  6. HLS多码率机制
  7. m3u8文件解析
  8. 如何解决HLS高延迟问题
  9. 使用wireshark进行抓包分析 注:理解HLS的拉流机制有助于解决HLS播放延迟过高的问题。

4、流媒体服务器

4.1、SRS源码剖析协程

  1. 整体框架分析
  2. 连接和协程的关系
  3. RTMP推流分析
  4. 如何更快速掌握SRS源码
  5. RTMP拉流分析
  6. 流媒体服务器是否导致延迟
  7. HLS拉流分析
  8. 如何降低流媒体服务器的延迟
  9. HTTP-FLV拉流分析
  10. 怎么获取流媒体服务器推流信息
  11. FFmpeg转码分析
  12. 怎么获取流媒体服务器拉流信息
  13. 首屏秒开技术分析
  14. 首屏秒开能降低延迟吗
  15. forward集群源码分析
  16. 推流->服务器转发->拉流延迟分析
  17. edge集群源码分析
  18. 负载均衡部署方式

注:对于SRS流媒体服务器,长期更新,从3.0->4.0->5.0

4.2、ZLMediaKit源码剖析

  1. 整体框架分析
  2. 数据转发模型
  3. 线程模块划分
  4. SDP解析
  5. RTSP推流连接处理
  6. RTP H264解析
  7. RTSP拉流连接处理
  8. RTP AAC解析

注: ZLMediaKit主要讲解RTSP流媒体服务器相关的模块,其他模块RTMP/HLS等参考SRS。

5、WebRTC项目实战

5.1、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. Web和Android的SDP差异
  16. 如何确定通话目标存在性
  17. 新增C++和IOS客户端两个版本

注:建议从Web端入手学习WebRTC,可以直接调用JavaScript接口,先对WebRTC通话流程有清晰的理解,然后再考虑其他端的开发。

5.2、WebRTC高级开发-SRS 4.0/5.0源码分析

  1. RTMP转发至WebRTC的逻辑分析
  2. WebRTC转发至RTMP的逻辑分析
  3. WebRTC音视频一对一通话
  4. WebRTC多人通话
  5. WebRTC SFU模型分析
  6. SRTP协议分析
  7. RTCP协议分析
  8. SDP分析方法
  9. NACK协议分析
  10. turn服务器分析
  11. stun服务器分析
  12. 拥塞控制算法
  13. FEC技术
  14. 抖动缓冲区

5.3、WebRTC高级开发-MESH模型多人通话

  1. 自定义摄像头分辨率
  2. 码率限制技巧
  3. 调整编码器顺序
  4. MESH模型多方通话分析
  5. 多人通话信令服务器开发
  6. 动态分配stun/turn服务器
  7. Web客户端源码分析
  8. Android客户端源码分析

5.4、WebRTC高级开发-Janus SFU模型多人通话

  1. Janus框架分析
  2. Janus信令设计
  3. 基于Janus实现会议系统
  4. Janus Web客户端源码分析
  5. Janus Android客户端源码分析
  6. Janus Windows客户端源码分析
  7. 基于Full ICE的部署
  8. 基于Lite ICE的部署
  9. Full ICE和Lite ICE的区别
  10. 发布订阅模型技术解析

6、Android NDK

6.1、Android NDK开发基础

  1. So库适配总结
  2. GDB调试技巧
  3. Makefile_ I程组织
  4. CMake工程组织
  5. 生成指定CPU平台的so库
  6. JNI基础和接口生成
  7. JNI Native层构建Java对象
  8. JNI异常处理

6.2、Android FFmpeg编译和应用

  1. 编译x264
  2. 编译x265
  3. 编译mp3
  4. 编译fdk-aac
  5. 编译FFmpeg
  6. 使用ffmpeg实现mp4转格式
  7. 使用FFmpeg开发播放器

6.3、Android RTMP推拉流

  1. RTMP推流协议实现
  2. RTMP拉流协议实现
  3. RTMP拉流音视频同步
  4. MediaCodec硬件编码
  5. MediaCodec硬件解码
  6. OpenSL ES播放音频数据
  7. MediaCodec硬件解码
  8. OpenGL ES Shader显示视频

6.4、Android Ijkplayer源码分析

  1. 编译ijlplayer和实践
  2. 项目框架分析
  3. 播放状态转换
  4. 拉流分析
  5. 解码分析
  6. 音频播放流程
  7. 视频渲染流程
  8. OpenSL ES播放音频数据
  9. MediaCodec硬件解码
  10. OpenGL ES Shader显示视
  11. 变速播放实现原理
  12. 低延迟播放实现
  13. 缓存队列设计机制分析

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、音视频项目实战

  1. FFmpeg
  2. QMPlay2
  3. ijkplayer
  4. 0OBS
  5. AppRTC
  6. WebRTC
  7. Janus
  8. SRS
  9. 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、以上音视频开发学习路线涵盖最主流的音视频全栈开发技术,适合各类技术人员)

  1. 从事音视频岗位开发,但没有时间系统学习的在职工程师
  2. 从事嵌入式方向开发,想转入音视频开发的在职工程师
  3. 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师
  4. 从事Android/IOS移动开发,想往音视频方向发展的在职工程师
  5. 从事C/C+ +后台开发,想往流媒体服务器方向发展的在职工程师
  6. 自己研究学习速度较慢,不能系统构建音视频知识体系的开发人员
  7. 计算机相关专业想进入大厂的在校生(本科及以上学历,有c/C+ +基础)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT C++ widget layout 嵌套 例子2

在上篇文章中描述了实中套虚(用setLayout),虚中套实(用addWidget)。 本文再加1条,虚中套虚(用addLayout)。 所谓虚中套虚,是layout 套 layout 。 另外用循环代码生成从…

记录接口请求偶发504 Gateway Time-out问题

项目场景: 我们将服务部署到A公司服务器中,使用了共五台服务器,分别是:1.NG服务器 2.日志服务器 3.缓存服务器 4.应用服务器1 5.应用服务器2 。而请求过来首先到达的是他们的物理代理服务器,然后再转发请求到我们的ng…

【Neo4jJDK开箱即用的安装全流程】

neo4j:命令行本地访问loclhost neo4j:命令行本地访问loclhost2 neo4j操作 Neo4j桌面版数据库导出导入 Neo4j安装与配置以及JDK安装与配置教程(超详细) Neo4j 安装、使用教程 Neo4j安装教程 Neo4J桌面版的配置和连接Pycharm jdk-neo对应版本 JDK ORACLE中…

数据结构(四)————二叉树和堆(中)

制作不易,三连支持一下呗!!! 文章目录 前言一、堆的概念及结构二、堆的实现三.堆的应用 总结 前言 CSDN 这篇博客介绍了二叉树中的基本概念和存储结构,接下来我们将运用这些结构来实现二叉树 一、堆的概念及结构 1…

用sunoAI写粤语歌的方法,博主已经亲自实践可行

粤语歌还是很好听的,那么如何使用suno进行粤语歌的创作呢? 本文和大家进行分享下如何进行粤语歌曲的创作。 访问地址如下(电脑端/手机端一个地址): ​https://suno3.cn/#/?i8NCBS8_WXTT 在微信浏览器中也可以直接…

css 案例 横向滚动渐变

效果 完整代码&#xff1a; <template><view class"content"><view class"tab"><view class"tab-item" v-for"(item,index) in tab" :key"index" click"handlerTab(index)":class"ind…

winserver系统设置图片查看器

新建 .bat 批处理执行文件&#xff0c;内容如下&#xff1a; echo off&cd&color 0a&cls echo Set Win10 Photo Viewer reg add "HKLM\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" /v ".jpg" /t REG_SZ /d Photo…

MySQL——利用变量进行查询操作

新建链接&#xff0c;自带world数据库&#xff0c;里面自带city表格。 DQL # MySQL利用变量进行查询操作 set cityNameHaarlemmermeer; select * from city where NamecityName;# 多个结果查询 set cityName1Haarlemmermeer; set cityName2Breda; set cityName3Willemstad; s…

古月居讲师/签约作者招募计划

机器人&#xff0c;作为一个集成了多学科技术的复杂系统&#xff0c;其开发过程充满了挑战。为了帮助开发者们更好地克服这些挑战&#xff0c;提升项目的开发效率和质量&#xff0c;古月居特别招募[博客签约作者/课程讲师]。如果您平常热爱记录、分享开发者经验的习惯&#xff…

Emby for Mac(轻松管理多媒体影音库)1.9.9中文版

Emby for Mac是一款强大的多媒体影音库管理工具&#xff0c;可以帮助用户轻松管理和浏览自己的影音资源。它可以将用户的个人视频、音乐和照片组合在一起&#xff0c;并将其流式传输到用户的设备上。 Emby for Mac 1.9.9中文版下载 Emby for Mac具有易于使用的界面&#xff0c;…

机器学习案例:加州房产价格(四)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/#_12 数据探索和可视化、发现规律 通过之前的工作&#xff0c;你只是快速查看了数据&#xff0c;对要处理的数据有了整体了解&#xff0c;现在的目标是更深的探索数据。 首先&#xff0c;保证你将测试集放在了一旁&…

【Docker系列】Linux部署Docker Compose

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

山东济南中国当代文化名人颜廷利:大自然赋予人类众生的真正贵重礼物

大自然赋予了众生---火&#xff08;太阳&#xff0c;万物生长靠太阳&#xff09;、水&#xff08;河流&#xff0c;水是生命之源&#xff09;、木&#xff08;空气&#xff0c;生命就在一翕一合的呼吸之间&#xff09;、土&#xff08;大地&#xff0c;坤为大地之母&#xff0c…

Hive-拉链表的设计与实现

Hive-拉链表的设计与实现 在Hive中&#xff0c;拉链表专门用于解决在数据仓库中数据发生变化如何实现数据存储的问题。 1.数据同步问题 Hive在实际工作中主要用于构建离线数据仓库&#xff0c;定期的从各种数据源中同步采集数据到Hive中&#xff0c;经过分层转换提供数据应用…

【JAVA SE】初识JAVA

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;JAVA 个人主页&#xff1a;Celias blog~ 目录 ​编辑 一、关于JAVA 1.1 JAVA语言简介 1.2 语言优势 1…

链表常见OJ题

目录 题目一&#xff1a;移除链表元素 &#xff08;1&#xff09;题目链接 &#xff08;2&#xff09;题目要求 &#xff08;3&#xff09;题解 题目二&#xff1a;反转链表 &#xff08;1&#xff09;题目链接 &#xff08;2&#xff09;题目要求​编辑 &#xff08;3…

项目9-网页聊天室1(注册+Bycrpt加密)

1.准备工作 1.1.前端页面展示 1.2 数据库的建立 我们通过注册页面&#xff0c;考虑如何设计用户表数据库。 用户id&#xff0c;userId用户名&#xff0c;唯一&#xff0c;username用户密码&#xff0c;password&#xff08;包括密码和确认密码ensurePssword【数据库没有该字段…

【简单介绍下Milvus】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

网络3--网络通信的深度理解(端口号)

网络通信的进一步理解 两个主机间进行通信&#xff0c;其实是两个主机间的软件进行通信&#xff0c;软件也就是可执行程序&#xff0c;运行时就是进程&#xff0c;所以也为进程间通信。 进程间通信需要共享资源&#xff0c;这里两个主机间的共享资源是网络&#xff0c;利用的是…

Visual Studio生成C++的DLL文件(最简单版)

前言 当你在使用C编写一些可重用的代码时&#xff0c;将其打包成一个动态链接库&#xff08;DLL&#xff09;可以使其更容易地被其他项目或者程序调用和使用。Visual Studio提供了一种简单的方式来生成C的DLL文件。下面是一个关于如何在Visual Studio中生成C的DLL文件的简单教…