video_renderer.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #ifndef AV_PLAYER_VIDEO_RENDERER_H
  2. #define AV_PLAYER_VIDEO_RENDERER_H
  3. #include <QWidget>
  4. #include <QLabel>
  5. #include <QPixmap>
  6. #include <QMutex>
  7. #include <QTimer>
  8. #include <memory>
  9. #include <atomic>
  10. extern "C" {
  11. #include <libavutil/frame.h>
  12. #include <libavutil/pixfmt.h>
  13. #include <libswscale/swscale.h>
  14. }
  15. #include "../base/media_common.h"
  16. namespace av {
  17. namespace player {
  18. /**
  19. * 视频渲染器类
  20. /**
  21. * 负责将解码后的视频帧渲染到Qt控件上
  22. */
  23. class VideoRenderer : public QLabel
  24. {
  25. Q_OBJECT
  26. public:
  27. explicit VideoRenderer(QWidget* parent = nullptr);
  28. ~VideoRenderer();
  29. /**
  30. * 初始化视频渲染器
  31. * @param width 视频宽度
  32. * @param height 视频高度
  33. * @param pixelFormat 像素格式
  34. * @return 是否成功
  35. */
  36. bool initialize(int width, int height, AVPixelFormat pixelFormat);
  37. /**
  38. * 渲染视频帧
  39. * @param frame 视频帧
  40. * @return 是否成功
  41. */
  42. bool renderFrame(const AVFramePtr& frame);
  43. /**
  44. * 清空显示
  45. */
  46. void clear();
  47. /**
  48. * 设置保持宽高比
  49. * @param keepAspectRatio 是否保持宽高比
  50. */
  51. void setKeepAspectRatio(bool keepAspectRatio);
  52. /**
  53. * 获取是否保持宽高比
  54. */
  55. bool getKeepAspectRatio() const;
  56. /**
  57. * 设置背景颜色
  58. * @param color 背景颜色
  59. */
  60. void setBackgroundColor(const QColor& color);
  61. /**
  62. * 获取视频尺寸
  63. */
  64. QSize getVideoSize() const;
  65. /**
  66. * 获取显示尺寸
  67. */
  68. QSize getDisplaySize() const;
  69. /**
  70. * 是否已初始化
  71. */
  72. bool isInitialized() const;
  73. protected:
  74. void paintEvent(QPaintEvent* event) override;
  75. void resizeEvent(QResizeEvent* event) override;
  76. private slots:
  77. void updateDisplay();
  78. private:
  79. /**
  80. * 初始化图像转换器
  81. */
  82. bool initConverter();
  83. /**
  84. * 清理图像转换器
  85. */
  86. void cleanupConverter();
  87. /**
  88. * 转换视频帧为QImage
  89. */
  90. QImage convertFrameToImage(const AVFramePtr& frame);
  91. /**
  92. * 计算显示矩形
  93. */
  94. QRect calculateDisplayRect() const;
  95. /**
  96. * 缩放图像
  97. */
  98. QPixmap scaleImage(const QImage& image) const;
  99. private:
  100. // 视频参数
  101. int m_videoWidth;
  102. int m_videoHeight;
  103. AVPixelFormat m_inputFormat;
  104. // 图像转换器
  105. SwsContext* m_swsContext;
  106. uint8_t* m_rgbBuffer;
  107. int m_rgbBufferSize;
  108. // 显示相关
  109. QPixmap m_currentPixmap;
  110. QColor m_backgroundColor;
  111. bool m_keepAspectRatio;
  112. // 状态
  113. std::atomic<bool> m_initialized;
  114. // 更新定时器
  115. QTimer* m_updateTimer;
  116. mutable QMutex m_mutex;
  117. };
  118. } // namespace player
  119. } // namespace av
  120. #endif // AV_PLAYER_VIDEO_RENDERER_H