Как декодированные аудиоданные хранятся в ffmpeg AVFrame? - PullRequest
0 голосов
/ 21 декабря 2018

Я ищу разъяснения о том, как ffmpeg хранит декодированные аудиоданные в кадрах, прежде чем я начну писать код для микширования звука.AVFrame имеет int format и uint8_t* data[] членов.Если мое понимание верно, то байты в data должны быть приведены к правильному типу для format перед началом работы с ним.Таким образом, чтобы сделать простое повышение уровня в 2 раза, если format == AV_SAMPLE_FMT_S16, я бы:

int16_t* audio_samples = frame->data[0];
int num_samples = frame->nb_samples * frame->channels;
for (int i = 0; i < num_samples; ++i) {
  audio_samples[i] = audio_samples[i] * 2;
}

Это правильный путь?

1 Ответ

0 голосов
/ 25 декабря 2018

Ваше понимание аудио кажется правильным.Для форматов пакетов, таких как 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).

Я не могу сказать, что ваш код в цикле совершенно неправильный, это может на самом деле работать, но проблема в том, что существует потенциальный риск переполнения, вам нужно реализовать насыщение, чтобы исправить это.

Надеюсь, это поможет.

...