我知道有一个类似于我的问题:Extract wav file from video file
我是C ++的新手,了解COM库+视频和音频需要directX。我一直在寻找教程和示例代码,但收效甚微。
我的问题是如何编写应用程序以获取视频文件(任何类型)并将提取的音频保存为我的应用程序中的.wav,而不是使用其他应用程序,如graphedit或virtualdub?
答案 0 :(得分:5)
你不能使用像ffmpeg这样的东西,或者它使用的某个库吗?或者也许mencoder,它可以做同样的事情。据我所知,它们都有一个命令行界面,它们也可能有一些API ......
答案 1 :(得分:4)
我将在动作中使用ffmpeg的构建来执行音频提取。它可以在一个简单的命令中完成,而不是很可能是数百行代码(如果您要检查处理不同视频格式和编解码器时可能发生的所有问题)。
ffmpeg -i video.avi -vn soundfile.wav
您可以使用libavformat和libavformat(ffmpeg后面的库)来做同样的事情,但除非您在输出到wav之前需要对原始音频进行一些处理,否则除了知识之外没有任何好处。
ffmpeg很不错,因为可执行文件包含您可能需要的所有音频和视频解码器,因此该解决方案具有高度可移植性。你没有安装编解码器或任何东西。输入视频文件可以是ffmpeg支持的任何格式或编解码器,您无需在代码中以不同方式处理它们。
从C ++中你可以通过在你的代码中构建命令行字符串来调用ffmpeg并从你的代码中开始流程(作为新的C ++,你可能需要研究如何做到这一点,但这很容易)。
答案 2 :(得分:1)
您可以使用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个过滤器。
您可以按以下方式初始化过滤器:
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对此进行了测试,但它确实有效。我希望这会有所帮助。