Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DirectShow

60K
24 декабря 2011 года
Павел13
11 / / 30.09.2010
Всем доброго времени суток! Пытаюсь собрать граф:
Код:
// DirectShow.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <DShow.h>
#include <atlbase.h>
#include <initguid.h>
#include <dvdmedia.h>

BOOL hrcheck(HRESULT hr, const char *errtext)
{
    if (hr>=S_OK) return FALSE;
    TCHAR szErr[MAX_ERROR_TEXT_LEN];
    DWORD res=AMGetErrorText(hr,szErr,MAX_ERROR_TEXT_LEN);
    if(res)printf("Error %x: %s\n",hr,errtext);
    else printf("Error %x: %s\n",hr,errtext);
    return TRUE;
}
#define CHECK_HR(hr,msg) if(hrcheck(hr,msg)) return hr;
CComPtr<IPin> GetPin(IBaseFilter*pFilter, LPCOLESTR pinname)
{
    CComPtr<IEnumPins>pEnum;
    CComPtr<IPin>pPin;
    wprintf(L"Looking for pinname [%s]\n", pinname);
    HRESULT hr=pFilter->EnumPins(&pEnum);
    if(hrcheck(hr,"Can not enumerate pin")) return NULL;
    while(pEnum->Next(1,&pPin,0)==S_OK)
    {
    PIN_INFO pinfo;
    pPin->QueryPinInfo(&pinfo);
    BOOL found = !_wcsicmp(pinname,pinfo.achName);
    if(pinfo.pFilter)pinfo.pFilter->Release();
    if(found) return pPin;
    pPin.Release();
    }
    printf("Pin not found\n");
    return NULL;
}
DEFINE_GUID(CLSID_USB2013MUVCWebCam,0x17CCA71B,0xECD7,0x11D0,0xB9,0x08,0x00,0xA0,0xC9,0x22,0x31,0x96);
DEFINE_GUID(CLSID_VideoRender,0xB87BEB7B,0x8D29,0x423F,0xAE,0x4D,0x65,0x82,0xC1,0x01,0x75,0xAC);

HRESULT BuildGraph(IGraphBuilder*pGraph)
{
   HRESULT hr=S_OK;
   CComPtr<ICaptureGraphBuilder2> pBuilder;
   hr=pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2);
   CHECK_HR(hr,"Can not SetFilterGraphCapture");
   hr= pBuilder->SetFiltergraph(pGraph);
   CHECK_HR(hr,"Can not SetGraphFilter");
   
   CComPtr<IBaseFilter> pMic;
   hr=pMic.CoCreateInstance(CLSID_AudioRecord);
   CHECK_HR(hr,"Can not create microfon");
   hr= pGraph->AddFilter(pMic,L"Микрофон (Устройство с поддержк)");
   CHECK_HR(hr,"Can not add microfon");

   CComPtr<IBaseFilter> pUSB201;
   hr=pUSB201.CoCreateInstance(CLSID_USB2013MUVCWebCam);
   CHECK_HR(hr,"Can not create USB 2.0 1 3M UVC WebCam");
   hr= pGraph->AddFilter(pUSB201,L"USB 2.0 1.3M UVC WebCam");
   CHECK_HR(hr,"Can not add USB 2.0 1 3M UVC WebCam");

   CComPtr<IBaseFilter> pDin;
   hr=pDin.CoCreateInstance(CLSID_AudioRender);
   CHECK_HR(hr,"Can not create audio");
   hr= pGraph->AddFilter(pDin,L"Динамики (Устройство с поддержк)");
   CHECK_HR(hr,"Can not add audio");

    CComPtr<IBaseFilter> pVideoRenderer;
   hr=pVideoRenderer.CoCreateInstance(CLSID_VideoRender);
   CHECK_HR(hr,"Can not create VideoRender");
   hr= pGraph->AddFilter(pVideoRenderer,L"VideoRender");
   CHECK_HR(hr,"Can not add VideoRender");

   hr=pGraph->ConnectDirect(GetPin(pMic,L"Capture"),GetPin(pDin,L"Audio Input pin (rendered)"),NULL);
   CHECK_HR(hr,"Can not adio connect");
   hr=pGraph->ConnectDirect(GetPin(pUSB201,L"Запись"),GetPin(pUSB201,L"VMR Input0"),NULL);
   CHECK_HR(hr,"Can not video connect");
   return S_OK;
}

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    CComPtr<IGraphBuilder> graph;
    graph.CoCreateInstance(CLSID_FilterGraph);
    printf("Building graph...\n");
    HRESULT hr=BuildGraph(graph);
    if(hr==S_OK)
    {
        printf("Running\n");
        CComQIPtr<IMediaControl, &IID_IMediaControl> mediaControl(graph);
        hr=mediaControl->Run();
        CHECK_HR(hr,"Can not RUN graph");
        CComQIPtr<IMediaEvent, &IID_IMediaEvent> mediaEvent(graph);
        BOOL stop=FALSE;
        MSG msg;
        while(!stop)
        {
            long ev=0, p1=0, p2=0;
            Sleep(500);
            printf(".");
            while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))DispatchMessage(&msg);
                while(mediaEvent->GetEvent(&ev,&p1,&p2,0)==S_OK)
                {
                    if(ev==EC_COMPLETE||ev==EC_USERABORT){printf("Done!\n");stop=TRUE;}
                    else if(ev==EC_ERRORABORT){printf("Error HRESULT %x\n",p1);mediaControl->Stop();stop=TRUE;}
                    mediaEvent->FreeEventParams(ev,p1,p2);
                }
           

        }
    }
   
        CoUninitialize();
    return 0;
}

все нормально компилится, но при запуске доходит до функции
 
Код:
hr=pGraph->ConnectDirect(GetPin(pMic,L"Capture"),GetPin(pDin,L"Audio Input pin (rendered)"),NULL);

в ней GetPin(pDin,L"Audio Input pin (rendered)") отрабатывает нормально, а вот
GetPin(pMic,L"Capture") с ошибкой. Ошибка возникает здесь
 
Код:
while(pEnum->Next(1,&pPin,0)==S_OK)]

вместо S_OK получаю S_FALSE :( Как исправить?
14
25 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Ну он тем самым говорит что там нету пинов
60K
26 декабря 2011 года
Павел13
11 / / 30.09.2010
Цитата: Phodopus
Ну он тем самым говорит что там нету пинов


Интересно, а куда делись? Может есть разница при перечислении входящих и исходящих пинов? Никак не могу понять в чем ошибка?

14
26 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
А вы на стороннем вижуалайзере проверьте сначала
60K
26 декабря 2011 года
Павел13
11 / / 30.09.2010
Цитата: Phodopus
А вы на стороннем вижуалайзере проверьте сначала


Огромное вам спасибо, что вы откликнулись. Не совсем понял, что есть "вижуалайзер"? Если вы имеете ввиду программу типа GraphEdit, то в нем все робит как надо. Да и код я этот не сам писал, а сгенерил с помощью кодогенератора GraphEdit немного допилив под VS 2010.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог