- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 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);
您需要跳过一些帧,只显示一些。它将允许您以最大可能的速度处理流。我使用以下代码来做到这一点:
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/
我正在尝试使用 QCamera 从相机获取图像。我认为我应该派生自 QAbstractVideoSurface 并实现 present(),其中代表相机捕获的当前图像的 QVideoFrame 被发送
我从网络摄像头接收到 QVideoFrames,它们包含 YUV 格式的图像数据 (QVideoFrame::Format_YUV420P)。我如何将一个这样的帧转换为一个具有 QVideoFrame
我正在尝试从视频文件中获取 Qt 中的 QVideoFrame 列表(格式并不重要)。我看过 http://doc.qt.digia.com/qt/qvideoframe.html找到一些关于 QVi
我在尝试转换 FFMPeg AVFrame 时遇到了一个奇怪的问题到 QT QVideoFrame ; 我正在尝试创建 QVideoFrame使用这个构造函数 QVideoFrame(int byte
我使用 QVideoProbe 访问相机帧。我的平台是安卓。我已将每个相机帧转换为 QImage,然后在 QLabel 上显示像素图。我的问题是这个过程非常缓慢。帧显示非常缓慢。我可以将 QVideo
我想从 QMediaPlayer 获取每一帧并将其转换为 QImage(或 cv::Mat) 所以我使用了来自 QVideoProbe 的 videoFrameProbed 信号: connect(&
我试图将解码后的 ffmpeg 缓冲区放入 QFrame 中,这样我就可以将此帧放入 QAbstractVideoBuffer 中,然后将此缓冲区放入 QMediaPlayer 中。 这是 Video
我想用 QT6 逐帧处理网络摄像头的流。我在网上查过,但由于 QTMultimedia 使用 QT6 进行了大量修改,而且由于 QT6 非常新,所以所有可用的文档/问题都已过时。 因此,为了实现我的目
关于我的问题的一些背景信息。我的目标是优化来自网络摄像头的图像的绘制,图像以 QVideoFrame 的形式出现,当前加载到 QImage 并从那里绘制。此解决方案工作正常,但在 X11 上绘制 QI
我是一名优秀的程序员,十分优秀!