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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM