Вы можете использовать фильтры 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.
- Нулевой рендерер: 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