你可以使用Directshow过滤器构建一个图形,将音频保存为.wav格式。
你需要使用的接口有:
(注意:此解决方案将从avi文件中提取音频)
IGraphBuilder:用于构建图形。
IBaseFilter:这些过滤器将被初始化以成为图形的一部分。
要初始化图形,请执行以下操作:
IGraphBuilder *pGraph = NULL
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph)
CLSID_FilterGraph定义在uuids.h中,该文件是PaltformSDK的一部分。
一旦图形被初始化,您需要初始化3个过滤器,这些过滤器将被添加到图形中。
- AVI多路复用器:CLSID_AviDest
- 文件编写器:CLSID_FileWriter。
- 空渲染器:CLSID_NullRenderer
您可以通过以下方式初始化过滤器:
IBaseFilter *pF = NULL;
CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pF);
clsid = clsid of the filter
使用以下方法在图表中添加筛选器:
pGraph->AddFilter(pF, name)
name = name of the filter. Can be 'AVI Mux' etc
当您初始化 '文件写入器' 过滤器后,您需要设置要写入文件的路径。您可以这样做:
IFileSinkFilter* pFileSink=NULL;
fileWriterFilter->QueryInterface(IID_IFileSinkFilter, (void**)&pFileSink);
pFileSink->SetFileName(filepath, NULL);
Here: fileWriter = file writer filter instance.
确保文件名的扩展名为.wav
一旦您在图形中添加了过滤器,您需要渲染视频文件,如下所示:
pGraph->RenderFile(sourcePath, NULL);
一旦渲染完成,现在您需要运行此图。您可以通过从图中查询几个接口来实现:
IMediaControl 用于运行过滤器
和 IMediaEvent 用于从图中获取事件。
查询接口:
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
and pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
运行图表:
pControl->Run();
等待渲染完成:
pEvent->WaitForCompletion(INFINITE, &evCode)
操作完成后,您将会找到一个以.wav格式存储音频的文件。
我已经通过graphedit进行了测试,它可以正常工作。希望这能对您有所帮助。