Получить образец в треморе
Я должен использовать тремор для декодирования ogg vorbis в моем проекте из-за гораздо более простой интеграции (для использования в ESP-32). Его доки говорит:
Он возвращает до указанного количества байтов декодированного звука в формате end-host, подписанный 16-битный формат PCM. Если звук многоканальный, каналы чередуются в выходном буфере.
...
Подпись: long ov_read (OggVorbis_File * vf, char * buffer, int length, int * bitstream);
Теперь я запутался в том, как читать 16-битные подписанные сэмплы из массива char. Должен ли я следовать некоторым советам отсюда Конвертировать 2 символа в 1 int или сделать что-то другое?
1 ответ
Итерируйте буфер двумя элементами одновременно. Поскольку данные представлены в формате с прямым порядком байтов (согласно документации), вы можете напрямую представить два символа в виде 16-разрядного целого числа со знаком, в данном случае "short"
long numBytesRead = ov_read(vf, buffer, length, bitstream); //length is typically 4096
if( numBytesRead > 0 )
{
for(int i=0; (i+1)<numBytesRead; i=i+2)
{
unsigned char high = (unsigned char)buffer[i];
unsigned char low = (unsigned char)buffer[i + 1];
int16_t var = (int16_t)( (low << 8) | high );
//here var is signed 16 bit integer.
}
}