Что происходит, когда вы выполняете преобразование из AV_SAMPLE_FMT_S16P в AV_SAMPLE_FMT_S16? Как структура AVFrame будет содержать плоские и непланарные данные?В чем разница между AV_SAMPLE_FMT_S16P и AV_SAMPLE_FMT_S16?
ответ
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] для непланарных форматов, означает ли это, что мы должны читать этот массив 16/24 бит за раз, до NULL? Как, каждый образец не получает собственный индекс массива, каждый индекс связан с каналом? поэтому это всего лишь один длинный список o образцов ... – MarcusJ
Я предполагаю, что 'c1 c1 c2 c2' должен ссылаться на байты в буфере, а не на образцы. Следует либо изменить его на 'c1 c2 c1 c2' для образцов, либо обновить текст, чтобы сказать байты. – DuBistKomisch