videodecode.h 2.5 KB

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