2010-01-22 2 views
3

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

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

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

ответ

4

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

ffmpeg -i video.avi -vn soundfile.wav 

Вы можете использовать libavformat и libavformat (библиотеки за FFmpeg), чтобы сделать то же самое, но если вам не нужно, чтобы сделать некоторую обработку исходного звука перед выводом в формате WAV, то не было бы ничего, чтобы получить за знания, за исключением ,

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

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

+0

Благодарим вас за ответ и разъяснение. Я загрузил ffmpeg, но нашел, что wiki на сайте для создания ffmpeg запутан и не обновлен. Не уверен, какой тип библиотеки будет создан как (статический или dll), но я предполагаю, что он будет статичным, если я собираюсь включить библиотеку в мое приложение для выпуска другим людям? –

+0

Вы можете получить бинарные файлы 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. Я бы просто пошел с заранее построенным двоичным кодом. –

5

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

1

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