| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #ifndef AV_PLAYER_VIDEO_RENDERER_H
- #define AV_PLAYER_VIDEO_RENDERER_H
- #include <QWidget>
- #include <QLabel>
- #include <QPixmap>
- #include <QMutex>
- #include <QTimer>
- #include <memory>
- #include <atomic>
- extern "C" {
- #include <libavutil/frame.h>
- #include <libavutil/pixfmt.h>
- #include <libswscale/swscale.h>
- }
- #include "../base/media_common.h"
- namespace av {
- namespace player {
- /**
- * 视频渲染器类
- /**
- * 负责将解码后的视频帧渲染到Qt控件上
- */
- class VideoRenderer : public QLabel
- {
- Q_OBJECT
- public:
- explicit VideoRenderer(QWidget* parent = nullptr);
- ~VideoRenderer();
- /**
- * 初始化视频渲染器
- * @param width 视频宽度
- * @param height 视频高度
- * @param pixelFormat 像素格式
- * @return 是否成功
- */
- bool initialize(int width, int height, AVPixelFormat pixelFormat);
- /**
- * 渲染视频帧
- * @param frame 视频帧
- * @return 是否成功
- */
- bool renderFrame(const AVFramePtr& frame);
- /**
- * 清空显示
- */
- void clear();
- /**
- * 设置保持宽高比
- * @param keepAspectRatio 是否保持宽高比
- */
- void setKeepAspectRatio(bool keepAspectRatio);
- /**
- * 获取是否保持宽高比
- */
- bool getKeepAspectRatio() const;
- /**
- * 设置背景颜色
- * @param color 背景颜色
- */
- void setBackgroundColor(const QColor& color);
- /**
- * 获取视频尺寸
- */
- QSize getVideoSize() const;
- /**
- * 获取显示尺寸
- */
- QSize getDisplaySize() const;
- /**
- * 是否已初始化
- */
- bool isInitialized() const;
- protected:
- void paintEvent(QPaintEvent* event) override;
- void resizeEvent(QResizeEvent* event) override;
- private slots:
- void updateDisplay();
- private:
- /**
- * 初始化图像转换器
- */
- bool initConverter();
- /**
- * 清理图像转换器
- */
- void cleanupConverter();
- /**
- * 转换视频帧为QImage
- */
- QImage convertFrameToImage(const AVFramePtr& frame);
- /**
- * 计算显示矩形
- */
- QRect calculateDisplayRect() const;
- /**
- * 缩放图像
- */
- QPixmap scaleImage(const QImage& image) const;
- private:
- // 视频参数
- int m_videoWidth;
- int m_videoHeight;
- AVPixelFormat m_inputFormat;
-
- // 图像转换器
- SwsContext* m_swsContext;
- uint8_t* m_rgbBuffer;
- int m_rgbBufferSize;
-
- // 显示相关
- QPixmap m_currentPixmap;
- QColor m_backgroundColor;
- bool m_keepAspectRatio;
-
- // 状态
- std::atomic<bool> m_initialized;
-
- // 更新定时器
- QTimer* m_updateTimer;
-
- mutable QMutex m_mutex;
- };
- } // namespace player
- } // namespace av
- #endif // AV_PLAYER_VIDEO_RENDERER_H
|