videodecode.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /******************************************************************************
  2. * @功能 视频解码类,在这个类中调用ffmpeg打开视频进行解码
  3. *****************************************************************************/
  4. #ifndef VIDEODECODE_H
  5. #define VIDEODECODE_H
  6. #include <QString>
  7. #include <QSize>
  8. #include <qlist.h>
  9. struct AVFormatContext;
  10. struct AVCodecContext;
  11. struct AVRational;
  12. struct AVPacket;
  13. struct AVFrame;
  14. struct AVCodec;
  15. struct SwsContext;
  16. struct AVBufferRef;
  17. class QImage;
  18. class VideoDecode
  19. {
  20. public:
  21. VideoDecode();
  22. ~VideoDecode();
  23. bool open(const QString& url = QString()); // 打开媒体文件,或者流媒体rtmp、strp、http
  24. QImage read(); // 读取视频图像
  25. void close(); // 关闭
  26. bool isEnd(); // 是否读取完成
  27. const qint64& pts(); // 获取当前帧显示时间
  28. void setHWDecoder(bool flag); // 是否使用硬件解码器
  29. bool isHWDecoder();
  30. private:
  31. void initFFmpeg(); // 初始化ffmpeg库(整个程序中只需加载一次)
  32. void initHWDecoder(const AVCodec* codec); // 初始化硬件解码器
  33. bool initObject(); // 初始化对象
  34. bool dataCopy(); // 硬件解码完成需要将数据从GPU复制到CPU
  35. void showError(int err); // 显示ffmpeg执行错误时的错误信息
  36. qreal rationalToDouble(AVRational* rational); // 将AVRational转换为double
  37. void clear(); // 清空读取缓冲
  38. void free(); // 释放
  39. private:
  40. AVFormatContext* m_formatContext = nullptr; // 解封装上下文
  41. AVCodecContext* m_codecContext = nullptr; // 解码器上下文
  42. SwsContext* m_swsContext = nullptr; // 图像转换上下文
  43. AVPacket* m_packet = nullptr; // 数据包
  44. AVFrame* m_frame = nullptr; // 解码后的视频帧
  45. AVFrame* m_frameHW = nullptr; // 硬件解码后的视频帧
  46. int m_videoIndex = 0; // 视频流索引
  47. qint64 m_totalTime = 0; // 视频总时长
  48. qint64 m_totalFrames = 0; // 视频总帧数
  49. qint64 m_obtainFrames = 0; // 视频当前获取到的帧数
  50. qint64 m_pts = 0; // 图像帧的显示时间
  51. qreal m_frameRate = 0; // 视频帧率
  52. QSize m_size; // 视频分辨率大小
  53. char* m_error = nullptr; // 保存异常信息
  54. bool m_end = false; // 视频读取完成
  55. uchar* m_buffer = nullptr;
  56. QList<int> m_HWDeviceTypes; // 保存当前环境支持的硬件解码器
  57. AVBufferRef* hw_device_ctx = nullptr; // 对数据缓冲区的引用
  58. bool m_HWDecoder = false; // 记录是否使用硬件解码
  59. };
  60. #endif // VIDEODECODE_H