gpt4 book ai didi

android - 将 QVideoFrame 直接转换为 QPixmap

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:32 25 4
gpt4 key购买 nike

我使用 QVideoProbe 访问相机帧。我的平台是安卓。我已将每个相机帧转换为 QImage,然后在 QLabel 上显示像素图。我的问题是这个过程非常缓慢。帧显示非常缓慢。我可以将 QVideoFrame 直接转换为 QPixmap 或其他更快的方式来显示相机帧吗?这是我的代码:

    QCamera *camera = new QCamera(this);

camera->setCaptureMode(QCamera::CaptureViewfinder);

QVideoProbe *videoProbe = new QVideoProbe(this);

bool ret = videoProbe->setSource(camera);
qDebug() <<"videoProbe->setSource(camera):" << ret;

if (ret) {
connect(videoProbe, SIGNAL(videoFrameProbed(const QVideoFrame &)),
this, SLOT(present(const QVideoFrame &)));

}

camera->start();
...
...


bool MainWindow::present(const QVideoFrame &frame)
{
qDebug() <<"counter:" << ++counter;

QVideoFrame cloneFrame(frame);
if(cloneFrame.map(QAbstractVideoBuffer::ReadOnly))
{
QImage img(
cloneFrame.size(), QImage::Format_ARGB32);
qt_convert_NV21_to_ARGB32(cloneFrame.bits(),
(quint32 *)img.bits(),
cloneFrame.width(),
cloneFrame.height());

label->setPixmap(QPixmap::fromImage(img));

cloneFrame.unmap();
}

return true;
}

最佳答案

1. 要从视频帧转换为 QImage,我使用 qt 内部方法:

//Somewhere before using
extern QImage qt_imageFromVideoFrame(const QVideoFrame &f);
...
//using
QImage imgbuf=qt_imageFromVideoFrame(frame);
  1. 您需要跳过一些帧,只显示一些。它将允许您以最大可能的速度处理流。我使用以下代码来做到这一点:

    void MyVideoHandler::videoFrameProbed(const QVideoFrame &frame)
    {
    if(!started)
    return;
    if(!frameProcessor)
    return;
    if(m_isBusy)
    {
    //qDebug() << "Video frame dropped";
    return;
    }
    m_isBusy = true;
    qDebug() << "videoFrameProbed";
    QMetaObject::invokeMethod(frameProcessor, "processFrame", Qt::QueuedConnection,
    Q_ARG(QVideoFrame, frame),
    Q_ARG(bool, param1),
    Q_ARG(bool, param2),
    Q_ARG(bool, param3),
    Q_ARG(bool, param4));
    //qDebug() << "processFrame invoked";
    }

我通过 invokeMethod 调用它只是因为 frameProcessor 位于不同的线程中,但这不是你的情况,因为你需要在 UI 线程中显示它。另一方面你可以在线程中转换为 QImage(或 QPixmap)然后将结果发送到 UI 线程。所以这是如何做到这一点的代码:

frameProcessor=new MyVideoFrameProcessor();
frameProcessor->moveToThread(&videoStreamThread);

啊,我还必须说 MyVideoFrameProcessor 在完成处理时生成事件并且 MyVideoHandler 将 m_isBusy 切换为 false。

关于android - 将 QVideoFrame 直接转换为 QPixmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25958164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com