2013-09-19 2 views

ответ

27

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

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

c1 c1 c2 c2 c1 c2 c1 c2 ...

где c1 является образцом для канала 1 и c2 является образцом для канала2.

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

с1 с1 с1 с1 .... c2 c2 c2 c2 ..


теперь, как это его хранится в AVFrame:

  • для плоского аудио:

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

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

  • для неплоской аудио

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

+0

Если аудиоданные хранятся в данных [0] для непланарных форматов, означает ли это, что мы должны читать этот массив 16/24 бит за раз, до NULL? Как, каждый образец не получает собственный индекс массива, каждый индекс связан с каналом? поэтому это всего лишь один длинный список o образцов ... – MarcusJ

+2

Я предполагаю, что 'c1 c1 c2 c2' должен ссылаться на байты в буфере, а не на образцы. Следует либо изменить его на 'c1 c2 c1 c2' для образцов, либо обновить текст, чтобы сказать байты. – DuBistKomisch