Уменьшить задержку с помощью FFplay для HDMI-кодеров | Exvist Support

FAQ: Уменьшение задержки с помощью FFplay для кодировщика

Пошаговое руководство по снижению задержки с помощью FFplay

1. Установите FFmpeg и FFplay

Убедитесь, что FFmpeg (включающий FFplay) установлен в вашей системе. Проверить установку можно, выполнив:
  1. ffplay -version
Если он не установлен, вы можете скачать и установить FFmpeg софициального сайтаили использовать менеджер пакетов, напримерapt or brewв зависимости от вашей операционной системы.

2. Откройте FFplay с RTSP-потоком

Начните с запуска FFplay с URL вашего RTSP-потока:
  1. ffplay rtsp://192.168.1.120:554/live/1_0
Заменитеrtsp://192.168.1.120:554/live/1_0на фактический RTSP-URL вашего видеокодера.

3. Настройте размер буфера

Уменьшите размер буфера по умолчанию, чтобы минимизировать задержку. Используйте флаг -rtsp_transport для выбора транспортного протокола (TCP или UDP). UDP обычно обеспечивает более низкую задержку.
Пример команды:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 rtsp://192.168.1.120:554/live/1_0
Пояснение:
  1. -rtsp_transport udp: Принудительно использует транспорт UDP, который обычно обеспечивает более низкую задержку, чем TCP.
  2. -fflags nobuffer: Отключает буферизацию для снижения задержки.
  3. -analyzeduration 0: Ограничивает время, затрачиваемое FFplay на анализ потока, что помогает быстрее начать воспроизведение.
  4. -probesize 32: Ограничивает объём данных, используемых для зондирования потока, что также снижает задержку.

4. Настройте задержку видеовыхода

Используйте флаг -sync для настройки синхронизации видео. Установка значения video заставляет FFplay синхронизироваться с видеопотоком, что может помочь снизить задержку.
Пример команды:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0

5. Уменьшение буферизации видео и аудио

Отключите или сведите к минимуму воспроизведение звука с помощью -vn (без видео) или настройте размеры аудиобуфера с помощью -an (без аудио), если звук не нужен для теста.
Пример:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an rtsp://192.168.1.120:554/live/1_0

6. Точная настройка параметров декодирования

Добавьте параметры для оптимизации производительности декодирования и минимизации задержки. Например:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an -flags low_delay rtsp://192.168.1.120:554/live/1_0

7. Дополнительные оптимизации (необязательно)

Вы можете дополнительно настроить FFplay, используя флаги -x и -y для указания размера окна видео, а также -framedrop для отбрасывания кадров, если они не могут быть обработаны достаточно быстро:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an -framedrop -flags low_delay -x 640 -y 360 rtsp://192.168.1.120:554/live/1_0
Пояснение:
  1. -framedrop: Отбрасывает кадры, когда система не успевает декодировать, уменьшая буферизацию.
  2. -x 640 -y 360: Указывает разрешение для воспроизведения видео, снижая нагрузку на декодирование.

Пример итоговой команды

  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an -framedrop -flags low_delay -x 640 -y 360 rtsp://192.168.1.120:554/live/1_0

8. Мониторинг задержки

После настройки следите за воспроизведением, чтобы наблюдать снижение задержки. Вы можете использовать такие инструменты, как FFprobe, для измерения задержки в реальном времени путём проверки деталей потока.
Пример команды FFprobe для проверки статистики потока:
  1. ffprobe -v quiet -print_format json -show_streams rtsp://192.168.1.120:554/live/1_0
Используя приведённые выше команды и настраивая различные флаги, вы можете эффективно снизить задержку при тестировании RTSP-потока с вашего видеокодера.

Пошаговое руководство по дальнейшему снижению задержки с помощью FFplay

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

1. Настройки буферизации (неправильная корректировка буфера)

Флаг-fflags nobufferпредназначен для минимизации буферизации, но в некоторых случаях это может привести к нестабильности или увеличению задержки, особенно если условия сети не идеальны. FFplay может с трудом обрабатывать кадры плавно без достаточного буфера, что вызывает дополнительные задержки при воспроизведении.

Решение: Попробуйте изменить стратегию буферизации. Вместо полного отключения буферизации можно использовать более консервативную настройку буфера или удалить флаг-fflags nobuffer:

  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0

2. Транспортный протокол RTSP (UDP против TCP)

Переключение наUDPобычно быстрее, чем TCP, для потоковой передачи RTSP, но может привести к потере пакетов или джиттеру в определённых сетевых условиях, что заставляет декодер задерживать обработку. Если сеть нестабильна, использованиеUDPможет непреднамеренно увеличить задержку, так как FFplay пытается компенсировать потерянные или повреждённые пакеты.

Решение: Протестируйте с транспортомTCPи проверьте, улучшится ли задержка. Используйте флаг-rtsp_transport tcpчтобы принудительно включить TCP:
ffplay -rtsp_transport tcp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0

3. Сброс кадров

Флаг-framedropуказывает FFplay отбрасывать кадры, если он не успевает их декодировать вовремя, что должно снизить задержку. Однако если отбрасывается слишком много кадров, это может привести к увеличению задержек, так как FFplay может дольше восстанавливаться и ресинхронизироваться.

Решение: Если сброс кадров чрезмерен, попробуйте удалить флаг-framedropили уменьшить его влияние:
  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0
В качестве альтернативы можно попробовать изменить поведение -framedrop, чтобы проверить, поможет ли это снизить задержку:
  1. ffplay -framedrop 0 -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0

4. Сетевые условия и джиттер

TheUDPтранспорт может быть неидеальным в сети с высокой задержкой или нестабильной сетью. UDP не гарантирует доставку пакетов, что может приводить к джиттеру и задержкам буферизации на стороне клиента. Хотя UDP может снизить задержку в идеальных сетевых условиях, он часто вызывает больше проблем при нестабильности сети или перегрузке.

Решение: Проверьте работу в стабильной и менее загруженной сети или вернитесь кTCPесли в вашей сети высокий джиттер или потеря пакетов.

5. Перегрузка декодера

Если-flags low_delayфлаг используется вместе с большими видеопотоками или более высокими разрешениями, это может привести к перегрузке декодера, когда FFplay пытается декодировать кадры слишком быстро, что может вызвать дополнительные задержки обработки.

Решение: Уменьшите разрешение видео, чтобы снизить нагрузку на декодер, или отключите флаги низкой задержки, если они вызывают проблемы:
  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video -an rtsp://192.168.1.120:554/live/1_0

6. Чрезмерный анализ и зондирование

Флаги-analyzeduration 0и-probesize 32предназначены для ограничения времени, которое FFplay тратит на анализ потока, и размера начального зондирования пакетов, что должно ускорить запуск. Однако, если эти значения слишком ограничительны, это может заставить FFplay работать с неполной информацией, что приведет к задержкам синхронизации или увеличению общей задержки, поскольку он пытается восстановиться после отсутствующих данных.

Решение: Увеличьте значения-analyzedurationи-probesizeнемного, чтобы позволить FFplay собрать больше данных при запуске без значительного увеличения задержки:
  1. ffplay -rtsp_transport udp -analyzeduration 5000000 -probesize 5000000 -sync video rtsp://192.168.1.120:554/live/1_0

7. Режим синхронизации видео

The-sync videoФлаг указывает FFplay синхронизировать видеокадры точно, что может вызывать задержки, когда ему нужно ждать следующий кадр. Если выходная частота кадров кодера плохо согласуется с ожиданиями синхронизации FFplay, это может приводить к ненужным задержкам.

Решение: Вы можете поэкспериментировать с синхронизацией поаудио or метке временивместо видео:
  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync audio rtsp://192.168.1.120:554/live/1_0
Кроме того, полное удаление флага -sync может помочь:
  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 rtsp://192.168.1.120:554/live/1_0

Заключение:

Чтобы уменьшить задержку, поэкспериментируйте с балансировкой стратегии буферизации, транспортного протокола и настроек декодирования. UDP обычно обеспечивает более низкую задержку, но требует стабильной сети, тогда как TCP может быть более надёжным, если качество сети нестабильно. Настройка размеров буфера, поведения зондирования и параметров отбрасывания кадров также может помочь снизить чрезмерную задержку. Продолжайте тестировать различные конфигурации, чтобы найти оптимальную настройку для вашего конкретного случая использования.