Двухканальное кодирование опуса ⇐ C++
-
Гость
Двухканальное кодирование опуса
Я уже некоторое время использую библиотеку opus, в основном используя моноканальный звук. Однако я работал над двухканальным звуком и пытался заставить его работать с opus. Сначала я думал, что это будет довольно просто, потому что я просто увеличиваю количество каналов в функции opus_encoder_create и увеличиваю размер кадра в функции opus_encode. Однако, когда я кодирую звук, все, что я получаю, — это беспорядочная мешанина, которая выглядит как сумма двух сигналов. Входными данными являются данные PCM, чередующиеся по каждой выборке (L1, R1, L2, R2, .. LN, RN). Я не знаю, как действовать. Буду признателен за любые советы или примеры кода.
До сих пор я пытался предоставить данные в виде (L1, L2,.. LN, R1, R2, ... RN), и когда я делаю это как таковые, звук становится разборчивым, но два канала по-прежнему поврежден, и я не считаю, что это правильный подход.
Вот пример того, как я выполняю преобразование
#define NUM_CHANNELS 2 #define SAMPLE_RATE 8000 #define FRAME_SIZE 960 #define OUTPUT_FRAME_BYTES FRAME_SIZE / 8 int main(void) { внутренняя ошибка; Опусэнкодер *энкодер; int16_t pcm_data[FRAME_SIZE * NUM_CHANNELS]; uint8_t compressed_data[OUTPUT_FRAME_BYTES * NUM_CHANNELS]; в то время как (истина) { /* Собираем двухканальные данные PCM с микрофона и чередуем pcm_data[0] = выборка левого канала 1 pcm_data[1] = выборка правого канала 1 pcm_data[2] = выборка левого канала 2 pcm_data[3] = выборка правого канала 2 ... pcm_data[FRAME_SIZE * NUM_CHANNELS - 2] = выборка FRAME_SIZE левого канала pcm_data[FRAME_SIZE * NUM_CHANNELS - 1] = выборка правого канала FRAME_SIZE */ кодер = opus_encoder_create(8000, NUM_CHANNELS, OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err); opus_encoder_ctl (кодировщик, OPUS_SET_COMPLEXITY (0)); opus_encode(кодер, pcm_data, FRAME_SIZE, compressed_data, OUTPUT_FRAME_BYTES * NUM_CHANNELS); // Записываем сжатые данные в файл opus_encoder_destroy (кодировщик); } вернуть 0; }
Я уже некоторое время использую библиотеку opus, в основном используя моноканальный звук. Однако я работал над двухканальным звуком и пытался заставить его работать с opus. Сначала я думал, что это будет довольно просто, потому что я просто увеличиваю количество каналов в функции opus_encoder_create и увеличиваю размер кадра в функции opus_encode. Однако, когда я кодирую звук, все, что я получаю, — это беспорядочная мешанина, которая выглядит как сумма двух сигналов. Входными данными являются данные PCM, чередующиеся по каждой выборке (L1, R1, L2, R2, .. LN, RN). Я не знаю, как действовать. Буду признателен за любые советы или примеры кода.
До сих пор я пытался предоставить данные в виде (L1, L2,.. LN, R1, R2, ... RN), и когда я делаю это как таковые, звук становится разборчивым, но два канала по-прежнему поврежден, и я не считаю, что это правильный подход.
Вот пример того, как я выполняю преобразование
#define NUM_CHANNELS 2 #define SAMPLE_RATE 8000 #define FRAME_SIZE 960 #define OUTPUT_FRAME_BYTES FRAME_SIZE / 8 int main(void) { внутренняя ошибка; Опусэнкодер *энкодер; int16_t pcm_data[FRAME_SIZE * NUM_CHANNELS]; uint8_t compressed_data[OUTPUT_FRAME_BYTES * NUM_CHANNELS]; в то время как (истина) { /* Собираем двухканальные данные PCM с микрофона и чередуем pcm_data[0] = выборка левого канала 1 pcm_data[1] = выборка правого канала 1 pcm_data[2] = выборка левого канала 2 pcm_data[3] = выборка правого канала 2 ... pcm_data[FRAME_SIZE * NUM_CHANNELS - 2] = выборка FRAME_SIZE левого канала pcm_data[FRAME_SIZE * NUM_CHANNELS - 1] = выборка правого канала FRAME_SIZE */ кодер = opus_encoder_create(8000, NUM_CHANNELS, OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err); opus_encoder_ctl (кодировщик, OPUS_SET_COMPLEXITY (0)); opus_encode(кодер, pcm_data, FRAME_SIZE, compressed_data, OUTPUT_FRAME_BYTES * NUM_CHANNELS); // Записываем сжатые данные в файл opus_encoder_destroy (кодировщик); } вернуть 0; }
Мобильная версия