2016-09-05 2 views
4

Я пытаюсь выяснить, как FFmpeg сохраняет данные в AVFrame после того, как звук был декодирован.FFmpeg AVFrame Audio Data Modification

В принципе, если я печатаю данные в массиве AVFrame->data[], я получаю несколько беззнаковых 8-битных целых чисел, которые являются аудио в необработанном формате.

Из того, что я могу понять из FFmpeg doxygen, формат данных выражается в enum AVSampleFormat и существует 2 основные категории: чередующиеся и плоские. В чередующемся типе данные хранятся в первой строке массива AVFrame->data с размером AVFrame->linesize[0], тогда как в планарном типе каждый канал аудиофайла хранится в отдельной строке массива AVFrame->data, а массивы имеют размер AVFrame->linesize[0].

Есть ли руководство/учебник, в котором объясняется, что означают числа в массиве для каждого из форматов?

ответ

2

Значения в каждом из массивов (плоскостей) data являются фактическими образцами звука в соответствии с указанным форматом. Например. если формат равен AV_SAMPLE_FMT_S16P, это означает, что массивы data на самом деле являются массивами int16_t Данные PCM. Если мы имеем дело с монофоническим сигналом - только data[0] действителен, если он стерео - data[0] и действительны, и так далее.

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

+0

Если массив в 'AVFrame.h' объявлен как' uint8_t', то как 'AVFrame-> data' содержать' int16_t'? – Arlind

+0

Просто используйте cast: 'int16_t * pcm16 = (int16_t *) frame-> data [0]'. – Sergio

+0

Является ли каждый из элементов массива в 'AVFrame-> data', представляющим 1 образец аудио? – Arlind

Смежные вопросы