在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外。用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情,最好加点美化那就更加完美了,市面上很多播放器是vlc内核写的,或者ffmpeg写的。
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
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