Вопрос или проблема
Проблема:
Я использую 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, все еще наблюдается, что последний сегмент открыт только после завершения всех потоков, что является корнем вашей проблемы.
Рекомендации по оптимизации
-
Использование параметра
-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
-
Изменение интервала сегментации: Попробуйте уменьшить значение параметра
-hls_time
. Например, снизив интервал до 2 секунд, вы повысите частоту создания сегментов, что также может уменьшить задержку:-hls_time 2
-
Параметр
-hls_list_size
: Убедитесь, что вы устанавливаете-hls_list_size
в позитивное значение (например, 0 для бесконечной длины), чтобы ffmpeg не ожидал завершения потока для обновления плейлиста.-hls_list_size 0
-
Использование
-hls_flags single_file
: При указании этого флага ffmpeg будет записывать результат в один файл, что также может уменьшить задержку, так как нет необходимости создавать несколько файлов для каждого отдельного сегмента. -
Обратите внимание на версии ffmpeg и SRT: Используйте последние стабильные версии обоих пакетов. Обновления могут содержать оптимизации и исправления, которые могут улучшить производительность.
-
Переключение на более производительный кодек: Если это возможно, попробуйте использовать более быстрые кодеки или предустановки, такие как
-preset ultrafast
, чтобы минимизировать задержки при сжатии. -
Проверка сетевой инфраструктуры: Убедитесь, что ваша сетевое подключение не является узким местом. Задержки могут быть вызваны не только настройками ffmpeg, но и проблемами с сетью.
Заключение
Используя вышеописанные методы, вы сможете значительно сократить время, необходимое для записи последнего сегмента HLS в вашей системе потокового видео. Этот подход не только улучшит задержку, с которой сталкиваются ваши зрители, но и повысит общее качество предоставляемого контента. Оптимизация процессов видеостриминга — это ключ к успешному предоставлению видеопотока, и внимание к деталям здесь играет решающую роль.