• 8407阅读
  • 20回复

Qt编写视频播放器(vlc内核) [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2018-07-20
在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外。用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情,最好加点美化那就更加完美了,市面上很多播放器是vlc内核写的,或者ffmpeg写的。
执行文件下载https://pan.baidu.com/s/1KHTsgQUvtzWa3rLB_Tmo7A

window.open('http://www.qtcn.org/bbs/attachment/Mon_1807/44_110085_cb8b6b09aee263a.png?478');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >




1:多线程实时播放rtsp视频流
2:支持windows+linux+mac
3:多线程显示图像,不卡主界面
4:自动重连网络摄像头
5:可设置边框大小即偏移量和边框颜色
6:可设置是否绘制OSD标签即标签文本或图片和标签位置
7:可设置两种OSD位置和风格
8:可设置是否保存到文件以及文件名
9:可播放本地视频文件,支持设置帧率
10:支持h265视频流+rtmp等常见视频流
11:可暂停播放和继续播放
12:支持回调模式和句柄两种模式
13:自动将当前播放位置和音量大小是否静音以信号发出去
14:提供接口设置播放位置和音量及设置静音


  1. #ifndef VLCTHREAD_H
  2. #define VLCTHREAD_H
  3. #include <QThread>
  4. class QLabel;
  5. class libvlc_instance_t;
  6. class libvlc_media_t;
  7. class libvlc_media_player_t;
  8. class VlcThread : public QThread
  9. {
  10.     Q_OBJECT
  11. public:
  12.     enum VlcState {
  13.         VlcState_NothingSpecial = 0,
  14.         VlcState_Opening = 1,
  15.         VlcState_Buffering = 2,
  16.         VlcState_Playing = 3,
  17.         VlcState_Paused = 4,
  18.         VlcState_Stopped = 5,
  19.         VlcState_Ended = 6,
  20.         VlcState_Error = 7
  21.     };
  22.     explicit VlcThread(QObject *parent = 0);
  23.     ~VlcThread();
  24. protected:
  25.     void run();
  26. private:
  27.     bool stopped;           //停止线程标志位
  28.     bool isPlayVideo;       //开始播放标志位
  29.     bool isPauseVideo;      //暂停播放标志位
  30.     bool isStopVideo;       //停止播放标志位
  31.     bool isReadPosition;    //读取当前位置标志位
  32.     QLabel *lab;            //显示播放视频标签
  33.     QString fileName;       //文件名称
  34.     QString suffix;         //文件拓展名
  35.     libvlc_instance_t *vlcInst;
  36.     libvlc_media_t *vlcMedia;
  37.     libvlc_media_player_t *vlcPlayer;
  38. public:
  39.     //获取文件名称
  40.     QString getFileName()   const;
  41.     //获取拓展名
  42.     QString getSuffix()     const;
  43. private slots:
  44.     //读取文件长度
  45.     void readLength();
  46.     //获取当前位置
  47.     void readPosition();
  48.     //开始播放
  49.     void playVideo();
  50.     //暂停播放
  51.     void pauseVideo();
  52.     //停止播放
  53.     void stopVideo();
  54. signals:
  55.     //开始播放信号
  56.     void playStart();
  57.     //停止播放信号
  58.     void playStop();
  59.     //暂停播放信号
  60.     void playPause();
  61.     //当前播放时长
  62.     void filePositionReceive(uint position, bool isPlay);
  63.     //总时长
  64.     void fileLengthReceive(uint length);
  65.     //音量大小
  66.     void fileVolumeReceive(int volume, bool mute);
  67. public slots:
  68.     //设置要播放的载体
  69.     void setWidget(QLabel *lab);
  70.     //设置文件
  71.     void setFileName(const QString &fileName);
  72.     //设置vlc参数
  73.     void setOption(const QString &args);
  74.     //设置缓存时长,单位毫秒
  75.     void setDelayTime(int delayTime);
  76.     //设置保存录像文件
  77.     void save(const QString &videoFilePath);
  78.     //设置视频宽高比例
  79.     void setWidthHeight(int width, int height);
  80.     //设置显示图片
  81.     void setImage(QLabel *lab, const QString &fileName, int width, int height);
  82.     //播放
  83.     void play();
  84.     //暂停
  85.     void pause();
  86.     //停止
  87.     void stop();
  88.     //停止线程
  89.     void stopAll();
  90.     //保存快照
  91.     void snapshot(const QString &imageFilePath);
  92.     //检测是否活着
  93.     bool getIsPlaying();
  94.     //获取当前状态
  95.     VlcState getStatus();
  96.     //获取长度
  97.     uint getLength();
  98.     //获取当前播放位置
  99.     uint getPosition();
  100.     //设置播放位置
  101.     void setPosition(int position);
  102.     //获取静音状态
  103.     bool getMute();
  104.     //设置静音
  105.     void setMute(bool mute);
  106.     //获取音量
  107.     int getVolumn();
  108.     //设置音量
  109.     void setVolumn(int volumn);
  110.     //获取音轨
  111.     int getTrack();
  112.     //获取音轨数量
  113.     int getTrackCount();
  114.     //设置音轨
  115.     void setTrack(int track);
  116. };
  117. #endif // VLCTHREAD_H


欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350

只看该作者 1楼 发表于: 2018-07-20
又更新又不分享可爱又可恨

只看该作者 2楼 发表于: 2018-07-20
大佬,你这个是吧句柄传下去解码播放的吗,你的qss会失效吗
离线liudianwu

只看该作者 3楼 发表于: 2018-07-20
回 奋斗滴菜鸟 的帖子
奋斗滴菜鸟:大佬,你这个是吧句柄传下去解码播放的吗,你的qss会失效吗[表情]  (2018-07-20 13:35) 

句柄传下去之后绘制就被接管了,不可控了。
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350

只看该作者 4楼 发表于: 2018-07-20
回 liudianwu 的帖子
liudianwu:句柄传下去之后绘制就被接管了,不可控了。 (2018-07-20 13:57) 

但是我穿的是播放的窗口句柄,播放窗口只是一个子窗口,,主窗口上面的其他按钮不再播放窗口里啊,应该是可控的吧,,大神啊,你之前没遇到吗
离线zzzzzzhuzhu

只看该作者 5楼 发表于: 2018-07-20
赤裸裸的炫耀啊,又不放源码
离线xzp21st

只看该作者 6楼 发表于: 2018-07-20
回 zzzzzzhuzhu 的帖子
zzzzzzhuzhu:赤裸裸的炫耀啊,又不放源码 (2018-07-20 15:04) 

这里是作品展 不是源码展哦 嘿嘿

只看该作者 7楼 发表于: 2018-07-20
来一份😁
离线liuchangyin

只看该作者 8楼 发表于: 2018-07-21
离线yyzq

只看该作者 9楼 发表于: 2018-07-23
回 奋斗滴菜鸟 的帖子
奋斗滴菜鸟:但是我穿的是播放的窗口句柄,播放窗口只是一个子窗口,,主窗口上面的其他按钮不再播放窗口里啊,应该是可控的吧,,大神啊,你之前没遇到吗[表情] (2018-07-20 14:00) 

你这种情况可能需要设置一些属性,给你的播放窗口加
    setAttribute(Qt::WA_NativeWindow);
    setAttribute(Qt::WA_DontCreateNativeAncestors);

然后再main里对Qapplication加
app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);

只看该作者 10楼 发表于: 2018-07-23
回 yyzq 的帖子
yyzq:你这种情况可能需要设置一些属性,给你的播放窗口加
    setAttribute(Qt::WA_NativeWindow);
    setAttribute(Qt::WA_DontCreateNativeAncestors);
....... (2018-07-23 09:01) 

多谢大神,目前测试了好久没有出现那个问题,应该是没问题了,终于解决了这个老大难
离线stlcours

只看该作者 11楼 发表于: 2018-07-24
回 yyzq 的帖子
yyzq:你这种情况可能需要设置一些属性,给你的播放窗口加
    setAttribute(Qt::WA_NativeWindow);
    setAttribute(Qt::WA_DontCreateNativeAncestors);
....... (2018-07-23 09:01) 

这些标记应该什么时候使用呢?做了这么久的Qt,从来没有碰到这种情况啊。

另外,如果QWidget单独进行显示的话(而不是把它放在其它QWidget当成一个子部件),是不是就不用这样setAttribute(Qt::WA_NativeWindow);设置了呢?因为虽然是QWidget,但它本身就还是有窗口句柄的呀。

app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); 又是什么意思呢?兄弟窗口?哪里来的兄弟窗口呢,不都是子窗口吗?
离线stlcours

只看该作者 12楼 发表于: 2018-07-24
回 奋斗滴菜鸟 的帖子
奋斗滴菜鸟:多谢大神,目前测试了好久没有出现那个问题,应该是没问题了,终于解决了这个老大难[表情] (2018-07-23 09:30) 

你把你软件的窗口关系详细描述一下啊,看得稀里糊涂的、不太理解。
离线yyzq

只看该作者 13楼 发表于: 2018-07-24
回 stlcours 的帖子
stlcours:这些标记应该什么时候使用呢?做了这么久的Qt,从来没有碰到这种情况啊。
另外,如果QWidget单独进行显示的话(而不是把它放在其它QWidget当成一个子部件),是不是就不用这样setAttribute(Qt::WA_NativeWindow);设置了呢?因为虽然是QWidget,但它本身就还是有窗口句柄的呀。
.. (2018-07-24 00:15) 

既然没有遇到这种问题就不用忧虑了,遇到的时候想办法去解决就好了,永远有学不完的东西,永远没有完全准备好的时候,嗯,就是这样。。。至于上面说的那些属性,文档上有很好的解释,我就不赘言了。。。

只看该作者 14楼 发表于: 2018-07-24
回 stlcours 的帖子
stlcours:你把你软件的窗口关系详细描述一下啊,看得稀里糊涂的、不太理解。 (2018-07-24 00:16) 

首先,我觉得一般的开发用不到设置这玩意,在需要用到句柄的时候可能需要设置,,你百度看看alien和native窗口的信息看看,兄弟窗口比如说你主窗口中有两个播放窗口,这两个播放窗口都是主窗口的子窗口,不是兄弟嘛。。。一般qt整个窗口只有一个句柄,,就是主窗口的句柄,,其他的都是绘制的,当你使用winid获取子窗口句柄时候,子窗口也就变成了nativewidget,,顺带着他的父类也会变,,,百度吧,我这也是百度看到的,尚未验证,,,
离线stlcours

只看该作者 15楼 发表于: 2018-07-24
回 奋斗滴菜鸟 的帖子
奋斗滴菜鸟:首先,我觉得一般的开发用不到设置这玩意,在需要用到句柄的时候可能需要设置,,你百度看看alien和native窗口的信息看看,兄弟窗口比如说你主窗口中有两个播放窗口,这两个播放窗口都是主窗口的子窗口,不是兄弟嘛。。。一般qt整个窗口只有一个句柄,,就是主窗口的句柄,,其他 .. (2018-07-24 09:17) 

谢谢。主要是没有想到你们还会有并排播放的情况,毕竟做安防的和我们看电影的不一样吧。其次,除了主窗口的句柄,其实Qt也为每个单独显示的QWidget申请了句柄的,而不仅仅只有主窗口有句柄。为了验证,我用spy++实测了我做的软件,与我所想的完全一致。

>>当你使用winid获取子窗口句柄时候,子窗口也就变成了nativewidget,,顺带着他的父类也会变
这个倒是没想到,算是金玉良言吧。
离线stlcours

只看该作者 16楼 发表于: 2018-07-24
回 yyzq 的帖子
yyzq:既然没有遇到这种问题就不用忧虑了,遇到的时候想办法去解决就好了,永远有学不完的东西,永远没有完全准备好的时候,嗯,就是这样。。。至于上面说的那些属性,文档上有很好的解释,我就不赘言了。。。 (2018-07-24 09:12) 

谢谢。结合这个帖子和张德宝的帖子,我觉得我全懂了。最后有个小小疑问是,Qt 4.4之前只有Alien窗口、没有native窗口?假设我创建控件的时候,通过设置属性、个个都把它们改成native窗口,这样一来软件的显示性能堪比MFC??
离线305750665

只看该作者 17楼 发表于: 2018-07-25
鼓掌
雨田哥: 群号:853086607
QQ: 3246214072

刘典武-feiyangqingyun:专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!QQ:517216493
离线xdh873939316

只看该作者 18楼 发表于: 2018-07-25
请教刘大师,qt如何调用VLC的内核?需要移植吗?
离线liudianwu

只看该作者 19楼 发表于: 2018-07-25
回 xdh873939316 的帖子
xdh873939316:请教刘大师,qt如何调用VLC的内核?需要移植吗? (2018-07-25 15:48) 

引入头文件,lib链接对应库文件,编译。
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线swing07

只看该作者 20楼 发表于: 2019-03-27
请教刘大师,qt调用VLC播放直播 延迟怎么处理啊
延迟应该有两个地方  播放器缓存时间 服务器缓存。
比如服务器缓存了2秒数据为了加速打开,vlc 支持丢弃缓存的数据获取最新数据播放吗?
待定......
快速回复
限100 字节
 
上一个 下一个