DirectShow дилемма — не умеет записывать

Это актуальный основной код, предварительный просмотр работает нормально:

int main()
{
HRESULT hr = CoInitialize(NULL);

ICaptureGraphBuilder2   *pBuild;
IGraphBuilder           *pGraph;
IMoniker                *pMoniker;
IMediaControl           *pControl;
IMediaEvent             *pEvent;

InitCaptureGraphBuilder(&pGraph, &pBuild);

hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

IBaseFilter    *pCap;   // Video capture filter
IEnumMoniker   *pEnum;

hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
DisplayDeviceInformation(pEnum, &pMoniker);
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);

if (SUCCEEDED(hr))
{
hr = pGraph->AddFilter(pCap, L"Capture Filter");
}

hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
hr = pControl->Run();

_getch();

pControl->Release();
pCap->Release();
pGraph->Release();
pBuild->Release();
CoUninitialize();

return 0;
}

Теперь я знаю, что для записи мне нужен этот кусок кода:

IBaseFilter *pMux;

hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi, L"D:\\test.avi", &pMux, NULL);
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, NULL, pMux);

Если я заменю его на код предварительного просмотра, он фактически создаст файл AVI (очень большой), но он пустой, видео отсутствует.
Я имею в виду, я заменяю:

hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);

код, с тем, что выше.

Что я делаю не так, или лучше, чего мне не хватает?

0

Решение

RenderStream это метод высокого уровня, который внутренне встраивает другие вызовы через общедоступные документированные API, как правило, для простоты использования. Хотя это выглядит просто, это не так легко устранить, если что-то работает не так, как ожидалось. Еще сложнее сказать, проверяя просто код визуально. Это также не самое эффективное, потому что есть что-то, что вы можете сделать сами, чтобы приблизиться к решению, а именно:

Ваши дальнейшие шаги соответствуют одному из двух:

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

  2. Вы проверяете получившуюся топологию графа фильтра, помещая свой граф на ROT, и проверка с помощью GraphEdit или аналогичный инструмент, чтобы убедиться, что топология соответствует вашим ожиданиям.

Вам также обязательно нужно проверить HRESULT коды, что вы уже делаете.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector