В чем разница между AV_SAMPLE_FMT_S16P и AV_SAMPLE_FMT_S16?

Что происходит, когда вы выполняете преобразование из AV_SAMPLE_FMT_S16P в AV_SAMPLE_FMT_S16? Как структура AVFrame будет содержать планарные и непланарные данные?


person Harit Vishwakarma    schedule 19.09.2013    source источник


Ответы (2)


AV_SAMPLE_FMT_S16P — это 16-битный звук с плоской подписью, т. е. 2 байта для каждого сэмпла, который одинаков для AV_SAMPLE_FMT_S16.

Единственное отличие состоит в том, что AV_SAMPLE_FMT_S16 сэмплов каждого канала чередуются, т.е. если у вас есть двухканальный звук, то буфер сэмплов будет выглядеть так:

c1 c2 c1 c2 c1 c2 c1 c2...

где c1 — образец для канала 1, а c2 — образец для канала 2.

в то время как для одного кадра планарного звука у вас будет что-то вроде

c1 c1 c1 c1 .... c2 c2 c2 c2 ..


как он хранится в AVFrame:

  • для планарного звука:

data[i] будет содержать данные канала i (при условии, что канал 0 является первым каналом).

однако, если у вас больше каналов, чем 8, то данные для остальных каналов можно найти в атрибуте extended_data AVFrame.

  • для непланарного звука

data[0] будет содержать данные для всех каналов в чередующемся порядке.

person Harit Vishwakarma    schedule 19.09.2013
comment
если аудиоданные хранятся в data[0] для непланарных форматов, означает ли это, что мы должны считывать этот индекс массива по 16/24 бита за раз, пока не будет NULL? Например, каждый образец не получает свой собственный индекс массива, вместо этого каждый индекс связан с каналом? так что это всего лишь один длинный список образцов... - person MarcusJ; 26.09.2014
comment
Я предполагаю, что c1 c1 c2 c2 должен относиться к байтам в буфере, а не к образцам. Следует либо изменить его на c1 c2 c1 c2 для образцов, либо обновить текст, чтобы сказать байты. - person DuBistKomisch; 20.09.2016
comment
Спасибо за этот ответ. Я несколько дней боролся с аудиоданными FFmpegs и созданием CMSampleBuffer через CMBlockBufferCreation. Ваш ответ был прорывом, в котором я нуждался. Если бы можно было проголосовать за ответ более одного раза, я бы проголосовал за него до Inf+. - person Darkwonder; 13.09.2019

  • В AV_SAMPLE_FMT_S16P данные поступают в виде decoded_frame-›extended_data, а в AV_SAMPLE_FMT_S16 данные поступают в виде decoded_frame-›data.

  • В AV_SAMPLE_FMT_S16P данные плоские

  • В AV_SAMPLE_FMT_S16 данные чередуются, я полагаю, вы знаете, что это значит.

Пример кода доступен в программном обеспечении на основе Sourceforge Libav.

person ricardospk__    schedule 14.10.2020