Basically, I want to capture audio / video. Run it through the mp4 multiplexer and save it to a file on disk. Before I used ICaptureGraphBuilder2, but this seems unusual when saving in custom formats.
My code is still
I list video / audio devices. In this example, I'm only trying to capture audio. I get the correct device and use GetPin to list filter contacts to get output.
hr = pMoniker2->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc2); hr = pGraph->AddFilter(pSrc2, L"AudioCap"); hr = GetPin(pSrc2, PINDIR_OUTPUT, &outPin);
This is a custom filter, MP4 multiplexer. It loads correctly, and I can get the input pin and connect it to the output pin. So far so good.
HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4mux.dll"), clsid, &pUnk); if (SUCCEEDED(hr)) { IBaseFilterPtr pFilter = pUnk; HRESULT hr = pGraph->AddFilter(pFilter, L"Private Filter"); hr = GetPin(pFilter, PINDIR_INPUT, &inPin); } hr = pGraph->Connect(outPin, inPin);
Here I am lost, I canβt find out how to take the following steps for rendering and save the output to a file on disk. So any help with the following steps would be greatly appreciated, thanks in advance!
EDIT: File Code
AM_MEDIA_TYPE mType; mType.majortype = MEDIATYPE_Video; mType.subtype = MEDIASUBTYPE_H264; mType.bFixedSizeSamples = FALSE; mType.bTemporalCompression = TRUE; mType.lSampleSize = 0; mType.formattype = FORMAT_None; mType.pUnk = NULL; mType.cbFormat = 0; mType.pbFormat = NULL; //Not 100% sure about the setup of the media format. IBaseFilter * iFiltera = NULL; IFileSinkFilter* iFilter = NULL; IGraphBuilder *pGraph; hr = pMoniker2->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc2); //audio capture hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph); hr = CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&iFiltera); hr = pBuild->SetFiltergraph(pGraph); hr = pGraph->AddFilter(pSrc2, L"AudioCap"); hr = GetPin(pSrc2, PINDIR_OUTPUT, &outPin); //ADDED hr = pGraph->AddFilter(iFiltera, L"FileWriter"); hr = iFiltera->QueryInterface(IID_IFileSinkFilter, (void**)&iFilter); iFilter->SetFileName((LPCOLESTR)"c:\\wav\\tester.mp4", NULL); //UPDATED mType set to NULL HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4mux.dll"), clsid, &pUnk); IBaseFilterPtr pFilter = pUnk; if (SUCCEEDED(hr)) { HRESULT hr = pGraph->AddFilter(pFilter, L"Private Filter"); hr = GetPin(pFilter, PINDIR_INPUT, &inPin); //mux in hr = GetPin(pFilter, PINDIR_OUTPUT, &mOutPin); //mux out hr = GetPin(iFiltera, PINDIR_INPUT, &filePin); // filewriter in } hr = pGraph->Connect(outPin, inPin); //connect audio out and mux in hr = pGraph->Connect(mOutPin, filePin); //connect mux out and file in; Error 0x80040217(VFW_E_CANNOT_CONNECT?) //works now //ADDED code IMediaControl *pMC = NULL; hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC); hr = pMC->Run(); Sleep(4000); hr = pMC->Stop();