Ваше понимание аудио кажется правильным.Для форматов пакетов, таких как AV_SAMPLE_FMT_S16
, вам нужно только AVFrame::data[0]
для плоских форматов, таких как AV_SAMPLE_FMT_FLTP
, вам понадобятся и другие индексы.
AV_SAMPLE_FMT_S16
- это 16-битный формат со знаком, что означает, что каждый отдельный образец находится между -32768, + 32767.
Итак, в вашем случае у вас уже есть то, что вам нужно:
int16_t *audio_samples = frame->data[0]
: это ваш текущий буфер аудиоданных.
num_samples = frame->nb_samples * frame->channels
: num_samples
здесьРазмер этого буфера (блок s16).
Я не могу сказать, что ваш код в цикле совершенно неправильный, это может на самом деле работать, но проблема в том, что существует потенциальный риск переполнения, вам нужно реализовать насыщение, чтобы исправить это.
Надеюсь, это поможет.