Windows下让Qt5 QCamera响应UVC摄像头硬件按钮拍图

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

QCamera相机类提供了一些基本的功能包括拍照和录制功能Windows不支持录制视频但也有很多接口是没有封装的比如有些UVC摄像头有物理按键可以进行拍图等操作但是QCamera没法响应硬件按钮的拍图操作。

网络上的相关代码都是直接封装平台库如Windows的DirectShowLinux的V4L2来支持硬件按钮比如我之前参考的一些

https://www.jianshu.com/p/a67b8cfc57c5

https://gitee.com/fsfzp888/UVCCapture/

https://github.com/GoodRon/QtWebcam

https://github.com/liuleidong/UVCCaptureDemo

但是自己封装出来的效果不是太好总有一些奇怪的BUG。后来查看Qt5文档和源码QCamera在Windows平台也是封装的DirectShow代码路径

Qt\qt-everywhere-src-5.15.2\qtmultimedia\src\plugins\directshow

既然如此想让QCamera响应硬件按钮的拍图操作只需要修改下directshow这个插件即可而其他的视频渲染等功能就不用自己封装了。视频预览和拍图的接口是差不多的只需要把预览的接口复制粘贴一份稍加修改。如果要扩展其他功能也是直接修改相关源码即可

先在directshowcameraglobal.h加一个GUID声明PIN_CATEGORY_STILL因为文本不好标注哪些是新增的所以用的截图图中红色为新增代码

在dscamerasession.h和cpp代码里搜m_previewSampleGrabber和m_nullRendererFilter然后复制粘贴修改一份。有一点不同的就是预览的接口如果操作失败是直接返回false但是硬件拍图我们不能直接返回因为有的相机本身就没对应的接口直接跳过就好了。

dscamerasession.h

dscamerasession.cpp

DirectShowSampleGrabber::bufferAvailable信号表示有数据来了连接该信号进行处理然后使用imageCaptured将图片信号发送出去即可。我这里偷懒发的空图然后在主程序里判断是否为空再主动触发一次拍图。 

    if (!m_stillSampleGrabber) {
        m_stillSampleGrabber = new DirectShowSampleGrabber(this);
        connect(m_stillSampleGrabber, &DirectShowSampleGrabber::bufferAvailable,
                this, [this](){
            qDebug()<<"Still capture bufferAvailable";
            emit imageCaptured(-1, QImage());
        });
    }
void UVCCamera::onImageCaptured(int id, const QImage &preview)
{
    //判断是否是我们在plugins里触发的
    if (preview.isNull()) {
        if (id == -1)
            capture(); //主动拍图
        return;
    }
    //... ...
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: windows