Теперь я использую WMF, чтобы показать реальный кадр камеры на Qt.
Сначала можно получить кадр изображения в OnProcessSample, который находится в моем классе Grabber и регулярно наследуется от IMFSampleGrabberSinkCallback с WMF.
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;
}
Чтобы уведомить пользовательский интерфейс о получении фрейма, я попытался создать простые классы, унаследованные от QObject с Signal & Слот, как показано ниже.
mainwindow.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();
};
mainwindow.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, я мог получить сообщение Signal в методе Slot. Но если бы я попытался объединить WMF.cpp с функцией OnProcessSample, я не смог бы получить сигнальное сообщение, отправленное из OnProcessSample в функцию Slot.
Если кто-нибудь знает эту проблему, не могли бы вы дать мне несколько советов по ее преодолению?
После завершения функции on_pushButton_clicked () ваши объекты SignalSlotCleass и Signal2SlotCleass удаляются. Потому что он создан в стеке. Например, вы можете сделать это так:
SignalsHandler.h
class SignalsHandler
{
public:
// if you want you can use any other smart pointer
// or even simple pointer but don`t forget clear memory
QSharedPointer<MySignal> pMySignal;
QSharedPointer<MySignal2> pMySignal2;
public:
void SignalsHandler() :
pMySignal( new MySignal(0, "a") ),
pMySignal( new MySignal2(0, "b") )
{
QObject::connect( pMySignal, &MySignal::EnvokeSignal, pMySignal2, &MySignal2::ReceiveSignal2 );
}
};
WMF.CPP
STDMETHODIMP Grabber::OnProcessSample
(
REFGUID guidMajorMediaType,
DWORD dwSampleFlags,
LONGLONG llSampleTime,
LONGLONG llSampleDuration,
const BYTE * pSampleBuffer,
DWORD dwSampleSize
)
{
QMutexLocker locker(&m_SampleMutex);
// or you can pass hndl like a parameter of function
SignalsHandler hndl;
hndl.pMySignal->setValue();
return S_OK;
}
Других решений пока нет …