基于qt,msvc2017-64bits,ffmpeg.opengl的播放器
chenshijun
2020-12-03 f96dd824b3653896bfec4e3bfdb6b02e84793075
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/**
 * 叶海辉
 * QQ群121376426
 * http://blog.yundiantech.com/
 */
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QWidget>
 
#include <QImage>
#include <QPaintEvent>
#include <QTimer>
#include <QPushButton>
#include <QPropertyAnimation>
#include <QTextCodec>
 
#include "VideoPlayer/VideoPlayerFactory.h"
#include "DragAbleWidget.h"
 
namespace Ui {
class MainWindow;
}
 
///这个是播放器的主界面 包括那些按钮和进度条之类的
class MainWindow : public DragAbleWidget, public VideoPlayerCallBack
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
protected:
    bool eventFilter(QObject *target, QEvent *event);
 
private:
    Ui::MainWindow *ui;
 
    VideoPlayer *mPlayer = nullptr; //播放线程
    PlayerFactory *mPlayerFactory = nullptr; //播放线程
    QTimer *mTimer; //定时器-获取当前视频时间
    float mVolume;
 
    QTimer *mTimer_CheckControlWidget; //用于控制控制界面的出现和隐藏
    QPropertyAnimation *mAnimation_ControlWidget;   //控制底部控制控件的出现和隐藏
    void showOutControlWidget(); //显示底部控制控件
    void hideControlWidget();    //隐藏底部控制控件
 
    void initPlayer(VIDEOTYPE videoType) {
        unInitPlayer();
        switch (videoType) {
        case RUNWEIVIDEO:
            mPlayerFactory = new PlayerRunweiProducer();
            break;
        case CDYDVIDEO:
            mPlayerFactory = new PlayerCDYDProducer();
            break;
        case CSHHVIDEO:
            mPlayerFactory = new PlayerCSHHProducer();
            break;
        case ZZCXVIDEO:
            mPlayerFactory = new PlayerZZCXProducer();
            break;
        case HKVIDEO:
            mPlayerFactory = new PlayerHKProducer();
            break;
        case NORMALVIDEO:
        default:
            mPlayerFactory = new PlayerNormalProducer();
            break;
        }
        mPlayer = mPlayerFactory->CreatePlayer();
    }
 
    void unInitPlayer(){
        if(mPlayer != nullptr){
            delete mPlayer;
        }
 
        if(mPlayerFactory != nullptr){
            delete mPlayerFactory;
        }
    }
 
 
private slots:
    ///播放器相关的槽函数
    void slotSliderMoved(int value);
    void slotTimerTimeOut();
    void slotBtnClick(bool isChecked);
 
 
    ///以下函数,是播放器的回调函数,用于输出信息给界面
protected:
    ///打开文件失败
    void onOpenVideoFileFailed(const int &code);
 
    ///打开sdl失败的时候回调此函数
    void onOpenSdlFailed(const int &code);
 
    ///获取到视频时长的时候调用此函数
    void onTotalTimeChanged(const int64_t &uSec);
 
    ///播放器状态改变的时候回调此函数
    void onPlayerStateChanged(const VideoPlayerState &state, const bool &hasVideo, const bool &hasAudio);
 
    ///显示视频数据,此函数不宜做耗时操作,否则会影响播放的流畅性。
    void onDisplayVideo(VideoFramePtr videoFrame);
 
};
 
#endif // MAINWINDOW_H