Qt6 QVideoSink接收V4L2摄像头帧不稳定问题求助
Qt QVideoSink接收V4L2摄像头帧不稳定问题
我正在开发一款C++ Qt应用,功能是获取V4L2摄像头的视频流,对每一帧处理后再渲染到应用界面。目前遇到的问题是:启动应用后,QVideoSink能否接收到待处理的帧完全不稳定——要么完全正常工作,要么全程无法接收任何帧,没有中间状态。
代码实现
MainWindow::MainWindow(QWidget* parent) : QWidget(parent) { // Layout QHBoxLayout* mainLayout = new QHBoxLayout(this); // Video Display Widget m_videoStream = new QLabel(this); QImage blackImage(640, 480, QImage::Format_RGB888); blackImage.fill(QColor(Qt::black)); m_videoStream->setPixmap(QPixmap::fromImage(blackImage)); mainLayout->addWidget(m_videoStream); // Camera Setup m_camera = new QCamera(this); for (const QCameraDevice& device : QMediaDevices::videoInputs()) { if (device.description() == "Depstech webcam (V4L2)") m_camera->setCameraDevice(device); } m_imageCapture = new QImageCapture(this); // Create video sink to intercept video frames m_videoSink = new QVideoSink(this); // Media Session Setup m_captureSession.setCamera(m_camera); m_captureSession.setImageCapture(m_imageCapture); m_captureSession.setVideoOutput(m_videoSink); m_camera->start(); // Make connections connect(m_videoSink, &QVideoSink::videoFrameChanged, this, &MainWindow::processFrame); }
现象
- 电脑上其他基于摄像头的应用(如Cheese)无此问题。
- 无论是否调用
m_camera->start();,摄像头画面正常显示的概率一致;即使摄像头未激活,仍可能接收并渲染帧。 - 无法接收帧时,摄像头指示灯甚至不会亮起。
已尝试的解决方法
- 切换摄像头无改善。
- 更换另一款V4L2摄像头(HuddleCamHD)问题依旧。
- 怀疑是竞态条件,但在初始化捕获会话或连接
VideoSink::videoFrameChanged信号时添加几秒延迟,无效果。
调试输出
| 调试调用 | 结果 |
|---|---|
QT_VERSION_STR | 6.2.4 |
m_camera->cameraDevice().description() | Depstech webcam (V4L2) |
m_camera->errorString() | "" |
m_camera->isAvailable() | true |
m_camera->isActive() | true |
qt.multimedia.imageCapture: cameraActiveChanged | false false |
qt.multimedia.videooutput: sinkChanged | videoSinkBin |
qt.multimedia.imageCapture: cameraActiveChanged | false true |
qt.multimedia.imageCapture: isReady | true |
调试日志差异
正常工作时,调试输出会打印qt.multimedia.gstvideorenderer相关信息;无法接收帧时无此类信息:
qt.multimedia.gstvideorenderer: set_caps: "video/x-raw, format=(string)xBGR, width=(int)3840, height=(int)2160, interlace-mode=(string)progressive, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)0:1:0:0, framerate=(fraction)30/1" qt.multimedia.gstvideorenderer: QGstVideoRenderer::start "video/x-raw, format=(string)xBGR, width=(int)3840, height=(int)2160, interlace-mode=(string)progressive, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)0:1:0:0, framerate=(fraction)30/1" qt.multimedia.gstvideorenderer: QGstVideoRenderer::render qt.multimedia.gstvideorenderer: QGstVideoRenderer::handleEvent(renderBuffer) true QGstreamerVideoSink(0x62f0569cda00) qt.multimedia.gstvideorenderer: sending video frame
环境信息
- 系统:PopOS(Ubuntu 22.04)
内容的提问来源于stack exchange,提问作者EnigmaticBacon
相关产品推荐
相关产品推荐

