AV_REFACTOR_PLAN.md 9.8 KB

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: 测试和文档

  • 全面测试两个项目的功能
  • 编写使用文档
  • 性能优化

技术要点

日志系统设计

// 支持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和标准库同步原语
  • 提供更好的异常处理和资源管理

编解码接口设计

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. 回滚机制: 每个步骤完成后提交代码,便于回滚

当前进度

第一阶段:基础设施 ✅

  • 创建基础目录结构 (AV/code/)
  • 实现统一日志系统 (logger.h/cpp)
  • 实现线程基类 (thread_base.h/cpp)
  • 实现通用工具类 (common.h/cpp, types.h)
  • 创建基础测试程序 (test_basic.cpp)

第二阶段:编解码模块 ✅

  • 编解码抽象基类设计 (abstract_codec.h/cpp)
  • 视频编码器实现 (video_encoder.h/cpp)
    • 硬件加速支持 (NVENC, QSV, AMF, VideoToolbox)
    • 像素格式转换
    • 编码参数配置
    • 统计信息收集
  • 音频编码器实现 (audio_encoder.h/cpp)
    • 音频重采样支持
    • 多种音频格式支持 (AAC, MP3, Opus, FLAC等)
    • 声道布局处理
    • 采样率转换
  • 编解码工厂模式
  • 编解码测试程序 (test_codec.cpp)
  • CMake构建系统配置

第三阶段:解码器模块 ✅

  • 视频解码器实现 (codec_video_decoder.h/cpp)
    • 硬件加速支持检测
    • 多种视频格式支持 (H.264, H.265, VP8, VP9等)
    • 像素格式转换
    • 低延迟模式
    • 统计信息收集
  • 音频解码器实现 (codec_audio_decoder.h/cpp)
    • 音频重采样支持
    • 多种音频格式支持 (AAC, MP3, Opus, FLAC等)
    • 声道布局处理
    • 采样率转换
  • 解码器测试程序 (test_decoder.cpp)

第四阶段:采集和复用模块 ✅

  • 视频采集模块 (capture_video_capturer.h/cpp)
    • 屏幕采集支持
    • 窗口采集支持
    • 摄像头采集支持
  • 音频采集模块 (capture_audio_capturer.h/cpp)
    • 系统音频采集
    • 麦克风采集
    • 音频混合支持
  • 媒体复用器模块 (muxer_*.h/cpp)
    • 文件复用器 (MP4, AVI, MKV等)
    • 流媒体复用器 (RTMP, HLS等)
    • 分段录制支持
  • 工具类模块 (utils_*.h/cpp)
    • 帧队列管理
    • 数据包队列管理
    • 同步辅助类
    • 性能监控
    • 线程池管理

第五阶段:播放器核心模块 ✅

  • 播放器核心类实现 (player_core.h/cpp)
    • 媒体文件打开和解析
    • 播放控制接口 (播放、暂停、停止、跳转)
    • 音视频同步
    • 播放速度控制
    • 音量控制
    • 播放状态管理
    • 事件回调机制
  • 队列管理模块 (queue_manager.h/cpp)
    • 数据包队列 (PacketQueue)
    • 帧队列 (FrameQueue)
    • 音视频同步器 (Synchronizer)
    • 线程安全设计
  • 线程管理模块 (thread_manager.h/cpp)
    • 读取线程 (ReadThread)
    • 视频解码线程 (VideoDecodeThread)
    • 音频解码线程 (AudioDecodeThread)
    • 线程管理器 (ThreadManager)
  • Qt集成适配器 (player_adapter.h/cpp)
    • PlayerAdapter类设计和实现
    • Qt信号槽接口
    • 线程安全的事件回调
    • PlayerAdapterFactory工厂类
  • 播放器测试程序 (test_player.cpp)
  • 集成示例和文档
    • integration_example.cpp集成示例
    • INTEGRATION_GUIDE.md集成指南
    • API对比和迁移指南
    • 完整的UI示例实现
  • CMake构建系统配置

第六阶段:项目整合和优化 🔄

  • AVPlayer2重构 (使用新的核心库)
  • AvRecorder重构 (使用新的核心库)
  • 性能优化
  • 文档完善
  • 单元测试

预期收益

  1. 代码复用: 减少重复代码,提高维护效率
  2. 模块化: 清晰的模块边界,便于测试和扩展
  3. 跨平台: 核心逻辑不依赖Qt,便于移植
  4. 性能优化: 去除不必要的Qt开销
  5. 团队协作: 统一的代码规范和架构

下一步行动

建议从步骤1开始,创建基础目录结构和日志系统。每完成一个步骤,都要进行充分测试,确保项目功能正常后再进行下一步。