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