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

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

Ответ 1

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] будет содержать данные канала я (при условии, что канал 0 является первым каналом).

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

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

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