现在我正在使用 WMF 在 Qt 上显示真实的相机帧。首先,可以定期使用 WMF 从 IMFSampleGrabberSinkCallback 继承我的 Grabber 类中的 OnProcessSample 中的图像帧。
WMF.CPP
STDMETHODIMP Grabber::OnProcessSample
(
REFGUID guidMajorMediaType,
DWORD dwSampleFlags,
LONGLONG llSampleTime,
LONGLONG llSampleDuration,
const BYTE * pSampleBuffer,
DWORD dwSampleSize
)
{
QMutexLocker locker(&m_SampleMutex);
pMySignal->setValue();
return S_OK;
}
为了通知 UI 框架的获取,我尝试使用 Signal & Slot 创建从 QObject 继承的简单类,如下所示。
主窗口.h
class MySignal : public QObject
{
Q_OBJECT
public:
MySignal(QObject * parent = 0, char* name = 0)
{
setObjectName ( name );
}
void setValue() { emit EnvokeSignal(); }
public slots:
void ReceiveSignal();
signals:
void EnvokeSignal();
};
class MySignal2 : public QObject
{
Q_OBJECT
public:
MySignal2(QObject * parent = 0, char* name = 0)
{
setObjectName ( name );
}
void setValue() { emit EnvokeSignal2(); }
public slots:
void ReceiveSignal2();
signals:
void EnvokeSignal2();
};
主窗口.cpp
MySignal* pMySignal;
void MySignal::ReceiveSignal()
{
//qDebug()<<"Objectname = "<< objectName() <<" val = "<< v;
OutputDebugString(L" === ReceiveSignal === \n");
}
void MySignal2::ReceiveSignal2()
{
//qDebug()<<"Objectname = "<< objectName() <<" val = "<< v;
OutputDebugString(L" === ReceiveSignal === \n");
}
void MainWindow::on_pushButton_clicked()
{
MySignal SignalSlotCleass(0, "a");
MySignal2 Signal2SlotCleass(0, "b");
pMySignal = &SignalSlotCleass;
QObject::connect( &SignalSlotCleass, &MySignal::EnvokeSignal, &Signal2SlotCleass, &MySignal2::ReceiveSignal2 );
EnumerateCamDevice_StartupMF();
}
当我只使用 MySignal1、MySignal2 等两个类时,我可以在 Slot 方法中获取 Signal 消息。但是如果我尝试将 WMF.cpp 与 OnProcessSample 函数合并,我无法在 Slot 函数中获取从 OnProcessSample 发送的信号消息。如果有人知道这个问题,你能给我一些克服它的技巧吗?