Задержка перед записью последнего вывода файла сегмента HLS

Вопрос или проблема

Проблема:

Я использую ffmpeg для обрезки видео онлайн с сервера SRT (https://github.com/Haivision/srt) в HLS и отправляю данные сегментов на удаленный сервер. Это отправляет файлы .m3u8 и .ts с определенным интервалом во время трансляции. Но ffmpeg помещает последние сегменты только ПОСЛЕ того, как клиент отключается от SRT. Вот почему есть задержка при просмотре потока. Задержка такая же, как idle_streams_timeout (https://github.com/Edward-Wu/srt-live-server/wiki/Directives#idle_streams_timeout).

Что я пробовал:

Добавить параметры FFMPEG:

  • -i
  • flush_packets 1 (+ сохранение сегментных файлов на мой локальный компьютер)
  • hls_flags delete_segments
  • fflags nobuffer
  • flags low_delay

Что я делаю, что вызывает эту проблему:

Запускаю следующие команды:

ffmpeg -report -loglevel debug -i srt://{srt_url} -vcodec libx264 -preset veryfast -acodec aac -f hls -hls_time 4 -fflags flush_packets -method PUT {uploader_url}

или

ffmpeg -report -loglevel debug -i srt://{srt_url} -vcodec libx264 -preset veryfast -acodec aac -f hls -hls_time 4 -fflags flush_packets /path/to/segments/output.m3u8

В логах ffmpeg открывает последний сегментный файл (stream2.ts) только после “Все потоки завершены”:

...
[out/hls] Все потоки завершены
[out/hls] Завершение потока с кодом возврата 0 (успех)
[hls] Открытие 'http://127.0.0.1/api/streams/stream2.ts' для записи

Ответ или решение

Задержка перед записью последнего выходного файла сегмента HLS

Введение

Проблема, с которой вы столкнулись, заключается в том, что последняя часть сегмента HLS (.ts файл) создается только после завершения передачи потока в SRT, что приводит к задержке при просмотре. Это поведение связано с настройками ffmpeg и особенностями работы протокола SRT.

Описание проблемы

Вы используете ffmpeg для обработки видеопотока, получаемого через SRT, и стремитесь настроить его так, чтобы минимизировать задержку при записи последнего сегмента HLS. Однако, как показано в логах ffmpeg, последний файл (например, stream2.ts) открывается лишь после завершения всех потоков. Это связано с тем, что ffmpeg собирает буферированные данные перед их выводом, что ведет к тому, что итоговый сегмент создается только после завершения входящего потока. Ваша проблема усугубляется настройкой параметра idle_streams_timeout в SRT, который определяет время ожидания перед отключением неактивного потока.

Решения и рекомендации

Для уменьшения задержки при записи последнего HLS-сегмента вы можете рассмотреть следующие поправки и оптимизации:

  1. Использование параметров ffmpeg:

    • Убедитесь, что вы используете следующие параметры:
      -hls_flags append_list

      Этот флаг гарантирует, что ffmpeg продолжает добавлять сегменты в плейлист HLS до тех пор, пока поток активен.

  2. Настройка -hls_time:

    • Уменьшите значение параметра -hls_time до 2 или 1 секунды для более частой генерации сегментов. Хотя это увеличит количество файлов, оно сократит задержку при воспроизведении.
  3. Регулировка буферизации:

    • Попробуйте использовать -fflags nobuffer и -flags low_delay вместе с другими флагами. Это улучшит производительность за счет снижения времени буферизации, но может повлиять на стабильность потока, особенно при нестабильных сетевых соединениях.
  4. Обработка потока по протоколу RTP:

    • Если ваш поток позволяет это, переключитесь на использование RTP вместо SRT, так как RTP может лучше справляться с требованиями по минимизации задержек в реальном времени.
  5. Увеличение значения idle_streams_timeout:

    • Убедитесь, что параметр idle_streams_timeout не слишком мал, чтобы не прерывать передачи при неполном завершении потоков.

Заключение

Мы рекомендуем вам протестировать совокупность указанных выше параметров и настроек, чтобы минимизировать задержку при записи последнего сегмента HLS. С учетом нестабильности сетевого соединения SRT и особенностей работы ffmpeg, зачастую требуется поэкспериментировать с несколькими настройками, чтобы найти оптимальную конфигурацию для вашего сценария.

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

Оцените материал
Добавить комментарий

Капча загружается...