Захватывать кадры из ActiveX - PullRequest
       14

Захватывать кадры из ActiveX

1 голос
/ 16 декабря 2011

Возможно, проблема у меня немного конкретная, но я уверен, что решение будет интересным для многих людей.

Теперь к делу.У меня есть элемент управления ActiveX, который воспроизводит потоковое видео.Моя цель - добраться до каждого воспроизводимого кадра и отобразить его во внешнем приложении c # через какой-то элемент управления Windows, например, на панели.

Вот пример фильтра преобразования DirectShow:

STDMETHODIMP CTransform::Transform(BSTR bsResource, struct U_VideoFrame *pInFrame, struct U_VideoFrameData **pOutFrameData)
    {
        //Must allocate memory this way, the output size must be equal to input size
        *pOutFrameData = (U_VideoFrameData*)CoTaskMemAlloc(sizeof(U_VideoFrameData));
        (*pOutFrameData)->pFrame = (BYTE*)CoTaskMemAlloc(pInFrame->Frame.nLength);
        (*pOutFrameData)->nLength = pInFrame->Frame.nLength;

        //Now transform data contained in (*pOutFrameData)->pFrame; 
        //We simply copy data here
        memcpy((*pOutFrameData)->pFrame, pInFrame->Frame.pFrame, pInFrame->Frame.nLength);

        return S_OK;
    }

Моя идея заключается в том, что где-то внутри этого метода я должен поместить функцию обратного вызова, которая будет вызывать мой управляемый код и передавать ему pInFrame.Как мне это сделать?Пожалуйста, помогите

PS Я прочитал замечательную статью Как реализовать интерфейс обратного вызова из неуправляемой DLL в .net app .Это работает как описано (конечно).Однако, когда я изменяю приведенный выше код так:

  typedef int (__stdcall * Callback)(const char* text);
static Callback Handler = 0;

extern "C" __declspec(dllexport)
void __stdcall SetCallback(Callback handler) {
  Handler = handler;
}

extern "C" __declspec(dllexport)
void __stdcall TestCallback() {
  int retval = Handler("hello world");
}


// CTransform

STDMETHODIMP CTransform::Transform(BSTR bsResource, struct U_VideoFrame *pInFrame, struct U_VideoFrameData **pOutFrameData)
{
    //Must allocate memory this way, the output size must be equal to input size
    *pOutFrameData = (U_VideoFrameData*)CoTaskMemAlloc(sizeof(U_VideoFrameData));
    (*pOutFrameData)->pFrame = (BYTE*)CoTaskMemAlloc(pInFrame->Frame.nLength);
    (*pOutFrameData)->nLength = pInFrame->Frame.nLength;

    //Now transform data contained in (*pOutFrameData)->pFrame; 
    //We simply copy data here
    memcpy((*pOutFrameData)->pFrame, pInFrame->Frame.pFrame, pInFrame->Frame.nLength);
    if (Handler != 0)
        int retval = Handler("Transform");
    return S_OK;
}

, событие не запускается из метода Transform.Метод TestCallback () работает

Я застрял.Любая помощь будет принята с благодарностью.

...