Click here to Skip to main content
16,018,442 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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...
C++
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;
}
//Definition for connecting the pin
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;
}
//Definition for getting the next pin

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
Posted
Updated 10-Jul-12 0:25am
v5
Comments
Sebastian T Xavier 10-Jul-12 5:41am    
what the junk is this?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900