解决libvlc_media_player_stop时死锁的方法
转自:http://www.jiazi.cn/blog/?id=56 扩散该解决方法
最近需要使用VLC控件来做一个简单的流媒体播放器,在实施过程中,发现在调用libvlc_media_player_stop()方法时有时会卡死。
百度告诉我可能是死锁问题,即在libvlc的回调事件中可能阻塞了,解决方法是另外开个线程来调用libvlc_media_player_stop()方法。
可是,我并没有用到回调事件。虽然另外开个线程来调用libvlc_media_player_stop()能解决问题,但多线程可能会带来更多的隐患。
通过几番测试后,我发现如果不将vlc视频嵌入到子窗口中播放,而是让它独立窗口播放,则在libvlc_media_player_stop()时是不会卡死的。
于是判断可能是VLC在stop的过程中可能会产生子窗口消息,然而子窗口消息是在主线程(UI线程)中处理的,而libvlc_media_player_stop()方法也是在主线程中调用的,这就造成了竞争性死锁。
如果视频不是嵌入到子窗口中,而是独立存在(VLC内部自己创建的),则其消息处理非主线程负责,就不会出现竞争性死锁。
原因找出,解决方案如下:
1、另外开个线调来调用libvlc_media_player_stop()方法。(这是我在百度上找到的方法,但我认为该方法不够完美)
2、在libvlc_media_player_stop()之前,先把“包含VLC视频窗口”的子窗口销毁,后面如果需要再重建。由于窗口不存在了,VLC在stop的过程中的任何消息都不会发到主线程中来了,这样就不会出现竞争性死锁了。(反复测试后再也没有出现死锁的问题了)
方法二code:
const QString play_url("rtmp://live.hkstv.hk.lxdns.com/live/hks");
libvlc_instance_t *m_inst = NULL;
libvlc_media_player_t *m_mp = NULL;
libvlc_media_t *m_m = NULL;
QWidget *m_videoWdg = NULL;
const char * const vlc_args[] = {
"--no-audio",
"--demux=h264",
"--rtsp-frame-buffer-size=1000000", //RTSP帧缓冲大小,默认大小为100000
"--network-caching=300",
"--rtsp-tcp"
};
m_inst = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
m_m = libvlc_media_new_location(m_inst, play_url.toStdString().c_str());
m_mp = libvlc_media_player_new_from_media(m_m);
libvlc_media_parse(m_m);
libvlc_media_release(m_m);
m_videoWdg = new QWidget;
HWND screen_hwnd = (HWND)m_videoWdg->winId();
libvlc_media_player_set_hwnd(m_mp, screen_hwnd);
if (libvlc_media_player_play(m_mp) == -1)
{
//libvlc_media_player_play error
return;
}
//停止播放时,先释放掉绑定vlc的播放窗口,然后调用vlc库函数,停止播放。
void stopPlay()
{
if (m_mp)
{
//释放掉绑定vlc的播放窗口
if (m_videoWdg != nullptr)
{
delete m_videoWdg;
m_videoWdg = nullptr;
}
//停掉流媒体
libvlc_media_player_stop(m_mp);
libvlc_media_player_release(m_mp);
libvlc_release(m_inst);
m_inst = NULL;
m_mp = NULL;
m_m = NULL;
}
}
解决libvlc_media_player_stop时死锁的方法的更多相关文章
- 剑指Offer:解决难题时的三大方法
1.画图 让抽象的东西变得直观生动起来.比如设计二叉树,链表,栈,队列这些数据结构时. 2.举例子 同样可以化抽象为直观.能够更清晰的展现思路.从例子归纳出一般做法. 3.分解 有时问题本身是比较复杂 ...
- SQLServer查看和解决死锁的方法
http://luohonghong.blog.163.com/blog/static/78312058201142411533316/ SQLServer查看和解决死锁的方法 2011-05-24 ...
- 一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?
一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白? 以下从死锁检测.死锁避免.死锁解决3个方面来探讨如何对MySQL死锁问题进行性能调优. 死锁检测 通过SQL语句查询锁表相关信息: ( ...
- 解决 SQL 注入的另类方法
本文是翻译,版权归原作者所有 原文地址(original source):https://bitcoinrevolt.wordpress.com/2016/03/08/solving-the-prob ...
- listView解决滑动时黑色背景问题
listView.setCacheColorHint(Color.TRANSPARENT);//解决滑动时黑色背景问题 listView滑动时黑色背景问题 原因在于ListView存在缓存颜色机制,因 ...
- Jenkins2.138配置slave节点时,启动方法只有两个选项
Jenkins2.138配置slave节点时,启动方法只有两个选项,并没有通过javaweb代理启动这个选项 解决办法 全局安全配置->代理->选择随机选取
- vue 使用 axios 时 post 请求方法传参无法发送至后台
axios 时 post 请求方法传参无法发送至后台报错如下 Response to preflight request doesn't pass access control check: No ' ...
- Ubuntu下Sublime Text 3解决无法输入中文的方法
Ubuntu下Sublime Text 3解决无法输入中文的方法_百度经验http://jingyan.baidu.com/article/f3ad7d0ff8731609c3345b3b.html ...
- HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...
随机推荐
- 小程序学习一 .json 文件配置
微信小程序——配置 以下就是小编对小程序配置的资料进行的系统的整理,希望能对开发者有帮助. 我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置 ...
- ngui项目花屏问题
项目用的ngui 最近在金立手机上遇到一个问题就是 启动的时候会花一下屏幕 一闪而过 由于ngui默认camera使用的是clear depth 所以按照网上的办法修改 color 跟skybo ...
- 【SQL Prompt】SQL Prompt7.2下载及破解教程
基本介绍 SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为用户提供唯一合适的代码选择.自动脚本设置为用户提供了简单的代码易读性--这在开发者使用的是不大熟悉的 ...
- OpenModelica读取文件
parameter String file = Modelica.Utilities.Files.loadResource("J:/git/tcs/tcs.txt"); 将文件名变 ...
- linux计划任务防暴力破解脚本+免密操作
1.在root创建satools目录 mkdir satools 2.编辑防破解脚本 vi fpj.sh #!/bin/bash #zsl -xie cat /var/log/secure|awk ' ...
- HTML 第十一章总结
# 第十一章总结:本章的标题为:layout and positioning Arranging Element##前言:这一章节,通过已经知道的 box model 的概念,进行讲述关于 layou ...
- English trip Spoken English & Word List(updating...)
Word List 词汇 Square 英 [skweə] 美 [skwɛr] adj. 平方的:正方形的:直角的:正直的. 使成方形:与…一致 vi. 一致:成方形 n. 平方:广场:正方形 ...
- flex自定义preloader预加载进度条
flex默认的preloader已经很不错了,可是有时候还是需要自定义的. 需要在要出现自定义预加载的程序的<mx:Application>标签里加入preloader="& ...
- 将maven项目托管到github
1.下载安装git 并通过 git config --global user.name "",和git config --global user.email "" ...
- 基于spring的web项目启动时预加载数据到ServletContext
1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...