Kurento播放失败问题案例分享
1 问题背景
Kurento是WebRTC媒体服务器和一组客户端API,可简化针对Web和智能手机平台的高级视频应用程序的开发。其功能包括视听流的组通信,代码转换,记录,混合,广播和路由。
Kurento大致通讯流程如下:
迁移完成后,运行kurento,并未正常播放,正常播放的预期效果如下:
2 原因分析
问题1:
Gstreamer-CRITICAL错误循环出现。
分析过程:
1. 直接分析日志,感觉像是业务逻辑的问题,但发现日志中ERROR错误太多,看不出来到底是什么原因。
通过gdb 调试,定位pipeline初始化失败。Pipeline是Gstreamer的概念。Kurento底层基于Gstreamer构建,Gstreamer大致框架如下。
其中两个重要的概念element,pipeline。
结合对Gstreamer的业务理解,重新分析日志,日志中factory no such element nicesrc。
2. 分析nicesrc element问题。
Nicesrc是有libnice组件编译生成的,包含在libgstnice.so中。Element需要注册才能使用。
重新编译,手动指定加载,在加载前后加打印,分析有进行加载libgstnice.so,但没有注册成功nicesrc。
分析libgstnice.so,发现nicesrc并未编译如libgstnice.so。分析libnice编译文件,定位到configure中识别gstreamer版本存在问题。
问题2:
解决问题1后,Chrome概率性播放成功。
分析过程:
1. 抓包对比分析,chrome和firefox上的不同。
Chrome上只有信令交互的包,后面的UDP包没有,问题在信令交互部分的校验。
2. 搭建x86环境,发现ISV提供的测试程序在x86上的chrome也播放失败,问题在客户的程序。
3. 分析客户提供测试程序,发现客户的测试程序实际上是基于kurento官网的提供的测试程序修改的。使用官网的测试程序,在x86上和arm上播放都正常,但官网的测试程序基于的是https协议,客户提供的是http协议。
4. 新版Chrome不支持http进行调用摄像头麦克风,客户测试客户端依赖相关调用。
3 解决方案
问题1解决方案:
修改libnice组件编译脚本,修改方法如下:
问题2解决方案:
1. 右键点击Chrome桌面快捷方式,打开属性
在快捷方式页-目标中的最后添加输入:--unsafely-treat-insecure-origin-as-secure=http://128.5.68.93:8000
注:http://128.5.68.93:8000为需要访问网站地址,根据实际情况修改
2. Chrome浏览器地址栏输入chrome://flags/, 搜索unsafely
enabled 并填入要授信的域名。
4 总结
1. 开源代码迁移时,如果出现大量错误,且解决相关错误遇到瓶颈时,建议先研究开源代码的实现原理,找出其中的根因。
2. 当出现组件只与特定的第三方软件通讯正常,建议搭建x86服务器进行对比,可能该问题非arm平台和x86平台差异导致的,而是第三方软件的兼容问题。
- 点赞
- 收藏
- 关注作者
评论(0)