Ускорьте запись последнего файла сегмента 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 при использовании ffmpeg

Проблема

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

Анализ текущих настроек

Вы уже применили несколько параметров ffmpeg, которые помогут в решении проблемы:

  • -i — указание входного потока.
  • flush_packets 1 — моментальное завершение пакетной передачи.
  • hls_flags delete_segments — удаление сегментов, что может ускорить поток.
  • fflags nobuffer — избегание буферизации.
  • flags low_delay — минимизация задержек при кодировании.

Однако, при запуске команд ffmpeg, все еще наблюдается, что последний сегмент открыт только после завершения всех потоков, что является корнем вашей проблемы.

Рекомендации по оптимизации

  1. Использование параметра -hls_flags append_list: этот параметр может помочь в том, что программное обеспечение будет обновлять индексный файл .m3u8 в реальном времени, а не дожидаться завершения потока перед записью последнего сегмента.

    ffmpeg -report -loglevel debug -i srt://{srt_url} -vcodec libx264 -preset veryfast -acodec aac -f hls -hls_time 4 -hls_flags append_list -fflags flush_packets /path/to/segments/output.m3u8
  2. Изменение интервала сегментации: Попробуйте уменьшить значение параметра -hls_time. Например, снизив интервал до 2 секунд, вы повысите частоту создания сегментов, что также может уменьшить задержку:

    -hls_time 2
  3. Параметр -hls_list_size: Убедитесь, что вы устанавливаете -hls_list_size в позитивное значение (например, 0 для бесконечной длины), чтобы ffmpeg не ожидал завершения потока для обновления плейлиста.

    -hls_list_size 0
  4. Использование -hls_flags single_file: При указании этого флага ffmpeg будет записывать результат в один файл, что также может уменьшить задержку, так как нет необходимости создавать несколько файлов для каждого отдельного сегмента.

  5. Обратите внимание на версии ffmpeg и SRT: Используйте последние стабильные версии обоих пакетов. Обновления могут содержать оптимизации и исправления, которые могут улучшить производительность.

  6. Переключение на более производительный кодек: Если это возможно, попробуйте использовать более быстрые кодеки или предустановки, такие как -preset ultrafast, чтобы минимизировать задержки при сжатии.

  7. Проверка сетевой инфраструктуры: Убедитесь, что ваша сетевое подключение не является узким местом. Задержки могут быть вызваны не только настройками ffmpeg, но и проблемами с сетью.

Заключение

Используя вышеописанные методы, вы сможете значительно сократить время, необходимое для записи последнего сегмента HLS в вашей системе потокового видео. Этот подход не только улучшит задержку, с которой сталкиваются ваши зрители, но и повысит общее качество предоставляемого контента. Оптимизация процессов видеостриминга — это ключ к успешному предоставлению видеопотока, и внимание к деталям здесь играет решающую роль.

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

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