Вы можете использовать фильтры 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.
- Null рендерер: 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' фильтр, который вы необходимо будет указать путь, в котором вы хотите записать файл. Вы можете сделать это:
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 Используется для получения событий из графика.
Query интерфейс:
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
and pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
Выполнить график:
pControl->Run();
И ждать рендеринга для завершения:
pEvent->WaitForCompletion(INFINITE, &evCode);
После этого, вы можете найти файл, имеющий аудио в формате .wav.
Я проверил это через graphedit, и он работает. Я надеюсь, это поможет.
Благодарим вас за ответ и разъяснение. Я загрузил ffmpeg, но нашел, что wiki на сайте для создания ffmpeg запутан и не обновлен. Не уверен, какой тип библиотеки будет создан как (статический или dll), но я предполагаю, что он будет статичным, если я собираюсь включить библиотеку в мое приложение для выпуска другим людям? –
Вы можете получить бинарные файлы win32 для ffmpeg здесь: http://ffmpeg.arrozcru.org/builds/, поэтому вам не нужно его самостоятельно создавать. Просто загрузите последний бинарный пакет win32 (ffmpeg-r16537-gpl-static-win32.tar.bz2), и он будет содержать «ffmpeg.exe» в каталоге bin. Поскольку это статическая сборка, все, что вам нужно, это exe-файл. Построение ffmpeg в системе li/unix - это кусок пирога, но в Windows это сложнее, потому что вы не можете создать его с помощью компилятора Visual Studio, поэтому вам нужно использовать mingw. Я бы просто пошел с заранее построенным двоичным кодом. –