Ubuntu 18下GStreamer与Qt 5.10 CameraBin隔行扫描配置问题求助
解决QtGStreamer中CameraBin的隔行扫描模式错误
我来帮你搞定这个问题!既然VLC能正常打开摄像头,说明硬件驱动没问题,确实是QtGStreamer默认的interlace配置和你的设备不兼容导致的。下面给你两种可行的解决方法:
方法一:在Qt代码中直接修改CameraBin参数
QtGStreamer允许你直接访问GStreamer元素的属性,你可以在初始化摄像头的代码里手动设置interlace-mode,强制禁用或切换到设备支持的模式:
#include <QGst/Element> #include <QGst/Pipeline> // 假设你已经通过工厂创建了camerabin元素 QGst::ElementPtr cameraBin = QGst::ElementFactory::make("camerabin"); if (cameraBin) { // 禁用隔行扫描模式(值为0),这是最通用的解决方式 cameraBin->setProperty("interlace-mode", 0); // 如果你想更精准,可以先通过v4l2命令查看设备支持的模式: // 执行 `v4l2-ctl --list-formats-ext` 找到摄像头支持的interlace类型 // 然后对应设置interlace-mode的值: // 1=interleaved, 2=fields, 3=fields-top-first, 4=fields-bottom-first }
如果上面的设置还不行,你可以尝试强制关闭progressive属性:
cameraBin->setProperty("progressive", false);
方法二:通过GStreamer全局配置文件修改
不想改代码的话,你可以通过修改GStreamer的全局配置来统一调整CameraBin的默认行为:
- 创建一个GStreamer配置文件:
sudo nano /etc/gstreamer-1.0/conf.d/90-camerabin.conf
- 在文件中添加以下内容,强制设置默认的interlace模式:
[GstCameraBin] interlace-mode=0
- 保存退出后,重启你的Qt应用,配置就会生效了。
补充说明
VLC之所以能正常工作,是因为它的GStreamer后端会自动检测设备支持的格式并适配,而Qt的示例代码可能默认启用了你的摄像头不支持的逐行扫描(progressive interlacing)模式,所以通过上面两种方法调整后就能解决问题啦。
内容的提问来源于stack exchange,提问作者Gimenez
相关产品推荐
相关产品推荐

