DirectShow是微软的媒体播放技术,以前叫ActiveMovie,代号为Quartz,可代替以前的Windows Multimedia(winmm)的功能。
整体分为几步:
1.初始化COM环境(CoInitialize)
2.建立FilterGraph对象,获取IGraphBuilder接口(CoCreateInstance)
3.从该对象获取IMediaControl和IMediaEvent接口(IGraphBuilder->QueryInterface)
4.读取文件(IGraphBuilder->RenderFile)
5.播放文件(IMediaControl->Run)
6.等待播放结束(IMediaEvent->WaitForCompletion)
7.清理资源(Release各接口,CoUninitialize卸载COM环境)
// dshowtest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
// 用于控制台的头文件
#include <stdio.h>
#include <locale.h>
#include <io.h>
#include <fcntl.h>
// 用于Windows和COM的头文件
#define UNICODE 1
#include <windows.h>
// DirectShow的一个头文件、两个库
#include <dshow.h>
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "quartz.lib")
int main()
{
// 设置Unicode控制台环境
_wsetlocale(LC_ALL, L"");
_setmode(_fileno(stdin), _O_WTEXT); // 文件名乱码的话,请将此句注释
_setmode(_fileno(stdout), _O_WTEXT);
_setmode(_fileno(stderr), _O_WTEXT);
// 初始化COM环境
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) { wprintf(L"%d HRESULT %x\n", 1, hr); return 1; }
// 创建DirectShow的接口IGraphBuilder,用于文件加载
IGraphBuilder *pGraph = NULL;
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
if (FAILED(hr)) { wprintf(L"%d HRESULT %x\n", 2, hr); return 1; }
// IMediaContorl用于控制播放
// IMediaEvent用于接收事件
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl);
if (FAILED(hr)) { wprintf(L"%d HRESULT %x\n", 3, hr); return 1; }
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (FAILED(hr)) { wprintf(L"%d HRESULT %x\n", 4, hr); return 1; }
wchar_t filename[MAX_PATH + 2];
wprintf(L"File name: ");
_getws_s(filename);
// 去掉文件名的引号
if (filename[0] == L'\"' && filename[wcslen(filename) - 1] == L'\"')
{
filename[wcslen(filename) - 1] = 0;
wmemmove(filename, filename + 1, wcslen(filename + 1) + 1);
}
// 读取文件
wprintf(L"Reading file: %s...\n", filename);
hr = pGraph->RenderFile(filename, NULL);
if (FAILED(hr)) { wprintf(L"%d HRESULT %x\n", 5, hr); return 1; }
// 播放文件
wprintf(L"Start playing...\n");
hr = pControl->Run();
if (FAILED(hr)) { wprintf(L"%d HRESULT %x\n", 6, hr); return 1; }
// 等待播放结束
wprintf(L"Waiting...\n");
long evCode = 0;
hr = pEvent->WaitForCompletion(INFINITE, &evCode);
if (FAILED(hr)) { wprintf(L"%d HRESULT %x\n", 7, hr); return 1; }
wprintf(L"Complete.\n");
// 释放资源
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
return 0;
}</dshow.h></windows.h></fcntl.h></io.h></locale.h></stdio.h>