Извлечение аудио из видео как WAV - PullRequest
3 голосов
/ 22 января 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 22 января 2010

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

4 голосов
/ 22 января 2010

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

ffmpeg -i video.avi -vn soundfile.wav

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

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

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

1 голос
/ 22 января 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. File Writer: 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.

Я проверил это через графитит, и оно работает. Я надеюсь, что это поможет.

...