很多人第一次做直播推流,卡住的地方不是「不会写 C++」,而是不知道摄像头出来的那一帧画面,到底在什么时候被谁改了格式。你打开摄像头拿到的是 YUYV,编码器要的是 YUV420P,中间还要插一层美颜,美颜完再喂给 FFmpeg 编码——这中间任何一环对不上,出来的就是花屏、绿屏、或者延迟三秒的鬼影。这门课要解决的,就是这条链路上每个环节的接口该怎么接。
先确认你是不是这门课的目标读者
如果你只写过控制台程序,没碰过 Qt 的信号槽,也没用过 FFmpeg 的命令行,那这门课会让你很难受。它不是讲「什么是视频编码」的科普,而是直接上手写代码:用 Qt5 搭界面、用 OpenCV 的 VideoCapture 抓帧、用 FFmpeg 的 SDK 做编码和推流。默认你已经知道 C++ 的类、指针、智能指针,也见过 CMake 或者 qmake。
反过来,如果你已经能跑通 ffmpeg 命令行推流,但想把美颜算法塞进去、想自己控制每一帧的 pts,或者想把整个流程嵌进一个 Qt 桌面程序里,那这门课正好补的就是这块。
抓帧这一层,坑比想象中多
OpenCV 的 VideoCapture 打开摄像头,看着只有一行,但背后做了什么?为什么默认读出来是 BGR 三通道,而 FFmpeg 编码器偏偏要 YUV420P?这门课会把这层拆开讲:摄像头驱动给的原始格式、OpenCV 内部的转换、以及你如何绕开多余的转换直接拿到底层数据。
更实际的一个问题是帧率。摄像头跑 30fps,你的美颜算法一帧要 50ms,结果就是采集线程被阻塞,画面越堆越卡。课程里会涉及读取一帧的接口分析和源码层面的过程,你需要看懂的是「数据在哪个缓冲区里、什么时候被覆盖」,而不是背 API 名字。
美颜不是滤镜,是像素级操作
把美颜理解成「加个好看的 LUT」就偏了。实时直播里的美颜通常是磨皮加美白,磨皮要么用双边滤波,要么用导向滤波,都涉及对每个像素邻域的运算。在 1080p 下,纯 CPU 逐像素跑双边滤波,单帧就可能超过 30ms。课程里会走通的是把 OpenCV 处理后的 Mat 转成 AVFrame 再送编码器这条路径,你要能回答:处理后的数据是拷贝还是引用?色彩空间在哪一步转换?如果转换放在美颜之后,会不会把磨皮的细节又抹掉?
编码和推流,重点在 pts 和时间基
FFmpeg 的编码器不关心你画面好不好看,它只关心两件事:这一帧的数据对不对、这一帧的时间戳合不合理。课程里有一节专门讲视频帧编码并设置 AVFrame 的输入 pts。很多人推流出去画面一卡一卡,或者播放器直接报错,问题就出在 pts 上:时间基没转换、pts 用了毫秒而不是按 stream 的 time_base 算、或者干脆每一帧都填了同一个值。你要能说清楚 av_rescale_q 到底在做什么,才算是真的会推流。
看完之后,你应该能回答这些问题
- OpenCV 抓到的帧是什么格式,要经过哪几步才能变成编码器接受的 AVFrame?
- Qt 界面线程和采集/编码线程怎么分工,画面预览和推流能不能共用一份数据?
- 美颜处理放在 YUV 域还是 RGB 域,对性能和画质分别有什么影响?
- 推流地址的封装格式怎么选,为什么有的地址用 RTMP 有的用 RTSP?
- pts 算错的时候,播放端会看到什么现象?
这些问题的答案不在文档里,在你自己把代码跑通、然后故意改坏一个参数看现象的过程中。课程提供的是这条链路的骨架,剩下的调试得你自己来。
夏曹俊主讲:C++ FFmpegSDK美颜直播推流实战教程(Qt5+OpenCV)
Qt5+OpenCV美颜直播推流实战
编辑点评
实战性强,深入浅出,适合有一定C++基础的学习者。
⭐ 编辑推荐
跟随夏曹俊老师,学习C++ FFmpegSDK美颜直播推流技术,掌握Qt5和OpenCV应用。
课程亮点
课程目录
【夏曹俊】C++编程FFMpegSDK美颜直播推流实战-基于qt5,opencv视频课资料.png [493.5 KB] 5-07、视频帧编码并根据设置AVFrame的输入pts_ev.mp4 [28.5 MB] 4-05、读取一帧视频接口讲解和源码分析,分析读取解码和颜色转换过程_ev.mp4 [17.7 MB] 4-04、VideoCapture打开摄像头接口讲解和源码分析_ev.mp4 [12.8 MB] 1-03、直播rtmp协议分析_ev.mp4 [17.1 MB] 4-03、遍历修改连续的Mat图像空间_ev.mp4 [19.2 MB] 5-05、查找编码器并创建编码器上下文_ev.mp4 [24.4 MB] 5-02、基于opencv采集rtsp流并使用异常处理失败流程_ev.mp4 [35.2 MB] 4-01、opencv源码在windows下载编译安装_ev.mp4 [14.4 MB] 5-01、opencv播放rtsp海康摄像头和播放系统摄像头_ev.mp4 [30.4 MB] 7-05、XAudioRecord集成数据基类重构_ev_ev.mp4 [25.1 MB] 8-09、QT直播推流项目完成界面设计_ev_ev.mp4 [33.9 MB] 5-14、完成了视频编码接口并重构rtsp_to_rtmp代码_ev.mp4 [28.5 MB] 7-04、XDataThread数据处理线程类创建并实现_ev_ev.mp4 [29.9 MB] 7-07、完成音视频推流封装处理未同步_ev_ev.mp4 [39.4 MB] 6-10、封装音频编码器设置接口重构视频编码器接口_ev.mp4 [25.0 MB] 6-05、音频重采样空间分配并完成重采样_ev_ev.mp4 [25.5 MB] 8-02、双边滤波磨皮算法调用并测试性能_ev_ev.mp4 [32.3 MB] 7-03、封装视频录制接口完成初始化和关闭接口_ev_ev.mp4 [29.8 MB] 3-04、打开rtmp推流输出并从文件读取音视频帧_ev.mp4 [41.9 MB] 2-04、nginx-rtmp直播和直播状态监听配置ffplay播放_ev.mp4 [25.7 MB] 1-02、直播推流流程分析讲解_ev_ev.mp4 [11.2 MB] 5-15、创建XRtmp接口类完成封装器接口_ev.mp4 [59.4 MB] 4-02、windows 上创建opencv示例项目_ev.mp4 [21.0 MB] 8-03、直播框架添加图像过滤XFilter接口并实现双边滤波磨皮类_ev_ev.mp4 [39.9 MB] 3-07、推流基于rtsp协议的大华海康相机_ev.mp4 [61.6 MB] 8-06、完成了XController音视频录制模块初始化_ev_ev.mp4 [37.0 MB] 7-01、封装音频XAudioRecord初始化和关闭接口_ev_ev.mp4 [29.1 MB] 6-12、完成音频推流接口XRtmp封装重构音频推流_ev_ev.mp4 [34.6 MB] 5-08、创建封装器添加视频AVStream并设置参数_ev.mp4 [28.8 MB] 8-01、磨皮双边滤波算法参数说明_ev_ev.mp4 [18.1 MB] 2-01、直播服务器介绍crtmpserver编译运行(ubuntu)_ev.mp4 [31.1 MB] 5-13、完成视频编码器初始化InitVideoCodec接口封装_ev.mp4 [23.1 MB] 8-04、直播框架添加美颜磨皮_ev_ev.mp4 [21.3 MB] 6-01、QT5开发环境准备_ev.mp4 [25.0 MB] 6-03、QT音频录制接口讲解并编写录制音频程序_ev.mp4 [24.8 MB] 5-06、编码器参数配置(包括打开多线程编码)并打开编码器_ev.mp4 [36.5 MB] 5-03、像素格式转换(RGBToYUV)上下文创建配置和清理_ev.mp4 [41.5 MB] 1-01、课程介绍_ev_ev.mp4 [20.0 MB] 6-09、音频重采样XMediaEncode重采样接口封装代码重构_ev.mp4 [51.0 MB] 7-10、音视频同步二解决音频有相同pts情况_ev_ev.mp4 [24.5 MB] 5-11、完成InitScale初始化像素格式转换接口_ev.mp4 [20.3 MB] 7-09、音视频同步时间计算代码分析第一部分_ev_ev.mp4 [68.9 MB] 6-02、音频基础知识音频参数分析_ev.mp4 [25.2 MB] 3-02、初始化封装和网络库打开音视频流并打印调试信息_ev.mp4 [41.6 MB] 3-01、ffmpegSDK开发环境准备,第一个ffmpeg项目创建_ev.mp4 [41.2 MB] 6-07、音频的pts运算音频数据编码测试_ev_ev.mp4 [17.5 MB] 6-06、音频编码器创建和参数设置_ev_ev.mp4 [23.3 MB] 2-03、nginx-rtmp源码下载、编译运行(ubuntu)_ev.mp4 [25.3 MB] 5-10、XMediaEndcode工厂生产方法创建_ev.mp4 [21.0 MB] 7-06、加入视频编码器和流_ev_ev.mp4 [27.7 MB] 6-04、音频重采样上下文创建和配置_ev.mp4 [27.0 MB] 3-05、AVPacket的pts运算并完成帧推送使用vlc测试_ev.mp4 [29.5 MB] 5-12、完成RGBToYUV接口封装并重构代码_ev.mp4 [30.4 MB] 7-02、完成音频录制接口,录制缓冲队列处理_ev_ev.mp4 [50.4 MB] 5-09、打开推流IO,发送封装头,计算pts完成帧推流_ev.mp4 [34.6 MB] 5-04、rgb转yuv空间分配和转换函数调用_ev.mp4 [47.5 MB] 2-02、下载ffmpeg工具推流并使用功能vlc拉流播放测试_ev.mp4 [20.8 MB] 8-05、XRtmpStreamer项目框架架构(类图)讲解_ev_ev.mp4 [12.1 MB] 7-11、音视频同步三完成同步_ev_ev.mp4 [18.6 MB] 3-06、根据pts和系统记时控制推流速度_浏览器flash播放直播流_ev.mp4 [39.8 MB] 6-08、完成音频推流并测试_ev.mp4 [31.4 MB] 7-08、音频推流同步策略分析_ev_ev.mp4 [17.1 MB] 8-10、完成了qt项目直播推流_ev_ev.mp4 [44.4 MB] 6-11、完成音频编码接口封装和代码重构_ev_ev.mp4 [22.3 MB] 8-08、XController推流数据线程完成_ev_ev.mp4 [48.6 MB] 8-07、完成XController中的编码封装推流模块初始化_ev_ev.mp4 [47.5 MB] 3-03、完成输出音视频流配置信息,使用ffmpeg新版本属性_ev.mp4 [45.6 MB]
适合人群
- C++开发者
- 移动开发爱好者
学习收获
祝您学习愉快!
学有所成,前程似锦!






