Пример кодирования звука libav из необработанного PCM в OGG Vorbis

В настоящее время я работаю над инструментом для преобразования игровых медиаресурсов из нескольких проприетарных форматов и преобразования их в более открытые форматы. Я пытаюсь использовать библиотеку libav http://libav.org/ для декодирования из формата WAV, mp3, ect в необработанный PCM std::vector<char> (сделано успешно), а затем закодировать его в ogg vorbis. Я пытаюсь использовать api-example.c в документации. https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decoding_encoding.c, но почти не продвинулся, так как я застрял там, где заканчивается генерация тона и начинается кодирование AVPacket.

Может ли кто-нибудь указать мне рабочий пример кодирования звука из необработанного файла PCM (или std::vector), который записывает в файл (предпочтительно ogg vorbis)?


person brad_c6    schedule 04.01.2013    source источник


Ответы (1)


Несколько вещей, которые вам нужно иметь в виду при кодировании аудио с помощью libav:

  1. Каков формат выборки PCM декодированного кадра (например, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP и т. д.)

  2. Сколько отсчетов на канал содержится в декодированном кадре.

  3. Каждый аудиокодер принимает только определенный тип формата образца, поэтому, если формат образца PCM не совпадает с форматом образца кодировщика, вам необходимо выполнить преобразование формата образца.

  4. Каждый аудиокодер принимает определенный номер. выборок на канал в кадре.

    например MP3 использует 1152 выборки на канал, aac-main/lc — 1024 выборки на канал, aac-he — 2048 выборок на канал. поэтому вам нужно выполнить некоторую буферизацию, чтобы обеспечить ожидаемое нет. выборок в кодировщик.

Чтобы выполнить преобразование образца формата, я бы посоветовал вам использовать swr_convert API, который находится внутри libswresample.

person Harit Vishwakarma    schedule 26.09.2013