在研究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
