video_renderer.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. * @param fps 视频帧率(默认25fps)
  35. * @return 是否成功
  36. */
  37. bool initialize(int width, int height, AVPixelFormat pixelFormat, double fps = 25.0);
  38. /**
  39. * 渲染视频帧
  40. * @param frame 视频帧
  41. * @return 是否成功
  42. */
  43. bool renderFrame(const AVFramePtr& frame);
  44. /**
  45. * 清空显示
  46. */
  47. void clear();
  48. /**
  49. * 设置保持宽高比
  50. * @param keepAspectRatio 是否保持宽高比
  51. */
  52. void setKeepAspectRatio(bool keepAspectRatio);
  53. /**
  54. * 获取是否保持宽高比
  55. */
  56. bool getKeepAspectRatio() const;
  57. /**
  58. * 设置背景颜色
  59. * @param color 背景颜色
  60. */
  61. void setBackgroundColor(const QColor& color);
  62. /**
  63. * 获取视频尺寸
  64. */
  65. QSize getVideoSize() const;
  66. /**
  67. * 获取显示尺寸
  68. */
  69. QSize getDisplaySize() const;
  70. /**
  71. * 是否已初始化
  72. */
  73. bool isInitialized() const;
  74. protected:
  75. void paintEvent(QPaintEvent* event) override;
  76. void resizeEvent(QResizeEvent* event) override;
  77. private slots:
  78. void updateDisplay();
  79. private:
  80. /**
  81. * 初始化图像转换器
  82. */
  83. bool initConverter();
  84. /**
  85. * 清理图像转换器
  86. */
  87. void cleanupConverter();
  88. /**
  89. * 转换视频帧为QImage
  90. */
  91. QImage convertFrameToImage(const AVFramePtr& frame);
  92. /**
  93. * 计算显示矩形
  94. */
  95. QRect calculateDisplayRect() const;
  96. /**
  97. * 缩放图像
  98. */
  99. QPixmap scaleImage(const QImage& image) const;
  100. private:
  101. // 视频参数
  102. int m_videoWidth;
  103. int m_videoHeight;
  104. AVPixelFormat m_inputFormat;
  105. double m_fps;
  106. // 图像转换器
  107. SwsContext* m_swsContext;
  108. uint8_t* m_rgbBuffer;
  109. int m_rgbBufferSize;
  110. // 显示相关
  111. QPixmap m_currentPixmap;
  112. QColor m_backgroundColor;
  113. bool m_keepAspectRatio;
  114. // 状态
  115. std::atomic<bool> m_initialized;
  116. // 更新定时器
  117. QTimer* m_updateTimer;
  118. mutable QMutex m_mutex;
  119. };
  120. } // namespace player
  121. } // namespace av
  122. #endif // AV_PLAYER_VIDEO_RENDERER_H