#c_sharp #cpp #алгоритм #сеть #аудио
Есть потребность в программе, которая позволит джемовать музыкантам по сети, и есть желание ее написать. Для этого требуется, чтобы доставка аудио (массивов байтов, размером около 1 кб) осуществлялась с минимальной задержкой (не больше 10 мс). Возможно ли добиться такого? Если да, то как? (Протокол передачи, сжатие, тип сети (p2p или сервер-клиент) и т.д.) Писать хотелось бы на C# или C++. UPD: интересует еще такой момент. Для уменьшения задержки думаю запаковывать данные в GZip. Скажите, пожалуйста, имеет ли это смысл? Я имею в виду, что не быстрее ли будет просто отсылать незапакованные данные, чем сначала запаковывать, отсылать, а потом распаковывать?
Ответы
Ответ 1
Сначала отвечу на вопросы, потом с позволения выскажу свое мнение по поводу затеи. Добиться задержек в 10 мс можно например при подключении точка-точка или в простой локальной сети. Но в вашем случае это почти не реально. Например, прямо сейчас у меня пинг до шлюза 75-80 мс. Кроме того что пакеты будут теряться, так еще они и доставляться будут с непостоянным временем, то есть будет джитер. Транспортный протокол однозначно UDP. Хотя есть еще CSTP, но у него ограниченная поддержка со стороны провайдеров, велика вероятность, что найдется узел который будет резать все что не UDP и не TCP. А в Виндоуз он вообще бедный родственник. По прикладному уровню рекомендую ознакомится с RTP. P2P как в битторенте, вам не поможет в случае если городская сеть жестко централизованна, что часто бывает в небольших городах. То есть если у провайдера один шлюз на всех и к нему централизованно сходятся все каналы от обывателей. Получится, что между участниками будет по одному каналу и битторент будет скорее проигрывать т.к. у него свои накладные тоже есть. Битторент нуждается в избыточных каналах тогда появляется возможность параллельной передачи, в чем и состоит его суть. Можно попробовать организовать P2P как в скайпе. Например, если среди трех участников окажется что 2 выгоднее быть посредником между 1 и 3, то можно назначить 2 сервером для 1 и 3. Тогда он должен будет передавать для 1: себя и 3, а для 2: себя и 1. Для большего количества участников понадобится подбирать посредников для каждого канала. То есть это задача на максимальный поток. Сжимать однозначно надо пробовать, но только не зипом, а аудио-кодеком. Велика вероятность что сжатие\разжатие можно будет делать аппаратно. Теперь мнение про затею. Почему вы вообще решили что задержки в 10 мс будет достаточно, музыка это тонкая вещь. Большим оркестром обычно управляет дирижер потому что музыканты просто не слышат друг-друга. Рекомендую вам присмотреться к радио.Ответ 2
Я конечно может не до конца разобрался в вопросе! Но тобы отправить данные которые не помещаются в один пакет UDP(TCP) c минимальными задержками и минимальной нагрузкой на сеть можно воспользоваться технологией отправки пула пакетов (SendQueue), реализованной в WinPcap(LibPcap). Вот здесь все популярно объяснено и с примерами на C# https://pcapdotnet.codeplex.com (раздел https://pcapdotnet.codeplex.com/SourceControl/latest#PcapDotNet.DevelopersPack/src/SendingPacketsUsingSendBuffer/Program.cs).
Комментариев нет:
Отправить комментарий