В настоящее время я работаю над инструментом, позволяющим конвертировать игровые медиа-ресурсы нескольких проприетарных форматов и преобразовывать их в более открытые форматы. Я пытаюсь использовать библиотеку 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)?
Несколько вещей, которые вы должны иметь в виду при кодировании аудио с использованием libav:
Каков пример формата pcm декодированного кадра (например, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP и т. Д.)
Сколько отсчетов на канал имеется в декодированном кадре.
Каждый аудиокодер использует только определенный тип формата семпла, поэтому, если формат семпла pcm не совпадает с форматом семпла кодера, чем вы должны выполнить преобразование формата семпла.
Каждый аудио кодер занимает определенное нет. выборок на канал в кадре.
например MP3 берет 1152 семпла на канал, aac-main / lc отбирает 1024 семпла на канал, а 2048 семплов на канал. поэтому вы должны сделать некоторую буферизацию, чтобы обеспечить ожидаемое нет. образцов в кодировщик.
Для того, чтобы сделать пример преобразования формата, я бы предложил вам использовать
API-интерфейс swr_convert, который находится внутри libswresample.
Других решений пока нет …