LINUX.ORG.RU

консольная аудиоконференция на С++ через ALSA

 , , ,


0

1

Есть у кого практика разработки аудиоконференции аля Skype? Подскажите литературку путёвую, или может собственным опытом поделитесь? Задача: написать аудиоконференцию без всяких Qt, на голом C++, максимум клиентов 5. Сервер многопоточный на pthred'ах как я понимаю лучше делать, а вот как и что делать со звуком не пойму: то ли микшировать на сервере, то ли просто всё ложить в кучу и раздавать клиентам, но, чувствую, что ни то, ни другое - всё не правильно. И разобраться бы вообще в каком виде аудиоданные ALSA ложит в буфер (и как достать эти данные).

Глянь сорцы Mumble/Murmur. У них Qt, но почерпнешь, мож, что-нить полезное.

DeadEye ★★★★★
()

на голом C++ ... многопоточный на pthred'ах как я понимаю лучше

странно ты понимаешь, бо std::thread

anonymous
()

Гонять потоки через сервер неэффективно, растут задержки. Если уж не хочешь заморачиваться с SIP (а зачем еще тебе тогда может потребоваться свой сервер?), то сервер должен заниматься исключительно вопросами соединения пользователей. Каждый клиент должен направлять свои данные всем остальным участникам конференции. Идеально это делать через UDP multicast, но в некоторых ситуациях этот вариант не подходит, тогда отдельно каждому через unicast. Микшированием соответственно занимается клиент-получатель.
Вообще рекомендую ознакомиться для начала хотя бы со следующими терминами:
SIP, RTP, jitter buffer, эхоподавление, аудиокодек, ресэмплинг.
Если для тебя это все слишком непонятно и сложно, из готового можешь посмотреть на проект pjsip.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 2)
Ответ на: комментарий от m0rph

Идеально это делать через UDP multicast

Который не работает примерно в 99% случаев.

сервер должен заниматься исключительно вопросами соединения пользователей

Которые опять-таки в огромном количестве случаев сидят за непробиваемым NAT-ом. Гоняние тишины между всеми клиентами опять-таки заслуживающая отдельного порицания ситуация.

В простейшем случае, если ни у кого из клиентов «сеть не тормозит», конференция выглядит так: прочитал N байт от каждого клиента, выбрал min(N), смикшировал для каждого клиента свой поток (сложение с насыщением всех сигналов кроме сигнала от этого клиента), отправил. А дальше решаешь проблемы по мере поступления. И поступит их столько, что лучше уже сейчас задуматься на тему поиска готового решения.

kawaii_neko ★★★★
()
Ответ на: комментарий от m0rph

Как раз в данном случае эффективно (man MCU). И звонки будут идти не непосредственно между клиентами, а между клиентами и MCU. Необходимо будет готовить по потоку для каждого из клиентов (для каждого смешивать все каналы, кроме его собственного).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.