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