# Qt学习 **Repository Path**: yuxuebo/QtLearning ## Basic Information - **Project Name**: Qt学习 - **Description**: 平时学习用的。不同分支不同功能。比较杂 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: readImage - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-28 - **Last Updated**: 2026-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QRTSP - 基于 Qt + FFmpeg + OpenCV 的 RTSP/RTMP 流媒体播放器 ## 项目简介 QRTSP 是一个基于 **Qt 5.15** 框架,结合 **FFmpeg** 和 **OpenCV** 库开发的 RTSP/RTMP 网络流媒体播放器。该项目实现了从网络拉流、硬件解码、图像格式转换到画面显示的全流程,采用多线程架构保证播放流畅性。 ## 技术栈 | 技术 | 版本 | 用途 | |------|------|------| | Qt | 5.15.2 (MSVC2019 64-bit) | GUI 框架 | | FFmpeg | 6.x / 7.x (依赖动态库) | 网络拉流、音视频解码 | | OpenCV | 4.5.5 (world 单库模式) | 图像数据结构、图像显示 | | C++ | C++17 | 开发语言标准 | | 构建工具 | qmake (MSVC 2019) | 项目构建 | ## 项目结构 ``` QRTSP/ ├── QRTSP.pro # Qt 项目配置文件 ├── main.cpp # 程序入口,拉流与显示主循环 ├── mainwindow.h # 主窗口头文件 ├── mainwindow.cpp # 主窗口实现 ├── mainwindow.ui # Qt Designer UI 文件(当前为空白布局) ├── FfmpegStreamReader.h # 流读取与解码模块头文件 ├── FfmpegStreamReader.cpp # 流读取与解码模块实现 ├── bin/ # 编译输出目录 │ ├── debug/ # Debug 版本可执行文件 + DLL │ └── release/ # Release 版本可执行文件 + DLL ├── build/ # 编译中间文件目录 │ └── Desktop_Qt_5_15_2_MSVC2019_64bit-Debug/ │ └── .qtc_clangd/ │ └── .cache/clangd/index/ # Clangd 索引缓存 ├── thirdparty/ # 第三方依赖库 │ ├── ffmpeg/ # FFmpeg 库(头文件 + lib + dll) │ └── opencv/ # OpenCV 4.5.5 库 │ ├── include/ # OpenCV 头文件 │ └── x64/vc15/ # 64位 MSVC 编译库 │ ├── bin/ # 运行时 DLL │ └── lib/ # 导入库 (.lib) └── .qtcreator/ # Qt Creator IDE 配置文件 └── QRTSP.pro.user ``` ## 核心模块说明 ### 1. FfmpegStreamReader(核心解码模块) 位于 [FfmpegStreamReader.h](file:///c:/Users/admin/Documents/Qt/QRTSP/FfmpegStreamReader.h) 和 [FfmpegStreamReader.cpp](file:///c:/Users/admin/Documents/Qt/QRTSP/FfmpegStreamReader.cpp)。 这是整个项目的核心类,负责完整的拉流与解码流程: - **`open(url, err)`** — 打开网络流媒体,支持 RTSP、RTMP 协议 - 初始化 FFmpeg 网络模块 - 配置 RTSP 传输为 TCP 模式(稳定性优先) - 探测流信息,自动识别视频流和音频流索引 - 初始化解码器(H.264/H.265 等) - 解码线程数限制为 2,减少资源抢占 - **`start(callback)`** — 异步启动拉流和解码 - 创建 SWS 图像转换上下文(输出 BGR24 格式) - 启动两个工作线程:解码线程 + 处理线程 - **`stop()`** — 停止拉流并等待线程退出 - **`isRunning()` / `reachedEof()`** — 状态查询接口 #### 双线程架构 ``` ┌─────────────────────────────────────────────────────────┐ │ FfmpegStreamReader │ ├──────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────┐ 帧队列 ┌──────────────────┐ │ │ │ 解码线程 │ (最大12帧) │ 处理线程 │ │ │ │ decodingThread() │ ─────────► │ processingThread()│ │ │ │ │ push/pop │ │ │ │ │ • av_read_frame │ │ • 从队列取帧 │ │ │ │ • avcodec_send │ │ • 回调通知上层 │ │ │ │ • avcodec_receive│ │ │ │ │ │ • sws_scale │ │ │ │ │ │ • 转 BGR24 │ │ │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ ``` ### 2. 主程序入口 main.cpp 位于 [main.cpp](file:///c:/Users/admin/Documents/Qt/QRTSP/main.cpp)。 - 创建 QApplication 和 FfmpegStreamReader 实例 - 默认连接腾讯云直播测试地址(RTMP) - 通过回调函数接收解码后的帧 - 使用 OpenCV 的 `cv::imshow` 显示画面 - 当前显示循环代码已被注释,保留了完整框架 ### 3. MainWindow(Qt 主窗口) 位于 [mainwindow.h](file:///c:/Users/admin/Documents/Qt/QRTSP/mainwindow.h) 和 [mainwindow.cpp](file:///c:/Users/admin/Documents/Qt/QRTSP/mainwindow.cpp)。 - 标准的 Qt QMainWindow 窗口 - UI 文件初始大小为 800x600 - 当前为占位使用,尚未集成视频显示逻辑 ## 编译与运行 ### 环境要求 1. **Visual Studio 2019**(MSVC v142 工具集) 2. **Qt 5.15.2**(msvc2019 64-bit 版本) 3. **FFmpeg 开发库**(包含头文件、lib、dll) 4. **OpenCV 4.5.5**(已内置于 `thirdparty/opencv`) ### 构建步骤 1. 使用 **Qt Creator** 打开 `QRTSP.pro` 2. 选择构建套件 `Desktop_Qt_5_15_2_MSVC2019_64bit` 3. 点击构建(Ctrl+B) ### 依赖的 FFmpeg 动态库 运行程序时需要以下 DLL 文件(位于 `bin/debug/` 或 `bin/release/`): - `avcodec-62.dll` - `avformat-62.dll` - `avutil-60.dll` - `swscale-9.dll` - `swresample-6.dll` - `avdevice-62.dll` - `avfilter-11.dll` ### 注意事项 - 所有 DLL 文件需放置在可执行文件同目录下 - 当前 `main.cpp` 中的显示循环被注释,如需显示画面需取消注释 - 项目使用 RTSP TCP 传输模式,确保网络环境支持 TCP 连接 - 编译时已禁用部分 MSVC 警告(/wd4819、/wd4244、/wd4267) - 源码文件使用 UTF-8 编码(/utf-8 编译选项) ## 许可证 本项目为个人学习与实验用途。