Недавно я пытался транслировать живое видео, снятое веб-камерой, по UDP. Подход, который я использовал, заключался в том, чтобы прочитать один кадр, отправить его по udp, прочитать данные на стороне получателя и отобразить их.
Теперь я понимаю, что отправка данных по udp/tcp приводит к фрагментации, которая происходит случайным образом в зависимости от MTU транспортного уровня, а базовый IP-протокол не гарантирует количество кадров, которые будут доставлены. Минимальный MTU любого уровня данных считается равным 1500 байтам.
Однако каждый мой кадр имеет размер 1 МБ (~ 1048576 байт). Таким образом, учитывая фрагментацию данных в 1500 байт, один кадр может быть фрагментирован, и получатель получит около 700 пакетов (1048576/1500). Теперь приемнику нужно собрать данные всех этих 700 пакетов всего за один кадр, что требует дополнительной обработки. Это что-то нормальное, 700 пакетов всего за 1 кадр данных!!. Если я хочу сохранить частоту кадров всего 24 кадра в секунду, это означает, что приемник должен обрабатывать 700 * 24 = 16800 пакетов в секунду, что кажется невыполнимым.
Я хочу понять, как работают другие потоковые сайты, они точно не обрабатывают 16800 пакетов данных в секунду. Они будут использовать другие протоколы потоковой передачи, такие как RTSP, однако они построены поверх UDP/TCP, что означает, что этот протокол также должен обрабатывать фрагментацию. В наши дни потоковые веб-сайты могут передавать видео в формате 4K, и размер каждого кадра будет намного больше 1 МБ, но MTU по-прежнему составляет 1500 байт. Они также должны выполнять сжатие данных, но в какой степени. Даже если им каким-то образом удастся уменьшить размер кадра на 50% (что также необходимо распаковать на стороне получателя, что означает дополнительную обработку), им все равно потребуется обрабатывать ~ 8000 пакетов данных в секунду для видео низкого качества с частотой 24 кадра в секунду. Как они с этим справляются, как справляются с фрагментацией данных в таких масштабах.