Hi i am using direct show filter graph in the following way.
FileSourceFilter -> AviSpliter ->AviMux -> FileWritterFilter.
then using IMediaControl Interface instance to run the Graph.After running the graph I get a recorded file but its size is bigger than the original .avi file.When i play it then it plays on window media player successfully but during playing I am not getting the voice or audio. the relevant code is pasted here.
the code for recording i implemented is as following...
BOOL CRecordingDlg::Record()
{
UpdateData(TRUE);
HRESULT hr;
long evcode;
hr = CoInitialize(NULL);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraph);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = pGraph->QueryInterface(IID_IMediaControl,(void**)&pControl);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = pGraph->AddSourceFilter( m_StrmUrl.AllocSysString(),L"Source",(IBaseFilter**)&pSource);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = CoCreateInstance(CLSID_AviSplitter,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pAviSpliter);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = pGraph->AddFilter(pAviSpliter,L"AviSplitter");
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = CoCreateInstance(CLSID_AviDest,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pAviMux);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = pGraph->AddFilter(pAviMux,L"AviDest");
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = CoCreateInstance(CLSID_FileWriter,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pFileWriter);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = pFileWriter->QueryInterface(IID_IFileSinkFilter2,(void**)&pSink);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
hr = pGraph->AddFilter(pFileWriter,L"FileWriter");
if(FAILED(hr))
{
AfxMessageBox(L"unable to Add");
return FALSE;
}
hr = pSink->SetFileName(m_SaveFile.AllocSysString(),NULL);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
ConnectPin(pGraph,pSource,pAviSpliter);
ConnectPin(pGraph,pAviSpliter,pAviMux);
ConnectPin(pGraph,pAviMux,pFileWriter);
pControl->Run();
hr = pEvent->WaitForCompletion(INFINITE,&evcode);
if(evcode!=EC_COMPLETE)
return FALSE;
pControl->Stop();
AfxMessageBox(L"File is recorded");
return TRUE;
}
BOOL CRecordingDlg::ConnectPin(IGraphBuilder *pGraph,IBaseFilter *from,IBaseFilter *to)
{
HRESULT hr;
CComPtr<ipin> fPin,tPin;
if(!(fPin = Getnextpin(from, PINDIR_OUTPUT)))
return FALSE;
if(!(tPin = Getnextpin(to,PINDIR_INPUT)))
return FALSE;
hr = pGraph->Connect(fPin,tPin);
if(FAILED(hr))
{
GetErrorMessage(hr);
}
return TRUE;
}
Pin* CRecordingDlg::Getnextpin(IBaseFilter *base,PIN_DIRECTION dir)
{
HRESULT hr;
PIN_DIRECTION pindir;
CComPtr<ienumpins> ep;
IPin *pin, *buddy, *found = NULL;
hr = base->EnumPins(&ep);
if (FAILED(hr))
return NULL;
while (ep->Next(1, &pin, NULL) == S_OK)
{
pin->QueryDirection(&pindir);
if (pindir == dir)
{
hr = pin->ConnectedTo(&buddy);
if (FAILED(hr))
{
found = pin;
break;
}
buddy->Release();
}
pin->Release();
}
return found;
}
there also some problem to stop the recording when i try to stop the recording using pcontrol->stop method then nothig is happening.so plz tell me any one how to control the recording play the recorded file with voice or audio.
thanks in advance