Вы можете использовать фильтры 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
- File Writer: CLSID_FileWriter.
- Нулевое средство визуализации: 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.
Я проверил это через графитит, и оно работает. Я надеюсь, что это поможет.