从视频中提取音频为wav

问题描述 投票:0回答:4

我知道有一个与我类似的问题:Extract wav file from video file

我是 C++ 新手,了解 COM 库 + 视频和音频需要 directX。我一直在寻找教程和示例代码,但收效甚微。

我的问题是如何对应用程序进行编码以获取视频文件(任何类型)并将提取的音频另存为 .wav 在我的应用程序中,而不是使用其他应用程序(例如 graphedit 或 virtualdub)?

c++ video audio extract
4个回答
5
投票

我将支持仅使用 ffmpeg 构建来执行音频提取的动议。它可以通过一个简单的命令来完成,而不是很可能使用数百行代码(如果您要检查处理不同视频格式和编解码器时可能发生的所有可能问题)。

ffmpeg -i video.avi -vn soundfile.wav

你可以使用 libavformat 和 libavformat(ffmpeg 背后的库)来做同样的事情,但是除非你需要在输出到 wav 之前对原始音频进行一些处理,否则除了知识之外什么也得不到。

ffmpeg 很好,因为可执行文件包含您可能需要的所有音频和视频解码器,因此该解决方案具有高度可移植性。你没有安装编解码器或任何东西。输入视频文件可以是 ffmpeg 支持的任何格式或编解码器,您不必费心在代码中对它们进行不同的处理。

在 C++ 中,您可以通过在代码中构建命令行字符串并从代码中启动该过程来调用 ffmpeg(作为 C++ 新手,您可能需要研究如何执行此操作,但这非常简单)。


5
投票

你不能使用像ffmpeg这样的东西,或者它使用的库之一吗?或者也许是 mencoder,它也可以做同样的事情。据我所知,它们都有一个命令行界面,而且它们可能也有一些 API...


2
投票

您可以使用 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 个将添加到图表中的过滤器。

  1. AVI 多路复用器:CLSID_AviDest
  2. 文件写入器:CLSID_FileWriter。
  3. 空渲染器: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 对此进行了测试,它有效。我希望这会有所帮助。


0
投票

使用librosa和声音文件 您可以使用 librosa 和 soundfile 等软件包,并使用以下代码从视频文件中提取音频

import librosa
import soundfile as sf
def extract_audio_from_video(video_path,audio_save_path):
   audio , sr = librosa.load(video_path)
   sf.write(audio_path,audio,sr)
extract_audio_from_video("video.mp4","audio.wav")

书库 声音文件

© www.soinside.com 2019 - 2024. All rights reserved.