Has*_*esh 9 qt camera android qpixmap
我以前习惯QVideoProbe使用相机镜架.我的平台是Android.我已将每个相机帧转换为QImagepixmap并显示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;
}
Run Code Online (Sandbox Code Playgroud)
1.为了从视频帧转换为QImage,我使用qt内部方法:
//Somewhere before using
extern QImage qt_imageFromVideoFrame(const QVideoFrame &f);
...
//using
QImage imgbuf=qt_imageFromVideoFrame(frame);
Run Code Online (Sandbox Code Playgroud)
您需要跳过一些帧并仅显示一些。它将允许您以最大可能的速度处理流。我用下面的代码来做到这一点:
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";
}
Run Code Online (Sandbox Code Playgroud)我通过invokeMethod调用它只是因为frameProcessor位于不同的线程中,但这不是你的情况,因为你需要在UI线程中显示它。另一方面,你可以在线程中转换为QImage(或QPixmap),然后将结果发送到用户界面线程。所以这里是如何做到这一点的代码:
frameProcessor=new MyVideoFrameProcessor();
frameProcessor->moveToThread(&videoStreamThread);
Run Code Online (Sandbox Code Playgroud)
啊,我还必须说 MyVideoFrameProcessor 在完成处理时生成事件,并且 MyVideoHandler 将 m_isBusy 切换为 false。
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |