.
Environment: VC6 SP4, Win98/2000
It’s a simple Direct Show Application, used for previeing video files from disk. It also captures the real time data from a video capture device and allows you to preview it.
Technical Side:
I’ve used pure MFC classes and created a dialog based application and everything regarding GUI is the same as any particular MFC app is created. I’ve used the Direct Show 8 APIs that are mainly written in the form of COM Interfaces. You can download the Direct Show 8 SDK from Microsoft’s site or from the Direct Show site itself.
Some of the interfaces used in the Applliation include:
- IGraphBuilder: Opens and renders the video file
- IMediaControl : Is used to control the playback commands to the file
- IMediaEventEx : Controls the events on media files.It implements the callback functions to implement various events like play, pause, stop etc.
- IMediaSeeking : Provides set of functions to seek into the video file backwards or forwards.
- IBasicAudio : Controls the only audio renderer
- IBasicVideo : Controls the video only files that do not have any playback sound.
- IVideoWindow : Provides functions to view the video data in a view window.
Initilialize and play the movie file using the following code fragment. This code can be downloaded as part of the demo project.
BOOL CMovieDlg::OpenMediaFile()
{
LPCWSTR wstrMediaFile;CFileDialog dlgFile(TRUE,
NULL,
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
“Movie Files (*.avi;*.mpg;*.mpeg) |
*.avi;*.mpg;*.mpeg |
Audio Files (*.wav;*mp3;*.mpa;*.mpu;*.au) |
*.wav;*.mp3;*.mpa;*.mpu;*.au |
Midi Files (*.mid;*.midi;*.rmi) |
*.mid;*.midi;*.rmi| | “, this);if(dlgFile.DoModal() == IDOK)
{
m_strMediaFile = dlgFile.GetPathName();
}
else
return FALSE;USES_CONVERSION;
wstrMediaFile = A2W(m_strMediaFile);CoCreateInstance( CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IGraphBuilder,
(void **)&m_pGraph);
HRESULT hr = m_pGraph->RenderFile(wstrMediaFile, NULL);
if(FAILED(hr))
{
char szMsg[200];
AMGetErrorText(hr, szMsg, sizeof(szMsg));
AfxMessageBox(szMsg);
}// Specify the owner window.
IVideoWindow* pVidWin = NULL;
m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
pVidWin->put_Owner((OAHWND)m_hWnd);
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);CRect rc;
GetDlgItem(IDC_STATIC_FRAME)->GetWindowRect(rc);
ScreenToClient(rc);
pVidWin->SetWindowPosition(rc.left, rc.top, rc.Width(), rc.Height());// Set the owner window to receive event notices.
m_pGraph->QueryInterface(IID_IMediaEventEx,
(void **)&m_pEvent);
m_pEvent->SetNotifyWindow((OAHWND)m_hWnd, WM_GRAPHNOTIFY, 0);// Set the Media Seeking
m_pGraph->QueryInterface(IID_IMediaSeeking,
(void **)&m_pMediaSeeking);
m_pGraph->QueryInterface(IID_IBasicAudio,
(void **)&m_pBasicAudio);
m_pGraph->QueryInterface(IID_IBasicVideo,
(void **)&m_pBasicVideo);if ((!pVidWin) || (!m_pBasicVideo))
{
m_bAudioOnly = TRUE;
TRACE0(“No video interface. Assuming audio/MIDI ”
“file or unsupported video codec.\r\n”);
}long lVisible;
hr = pVidWin->get_Visible(&lVisible);m_bAudioOnly = FALSE;
if(FAILED(hr))
{
// If this is an audio-only clip, get_Visible() won’t work.
//
// Also, if this video is encoded with an unsupported codec,
// we won’t see any video, although the audio will work
// if it is of a supported format.
if(hr == E_NOINTERFACE)
{
m_bAudioOnly = TRUE;
m_pBasicAudio->put_Volume(m_lVolume);
}
else
TRACE1(TEXT(“Failed(%08lx) in pVW->get_Visible()!\r\n”),
hr);
}LONGLONG lDuration;
hr = m_pMediaSeeking->GetDuration(&lDuration);
if(SUCCEEDED(hr))
{
m_sldrVideo.SetRange(0,(int)1000);
m_sldrVideo.SetLineSize((int)100);
m_sldrVideo.SetTicFreq((int)10);
}return TRUE;
}BOOL CMovieDlg::Play()
{
// Run the graph
IVideoWindow *pVidWin = NULL;if(m_pGraph)
{
m_pGraph->QueryInterface(IID_IVideoWindow,
(void **)&pVidWin);
pVidWin->put_Visible(OATRUE);m_pGraph->QueryInterface(IID_IMediaControl,
(void **)&m_pMediaControl);
m_pMediaControl->Run();SetTimer(101, 100, NULL);
return TRUE;
}return FALSE;
}