Удалить каналы из PCM

Я расширил «libtinyalsa» (очень маленькая версия ALSA) методом передискретизации входящего и исходящего PCM-аудио (с помощью libresample, например, с 48 кГц до 44,1 кГц).

Теперь я хотел бы расширить его с помощью метода "downMixing" (это правильное слово?).

У меня 5.1-канальный PCM, и мне просто нужен 2-канальный стереозвук (левый и правый):

  • "downMixing" правильное слово?
  • как я могу сделать это в C?

У меня нет реальных знаний о C и PCM - простые ответы были бы очень кстати.

С уважением и заранее спасибо!


person Martin L.    schedule 04.02.2013    source источник


Ответы (2)


5.1 ИКМ может быть уже закодирован таким образом, что эффективно микшируется до 2 каналов. Если это так, вы должны просто игнорировать каналы 5.1 и рассматривать их как два канала. Если это так, но вам нужно избавиться от всех следов 5.1 PCM, а не просто правильно воспроизводить их на 2-канальном выходе, вам нужно сначала использовать библиотеку 5.1-канального декодера.

Если у вас действительно есть подлинный 5.1-канальный кодированный выход, то вы получите его следующим образом:

for(i = 0; i < buffer_end; i += 6) {
    front_left = buffer[i + 0];
    front_right = buffer[i + 1];
    center = buffer[i + 2];
    lfe = buffer[i + 3]; // (sub-woofer)
    back_left = buffer[i + 4];
    back_right = buffer[i + 5];
}

Тогда миксдаун будет таким:

left = (front_left + back_left)/2 + (lfe + front_center)/4;
right = (front_right + back_right)/2 + (lfe + front_center)/4;

которые будут чередоваться таким же образом, т.е.

output_buffer[i] = left;
output_buffer[i + 1] = right;

Обратите внимание, что существуют разные способы микширования, в зависимости от желаемых результатов и ваших ограничений. Но это целая банка червей.

Вы также должны спросить себя, действительно ли вы используете правильный инструмент для работы. Существуют библиотеки, которые делают все эти вещи, и ALSA сама по себе уже способна к довольно сложному микшированию. См. здесь некоторые другие решения: http://www.halfgaar.net/surround-sound-in-linux

person user2040142    schedule 04.02.2013
comment
Спасибо за ваши примеры, это хорошее начало. попытаю удачу :) - person Martin L.; 05.02.2013

Я считаю, что понижающее микширование потока 5.1 PCM в стерео можно сделать примерно так:

L = clamp((FL + RL + C*0.708 + LFE*0.708) / 2) 
R = clamp((FR + RR + C*0.708 + LFE*0.708) / 2)

Вы можете сослаться, например. на эффект понижающего микширования в Android для примера.

Или просто выберите два канала, которые вы сохраните (например, FL и FR), и пропустите сэмплы из других каналов.

person Michael    schedule 04.02.2013
comment
Большое спасибо за Android-пример, я думаю, он может мне помочь. - person Martin L.; 05.02.2013