1. 程式人生 > >Qt編寫視訊播放器(vlc核心)

Qt編寫視訊播放器(vlc核心)

在研究qt+vlc的過程中,就想直接做個播放器用於獨立的專案,vlc還支援硬體加速,不過部分電腦硬體不支援除外。用vlc的核心寫播放器就是快,直接呼叫api就行,邏輯處理和ui展示基本上分分鐘的事情,最好加點美化那就更加完美了,市面上很多播放器是vlc核心寫的,或者ffmpeg寫的。
可執行檔案下載:https://pan.baidu.com/s/1KHTsgQUvtzWa3rLB_Tmo7A 

1:多執行緒實時播放rtsp視訊流
2:支援windows+linux+mac
3:多執行緒顯示影象,不卡主介面
4:自動重連網路攝像頭
5:可設定邊框大小即偏移量和邊框顏色
6:可設定是否繪製OSD標籤即標籤文字或圖片和標籤位置
7:可設定兩種OSD位置和風格
8:可設定是否儲存到檔案以及檔名
9:可播放本地視訊檔案,支援設定幀率
10:支援h265視訊流+rtmp等常見視訊流
11:可暫停播放和繼續播放
12:支援回撥模式和控制代碼兩種模式
13:自動將當前播放位置和音量大小是否靜音以訊號發出去
14:提供介面設定播放位置和音量及設定靜音

#ifndef VLCTHREAD_H
#define VLCTHREAD_H

#include <QThread>

class QLabel;
class libvlc_instance_t;
class libvlc_media_t;
class libvlc_media_player_t;

class VlcThread : public QThread
{
    Q_OBJECT
public:
    enum VlcState {
        VlcState_NothingSpecial = 0,
        VlcState_Opening = 1,
        VlcState_Buffering = 2,
        VlcState_Playing = 3,
        VlcState_Paused = 4,
        VlcState_Stopped = 5,
        VlcState_Ended = 6,
        VlcState_Error = 7
    };

    explicit VlcThread(QObject *parent = 0);
    ~VlcThread();

protected:
    void run();

private:
    bool stopped;           //停止執行緒標誌位
    bool isPlayVideo;       //開始播放標誌位
    bool isPauseVideo;      //暫停播放標誌位
    bool isStopVideo;       //停止播放標誌位
    bool isReadPosition;    //讀取當前位置標誌位

    QLabel *lab;            //顯示播放視訊標籤
    QString fileName;       //檔名稱
    QString suffix;         //檔案拓展名

    libvlc_instance_t *vlcInst;
    libvlc_media_t *vlcMedia;
    libvlc_media_player_t *vlcPlayer;

public:
    //獲取檔名稱
    QString getFileName()   const;
    //獲取拓展名
    QString getSuffix()     const;

private slots:
    //讀取檔案長度
    void readLength();
    //獲取當前位置
    void readPosition();

    //開始播放
    void playVideo();
    //暫停播放
    void pauseVideo();
    //停止播放
    void stopVideo();

signals:
    //開始播放訊號
    void playStart();
    //停止播放訊號
    void playStop();
    //暫停播放訊號
    void playPause();

    //當前播放時長
    void filePositionReceive(uint position, bool isPlay);
    //總時長
    void fileLengthReceive(uint length);
    //音量大小
    void fileVolumeReceive(int volume, bool mute);

public slots:
    //設定要播放的載體
    void setWidget(QLabel *lab);
    //設定檔案
    void setFileName(const QString &fileName);

    //設定vlc引數
    void setOption(const QString &args);

    //設定快取時長,單位毫秒
    void setDelayTime(int delayTime);

    //設定保存錄像檔案
    void save(const QString &videoFilePath);

    //設定視訊寬高比例
    void setWidthHeight(int width, int height);

    //設定顯示圖片
    void setImage(QLabel *lab, const QString &fileName, int width, int height);


    //播放
    void play();
    //暫停
    void pause();
    //停止
    void stop();
    //停止執行緒
    void stopAll();

    //儲存快照
    void snapshot(const QString &imageFilePath);

    //檢測是否活著
    bool getIsPlaying();
    //獲取當前狀態
    VlcState getStatus();

    //獲取長度
    uint getLength();
    //獲取當前播放位置
    uint getPosition();
    //設定播放位置
    void setPosition(int position);

    //獲取靜音狀態
    bool getMute();
    //設定靜音
    void setMute(bool mute);

    //獲取音量
    int getVolumn();
    //設定音量
    void setVolumn(int volumn);

    //獲取音軌
    int getTrack();
    //獲取音軌數量
    int getTrackCount();
    //設定音軌
    void setTrack(int track);

};

#endif // VLCTHREAD_H