4

Я запускаю процесс ffserver на компьютере с Linux, чтобы добиться потоковой передачи видео через ffmpeg. Однако при потоковой передаче видео возникает задержка. В файле конфигурации ffserver я определяю Port 8090 .

Команда netstat -tulnap дает мне это:

root@beagleboard:/etc# netstat -tulnap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             Stat                                                                             e       PID/Program name
tcp        0      0 0.0.0.0:68                  0.0.0.0:*                   LIST                                                                             EN      654/pump
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LIST                                                                             EN      662/portmap
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LIST                                                                             EN      698/dropbear
tcp        0      0 0.0.0.0:8090                0.0.0.0:*                   LIST                                                                             EN      744/ffserver
tcp        0     52 192.168.1.104:22            192.168.1.111:10838         ESTA                                                                             BLISHED 724/dropbear
udp        0      0 0.0.0.0:514                 0.0.0.0:*                                                                                                            703/syslog-ng
udp        0      0 0.0.0.0:111                 0.0.0.0:*                                                                                                            662/portmap
udp        0      0 0.0.0.0:60628               0.0.0.0:*                                                                                                            709/avahi-daemon: r
udp        0      0 0.0.0.0:5353                0.0.0.0:*                                                                                                            709/avahi-daemon: r

Как вы можете видеть, процесс ffserver использует протокол tcp для передачи, и я подозреваю, что это является причиной задержки потокового видео. Как я могу заставить процесс использовать протокол или протокол UDP? Должен ли я изменить порт?

3 ответа3

22

Вы не можете просто заставить программу использовать UDP вместо TCP, не переписывая части самой программы. Эти протоколы слишком разные, чтобы быть взаимозаменяемыми.

  • TCP ориентирован на поток (получатель видит все как непрерывный поток в точном порядке, в котором его выводит отправитель); UDP ориентирован на дейтаграммы (каждая датаграмма отправляется в отдельном пакете, и они даже могут быть переупорядочены).

  • TCP имеет управление потоком, поэтому отправитель (или ОС отправителя) точно знает, как быстро он должен отправлять данные, не переполняя канал и не оказывая значительного влияния на другие соединения. UDP не делает ничего из этого - плохо "принудительная" программа может начать отправлять гигабайты данных в секунду по UDP, независимо от скорости соединения.

  • TCP имеет повторную передачу, поэтому, если пакет отброшен посередине (например, из-за того, что сеть перегружена или есть другие проблемы), он будет отправлен повторно. Если протокол зависит от надежного транспорта и вы заставляете его использовать UDP, соединение может полностью прекратиться, как только потеряется хотя бы один пакет. (И пакеты будут потеряны; см. Пункты № 1 и № 2 выше.)

6

Как уже упоминалось, UDP и TCP - это принципиально разные протоколы.

Однако, если вам нужно передавать данные по UDP вместо TCP, вы можете использовать инструмент ретрансляции, такой как socat. Вы можете настроить socat на прослушивание TCP-соединения и пересылать содержимое потока TCP в виде потока UDP на другой хост. Если другой хост ожидает TCP-трафик, вы можете использовать другой экземпляр ретранслятора для преобразования обратно в TCP. Это удалит повторные попытки и подтверждение поведения соединения хост-хост. Повторные попытки и подтверждения будут все еще присутствовать между локальным средством ретрансляции и локальным приложением, но вы вряд ли увидите повторы на локальной обратной связи.

Однако это вряд ли решит проблему с задержкой. Если ваше приложение построено на использовании TCP вместо UDP, оно может быть не терпимым к отброшенным пакетам, и в этом случае этот хак может вызвать нестабильное поведение.

3

Если вы не используете очень медленные соединения, проблема с задержкой, скорее всего, связана с вашим видеокодеком.

Чтобы эффективно сжимать видео, вам придется использовать предиктивные кодировки (см. Эту статью в Википедии).

Прогнозирующие кодировки в основном рассчитывают изображения из более ранних или более поздних изображений. Это имеет следующие последствия:

  1. Если вы используете много P-кадров (вычисленных из предыдущих кадров), вы получите задержку перед отображением видео начинается, потому что клиент должен ждать следующего полный видеокадра (I-кадр). Однако, как только поток установлен, вы можете смотреть видео относительно без задержек.

  2. Если вы используете B-кадры (рассчитанные по более ранним и более поздним изображениям), у вас будет действительно большая задержка: в дополнение к начальной задержке сверху, клиент должен ждать следующего I-кадра, чтобы начать воспроизведение с последнего I -Рамка. Это приведет к задержке (клиент проигрывает видео заметно позже, чем сервер записывает / отправляет его, часто на много секунд). Если вы кодируете видео на лету, у вас также будет задержка с сервера - ему нужно будет дождаться следующего I-кадра, чтобы отправить все, начиная с предыдущего I-кадра.

Для большинства кодеков вы можете настроить использование B- и P-кадров в соответствии с вашими потребностями, однако существует задержка компромисса и эффективность сжатия

Если у вас достаточно пропускной способности, вы также можете использовать кодек без B-/P-кадров, например, MJPEG.

Еще одной причиной задержки может быть буферизация на стороне проигрывателя, поэтому у вас не будет искажений, если есть нервная сетевая передача. Многие видеоплееры позволяют настраивать размеры буфера.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .