# AV项目重构方案 ## 项目概述 当前有两个项目: - **AVPlayer2**: 音视频播放器,包含解码、播放功能 - **AvRecorder**: 音视频录制器,包含采集、编码、推流功能 ## 重构目标 1. **去Qt化**: 除UI渲染和音频播放外,其他模块不使用Qt 2. **代码复用**: 提取两个项目的共同部分 3. **模块化**: 清晰的模块划分,便于维护和扩展 4. **小范围重构**: 每个步骤都能保证项目正常运行 5. **统一日志**: 封装统一的日志系统 ## 新目录结构 ``` AV/ ├── code/ # 核心代码库(不依赖Qt) │ ├── base/ # 基础设施 │ │ ├── logger.h/.cpp # 统一日志系统 │ │ ├── thread_base.h/.cpp # 线程基类 │ │ ├── common.h/.cpp # 通用工具 │ │ └── types.h # 类型定义 │ ├── codec/ # 编解码模块 │ │ ├── decoder/ # 解码器 │ │ │ ├── audio_decoder.h/.cpp │ │ │ ├── video_decoder.h/.cpp │ │ │ └── decoder_base.h/.cpp │ │ └── encoder/ # 编码器 │ │ ├── audio_encoder.h/.cpp │ │ ├── video_encoder.h/.cpp │ │ └── encoder_base.h/.cpp │ ├── capture/ # 采集模块 │ │ ├── audio_capture.h/.cpp │ │ └── video_capture.h/.cpp │ ├── muxer/ # 复用器 │ │ └── av_muxer.h/.cpp │ └── utils/ # 工具类 │ ├── frame_queue.h/.cpp │ ├── packet_queue.h/.cpp │ └── sync_helper.h/.cpp ├── AvPlayer/ # 播放器项目 │ ├── ui/ # Qt UI相关 │ ├── player/ # 播放器逻辑 │ └── main.cpp └── AvRecorder/ # 录制器项目 ├── ui/ # Qt UI相关 ├── recorder/ # 录制器逻辑 └── main.cpp ``` ## 重构步骤(分阶段进行) ### 阶段1: 基础设施搭建(1-3步) #### 步骤1: 创建新目录结构和基础类 - 创建 `AV/code/base/` 目录 - 实现统一的日志系统 `logger.h/.cpp` - 实现线程基类 `thread_base.h/.cpp`(基于现有ThreadBase.h改进) - 实现通用类型定义 `types.h` #### 步骤2: 统一日志系统 - 在两个项目中集成新的日志系统 - 保持向后兼容,逐步替换现有日志调用 - 测试日志功能正常 #### 步骤3: 线程基类统一 - 将AVPlayer2的ThreadBase迁移到新的thread_base - 在AvRecorder中也使用统一的线程基类 - 确保所有线程相关功能正常 ### 阶段2: 编解码模块重构(4-8步) #### 步骤4: 抽象编解码基类 - 创建 `AV/code/codec/` 目录 - 基于AvRecorder的abstract_encoder设计统一的编解码基类 - 定义编码器和解码器的通用接口 #### 步骤5: 音频编码器重构 - 将AvRecorder的audio_encoder迁移到新目录 - 去除Qt依赖,使用标准C++ - 在AvRecorder中使用新的音频编码器 #### 步骤6: 视频编码器重构 - 将AvRecorder的video_encoder迁移到新目录 - 去除Qt依赖 - 在AvRecorder中使用新的视频编码器 #### 步骤7: 音频解码器重构 - 基于AVPlayer2的audio_decode_thread创建新的audio_decoder - 分离解码逻辑和线程逻辑 - 在AVPlayer2中使用新的音频解码器 #### 步骤8: 视频解码器重构 - 基于AVPlayer2的video_decode_thread创建新的video_decoder - 分离解码逻辑和线程逻辑 - 在AVPlayer2中使用新的视频解码器 ### 阶段3: 采集和复用模块(9-11步) #### 步骤9: 音视频采集模块 - 将AvRecorder的capturer模块迁移到 `AV/code/capture/` - 去除Qt依赖(除了必要的音频采集部分) - 统一采集接口 #### 步骤10: 复用器模块 - 将AvRecorder的muxer迁移到新目录 - 确保与新的编码器兼容 #### 步骤11: 工具类模块 - 创建统一的队列管理(frame_queue, packet_queue) - 创建同步辅助类 - 替换两个项目中的相关实现 ### 阶段4: 项目整合和优化(12-15步) #### 步骤12: AVPlayer2重构 - 使用新的核心库重构播放器 - 保持UI部分不变 - 确保播放功能完整 #### 步骤13: AvRecorder重构 - 使用新的核心库重构录制器 - 保持UI部分不变 - 确保录制和推流功能完整 #### 步骤14: 代码清理 - 删除重复的旧代码 - 优化包含路径 - 统一编码规范 #### 步骤15: 测试和文档 - 全面测试两个项目的功能 - 编写使用文档 - 性能优化 ## 技术要点 ### 日志系统设计 ```cpp // 支持Qt的qDebug等,但封装为独立接口 class Logger { public: static Logger& instance(); void debug(const std::string& msg); void info(const std::string& msg); void warning(const std::string& msg); void error(const std::string& msg); // Qt兼容接口 void qtDebug(const QString& msg); void qtInfo(const QString& msg); }; // 宏定义,便于使用 #define LOG_DEBUG(msg) Logger::instance().debug(msg) #define LOG_INFO(msg) Logger::instance().info(msg) ``` ### 线程基类改进 - 基于现有ThreadBase.h,但去除Qt依赖 - 使用std::thread和标准库同步原语 - 提供更好的异常处理和资源管理 ### 编解码接口设计 ```cpp class CodecBase { public: virtual bool open(const CodecParams& params) = 0; virtual bool process(AVFrame* frame) = 0; virtual void close() = 0; virtual ~CodecBase() = default; }; class EncoderBase : public CodecBase { public: virtual AVPacket* encode(AVFrame* frame) = 0; }; class DecoderBase : public CodecBase { public: virtual AVFrame* decode(AVPacket* packet) = 0; }; ``` ## 风险控制 1. **每个步骤都要测试**: 确保修改后项目能正常编译和运行 2. **保持向后兼容**: 在过渡期间保留旧接口 3. **分支开发**: 在独立分支进行重构,主分支保持稳定 4. **增量迁移**: 逐个模块迁移,不要一次性大改 5. **回滚机制**: 每个步骤完成后提交代码,便于回滚 ## 当前进度 ### 第一阶段:基础设施 ✅ - [x] 创建基础目录结构 (`AV/code/`) - [x] 实现统一日志系统 (`logger.h/cpp`) - [x] 实现线程基类 (`thread_base.h/cpp`) - [x] 实现通用工具类 (`common.h/cpp`, `types.h`) - [x] 创建基础测试程序 (`test_basic.cpp`) ### 第二阶段:编解码模块 ✅ - [x] 编解码抽象基类设计 (`abstract_codec.h/cpp`) - [x] 视频编码器实现 (`video_encoder.h/cpp`) - [x] 硬件加速支持 (NVENC, QSV, AMF, VideoToolbox) - [x] 像素格式转换 - [x] 编码参数配置 - [x] 统计信息收集 - [x] 音频编码器实现 (`audio_encoder.h/cpp`) - [x] 音频重采样支持 - [x] 多种音频格式支持 (AAC, MP3, Opus, FLAC等) - [x] 声道布局处理 - [x] 采样率转换 - [x] 编解码工厂模式 - [x] 编解码测试程序 (`test_codec.cpp`) - [x] CMake构建系统配置 ### 第三阶段:解码器模块 🔄 - [ ] 视频解码器实现 - [ ] 音频解码器实现 - [ ] 解码器测试程序 ### 第四阶段:采集和复用模块 ⏳ - [ ] 视频采集模块 - [ ] 音频采集模块 - [ ] 媒体复用器模块 - [ ] 流媒体支持 ### 第五阶段:项目整合和优化 ⏳ - [ ] 原项目迁移适配 - [ ] 性能优化 - [ ] 文档完善 - [ ] 单元测试 ## 预期收益 1. **代码复用**: 减少重复代码,提高维护效率 2. **模块化**: 清晰的模块边界,便于测试和扩展 3. **跨平台**: 核心逻辑不依赖Qt,便于移植 4. **性能优化**: 去除不必要的Qt开销 5. **团队协作**: 统一的代码规范和架构 ## 下一步行动 建议从**步骤1**开始,创建基础目录结构和日志系统。每完成一个步骤,都要进行充分测试,确保项目功能正常后再进行下一步。