LINUX.ORG.RU

libavcodec: перекодирование аудио


0

0

как я понял из исходников libavcodec, каждый аудио кодек имеет своё значение frame_size которое зависит от числа каналов и частоты дискретизации (возможно ещё от чего-то, но это не принципиально). мне требуется перекодировать из mp3 в adpcm_swf.

1) у mp3'шного кодека (22050 Hz, mono, 64 kb/s) audioCodecCtx->frame_size равен 1152. функция avcodec_decode_audio2 при декодировании этим декодером возвращает frame_size_ptr равный 4608 (то есть, длина раскодированного фрейма равна 4608). 4608 = 1152 * 4. почему на 4?

2) у adpcm_swf кодека frame_size равен 1024. функция avcodec_encode_audio из буфера забирает количество байт равное frame_size * channels, то есть ровно 1024. в итоге получается что из 4608 байт каждого фрейма конечный кодек забирает только 1024. в результате на выходе я получаю прерывистый звук.

соответственно вопросы: почему mp3'шный кодек выдаёт аж 4608 байт вместо 1152, и как из этих 4608 сделать 1024 чтобы подавать на вход adpcm?

ps. исходники ffmpeg'а читал. =).


самое главное -- если кодировать adpcm_swf -> adpcm_swf одинаковой частоты дискретизации и числа каналов, то получается всё идеально. то есть, у меня проблема именно с длинами фреймов. правда, даже если декодировать из adcpm_swf то функция avcodec_decode_audio2 возвращает frame_size_ptr равный 2050 вместо ожидаемых мной 1024. но звук получается ровный. или эти frame_size'ы разные и не одно и то же значат? пойду ещё исходники почитаю...

stigger
() автор топика
Ответ на: комментарий от stigger

тьфу. извиняюсь жутко, совсем запутался. про 4608 забудьте. при декодировании mp3 с frame_size 1152 функция декодирования возвращает размер фрейма 1152, при декодировании adpcm с frame_size 1024 функция декодирования возвращает размер фрейма 2050.

не так фантастично как я описывал раньше, но всё равно не понятно.

stigger
() автор топика
Ответ на: комментарий от stigger

ух. у меня появилась идея! склеивать декодированные пакеты и скармливать нужными порциями encoder'у. в ffmpeg'е подсмотрел =)

stigger
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.