曾寫了1個(gè)博客:
我們?yōu)楹尾涣?xí)慣使用qml? 最后有1個(gè)懸念,到底如何在C++代碼中獲得qml中camera的數(shù)據(jù)呢?
QAbstractVideoFilter
The QAbstractVideoFilter class represents a filter that is applied to the video frames received by a VideoOutput type.
https://doc-snapshots.qt.io/qt5-dev/qabstractvideofilter.html#details
QVideoFilterRunnable
The QVideoFilterRunnable class represents the implementation of a filter that owns all graphics and computational resources, and performs the actual filtering or calculations.
上面兩個(gè)類自己去看官方文檔吧,翻譯不好。
開始擼代碼!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
寫1個(gè)自己的類叫CameraFilter吧:
camerafilter.h
#ifndef CAMERAFILTER
#define CAMERAFILTER
#include <QVideoFilterRunnable>
class CameraFilter : public QAbstractVideoFilter
{
Q_OBJECT
public:
CameraFilter();
~CameraFilter();
QVideoFilterRunnable *createFilterRunnable();
private:
signals:
void finished(QObject *result);
void cameraFrameSignal(QVideoFrame);
public slots:
};
class CameraFilterRunnable : public QVideoFilterRunnable
{
public:
CameraFilterRunnable(CameraFilter* filter = NULL);
~CameraFilterRunnable();
QVideoFrame run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags);
private:
CameraFilter *m_filter;
};
#endif // CAMERAFILTER
camerafilter.cc
#include "camerafilter.h"
#include "qdebug.h"
CameraFilter::CameraFilter()
{
}
CameraFilter::~CameraFilter()
{
}
QVideoFilterRunnable *CameraFilter::createFilterRunnable()
{
return new CameraFilterRunnable(this);
}
CameraFilterRunnable::CameraFilterRunnable(CameraFilter* filter)
{
m_filter = filter;
}
CameraFilterRunnable::~CameraFilterRunnable()
{
}
QVideoFrame CameraFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags)
{
QVideoFrame cloneFrame(*input);
emit m_filter->cameraFrameSignal(cloneFrame);
return cloneFrame;
}
不要罵娘,上面的代碼很簡(jiǎn)單的,其實(shí)官方的文檔中也有類似的代碼片斷,不懂的自己看奧。
是通過:
emit m_filter->cameraFrameSignal(cloneFrame);
我們自己寫1個(gè)slot,然后對(duì)Frame進(jìn)行相應(yīng)的處理!
接下來(lái)才是高潮!!!!
第1步、讓qml中理解我們自己的類CameraFilter(Defining QML Types from C++) :
在C++中注冊(cè):
qmlRegisterType<CameraFilter>("CameraFilter", 1, 0, "CameraFilter");
在qml中導(dǎo)入:
import CameraFilter 1.0
第2步、在qml中干點(diǎn)大事兒:
Camera {
objectName: "CameraObject"
id: camera
imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash
exposure {
exposureCompensation: -1.0
exposureMode: Camera.ExposurePortrait
}
captureMode: Camera.CaptureVideo
flash.mode: Camera.FlashRedEyeReduction
}
VideoOutput {
width: 160
height: 90
id: video_output
objectName: "VidelOutputObject"
source: camera
anchors.fill: parent
focus : visible // to receive focus and capture key events when visible
visible: false
filters: [filter]
fillMode: VideoOutput.PreserveAspectFit
}
CameraFilter {
objectName: "cameraFilterObject"
id: filter
}