Извлечь аудио из видео в формате wav

Я знаю, что есть вопрос, похожий на мой: Извлечь файл wav из видеофайла

Я новичок в C ++ и понимаю о библиотеке COM + DirectX необходим для видео и аудио. Я искал учебник и образцы кода, но безуспешно.

У меня вопрос: как мне закодировать приложение, чтобы взять видеофайл (любого типа) и сохранить извлеченный звук как .wav в моем приложении, а не использовать другие приложения, такие как graphedit или virtualdub?


person John Meyers    schedule 22.01.2010    source источник


Ответы (3)


Я поддержу движение, чтобы просто использовать сборку ffmpeg для извлечения звука. Это можно сделать одной простой командой, а не сотнями строк кода (если вы собираетесь проверить все возможные проблемы, которые могут возникнуть при работе с разными видеоформатами и кодеками).

ffmpeg -i video.avi -vn soundfile.wav

Вы можете использовать libavformat и libavformat (библиотеки, стоящие за ffmpeg), чтобы сделать то же самое, но если вам не нужно выполнять некоторую обработку необработанного звука перед выводом в wav, не будет ничего, кроме знаний.

ffmpeg хорош, потому что исполняемый файл содержит все аудио- и видеодекодеры, которые вам, вероятно, когда-либо понадобятся, поэтому решение очень портативно. Вам не нужно устанавливать кодеки или что-то в этом роде. Входной видеофайл может быть в любом формате или кодеке, который поддерживает ffmpeg, и вам не нужно беспокоиться о том, чтобы обрабатывать их по-другому в своем коде.

Из C ++ вы можете вызвать ffmpeg, построив строку командной строки в своем коде и запустив процесс из вашего кода (поскольку C ++ является новым, вам, вероятно, потребуется изучить, как это сделать, но это довольно просто).

person Jason B    schedule 22.01.2010
comment
Спасибо за ответ и четкое объяснение. Я загрузил ffmpeg, но обнаружил, что вики на сайте по созданию ffmpeg сбивает с толку и не обновляется. Не уверен, какой тип библиотеки нужно создать (статическая или dll), но я предполагаю, что она будет статической, если я собираюсь включить библиотеку в свое приложение для передачи другим людям? - person John Meyers; 23.01.2010
comment
Вы можете получить двоичные файлы win32 для ffmpeg здесь: ffmpeg.arrozcru.org/builds, так что вы не придется построить самому. Просто скачайте последний двоичный пакет win32 (ffmpeg-r16537-gpl-static-win32.tar.bz2), и он будет содержать ffmpeg.exe в каталоге bin. Поскольку это статическая сборка, вам нужен только exe-файл. Сборка ffmpeg в системе li / unix - это несложно, но в Windows это сложнее, потому что вы не можете собрать его с помощью компилятора Visual Studio, поэтому вам придется использовать mingw. Я бы просто использовал предварительно созданный двоичный файл. - person Jason B; 23.01.2010

Разве вы не можете использовать что-то вроде ffmpeg или одну из библиотек, которые он использует? Или, может быть, mencoder, который может делать то же самое. Насколько я знаю, у них обоих есть интерфейс командной строки, и у них также может быть какой-то API ...

person Ruben    schedule 22.01.2010

Вы можете использовать фильтры 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

После того, как вы инициализируете фильтр «File writer», вам нужно будет указать путь, по которому вы хотите записать файл. Вы можете сделать это:

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, и он работает. Я надеюсь, это поможет.

person ata    schedule 22.01.2010