欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > c/c >内容正文

c/c

c vlc读取摄像头-凯发k8官方网

发布时间:2024/9/19 c/c 45 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 c vlc读取摄像头_qt音视频开发1-vlc解码播放 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

最开始接触视频监控这块的时候,用的就是vlc作为解码的内核,主要是因为vlc使用简单方便,直接传入一个句柄即可,简单几行代码就可以实现一个视频流播放,很适合初学者使用,也推荐初学者用qt vlc来做播放器,提供的接口还是非常友好的,而且门类特别多,想要获取媒体文件的各种信息比如宽高,设置宽高比等,直接调用接口函数传入参数就能设置。

所有用vlc做视频监控解码的人都会遇到一个问题,那就是鼠标事件被接管拦截了,不能识别鼠标事件,比如双击最大化等,这就很憋屈了,明明很好用的一个东西,怎么突然之间鼠标事件也识别不到了呢,网上一搜一大把,主要有三个解决办法。

1. 修改vlc源码,重新编译,替换动态库文件。

2. 全局鼠标钩子拦截鼠标消息进行处理。

3. 设置句柄以后直接将控件/接受视频渲染的控件禁用掉。

最终采用方法3,实现起来简单快速,修改vlc源码的编译工作量太大了,毕竟vlc依赖一大堆的插件,用vlc的人一般都是初学者半吊子,哪里有能力去编译一遍vlc哦。

1. 多线程实时播放视频流和本地视频。

2. 支持windows linux mac,支持vlc2和vlc3。

3. 多线程显示图像,不卡主界面。

4. 自动重连网络摄像头。

5. 可设置边框大小即偏移量和边框颜色。

6. 可设置是否绘制osd标签即标签文本或图片和标签位置。

7. 可设置两种osd位置和风格。

8. 可设置是否保存到文件以及文件名。

9. 可直接拖曳文件到vlcwidget控件播放。

10. 支持h265视频流 rtmp等常见视频流。

11. 可暂停播放和继续播放。

12. 支持回调模式和句柄两种模式。

13. 支持线程读取进度等信息和事件回调两种处理模式。

14. 自动将当前播放位置和音量大小是否静音以信号发出去。

15. 提供接口设置播放位置和音量及设置静音。

16. 支持存储单个视频文件和定时存储视频文件。

17. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。

1. 国内站点:[https://gitee.com/feiyangqingyun/qwidgetdemo](https://gitee.com/feiyangqingyun/qwidgetdemo)

2. 国际站点:[https://github.com/feiyangqingyun/qwidgetdemo](https://github.com/feiyangqingyun/qwidgetdemo)

3. 个人凯发k8官方网主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

4. 知乎凯发k8官方网主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

5. 体验地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

bool vlcthread::init(){ //判断该摄像机是否能联通 if (checkconn && isrtsp) { if (!check) { return false; } } qfileinfo info(url); suffix = info.suffix(); //设置拓展名 if (url.startswith("dshow://")) { suffix = "dshow"; } else if (url.startswith("rtsp")) { suffix = "rtsp"; } else if (url.startswith("rtmp")) { suffix = "rtmp"; } else if (url.startswith("http")) { suffix = "http"; } const char *temparg = ""; if (suffix == "h264") { temparg = "--demux=h264"; } else if (suffix == "h265") { temparg = "--demux=h265"; } const char *vlc_args[9] = {"-i", "dummy", "--no-osd", "--no-stats", "--ignore-config", "--no-video-on-top", "--no-video-title-show", "--no-snapshot-preview", temparg}; vlcinst = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args); if (vlcinst == null) { return false; } if (isrtsp || suffix == "dshow") { vlcmedia = libvlc_media_new_location(vlcinst, url.toutf8().constdata()); } else { //windows上需要替换文件路径 qstring url = this->url; url = qdir::tonativeseparators(url); vlcmedia = libvlc_media_new_path(vlcinst, url.toutf8().constdata()); } if (vlcmedia == null) { return false; } //媒体播放对象 vlcplayer = libvlc_media_player_new_from_media(vlcmedia); if (vlcplayer == null) { return false; } //创建事件管理器 if (callbackevent) { vlcevent = libvlc_media_player_event_manager(vlcplayer); libvlc_event_new(vlcevent, this); } //回调方式和句柄方式两种分别处理 if (callback) { callbackdata = new callbackdata; callbackdata->thread = this; callbackdata->pixels = new uchar[bufferwidth * bufferheight * 4]; memset(callbackdata->pixels, 0, bufferwidth * bufferheight * 4); int width = callbackdata->thread->getbufferwidth(); int height = callbackdata->thread->getbufferheight(); //设置回调拿到每帧数据 libvlc_video_set_callbacks(vlcplayer, lock, unlock, display, callbackdata); //设置每帧格式 rv32-format_rgb32 rgba-format_rgba8888 yuyv i420 libvlc_video_set_format(vlcplayer, "rv32", width, height, width * 4); } else { //设置播放句柄 if (playwidget == null) { return false; }#if defined(q_os_win) libvlc_media_player_set_hwnd(vlcplayer, (void *)playwidget->winid());#elif defined(q_os_linux) libvlc_media_player_set_xwindow(vlcplayer, playwidget->winid());#elif defined(q_os_mac) libvlc_media_player_set_nsobject(vlcplayer, (void *)playwidget->winid());#endif //禁用句柄鼠标消息 qtimer::singleshot(1000, this, slot(disablehwnd())); } //设置硬件加速 none auto any d3d11va dxva2 setoption(qstring(":avcodec-hw=%1").arg(hardware)); //设置通信协议 tcp udp setoption(qstring(":rtsp-%1").arg(transport)); //设置缓存时间 默认500毫秒 setoption(qstring(":network-caching=%1").arg(caching)); //:rtsp-frame-buffer-size=1000000 //设置宽度高度,本地usb摄像头需要单独设置 if (suffix == "dshow") { setoption(qstring(":dshow-size=%1*%2").arg(videowidth).arg(videoheight)); } else { setsize(videowidth, videoheight); } //设置保存文件 this->initsave(); //打开播放 libvlc_media_player_play(vlcplayer); //qdebug() << timems << "init vlc finsh"; return true;}

总结

以上是凯发k8官方网为你收集整理的c vlc读取摄像头_qt音视频开发1-vlc解码播放的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图