Вопрос или проблема
Проблема:
Я использую 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-сегмента вы можете рассмотреть следующие поправки и оптимизации:
-
Использование параметров ffmpeg:
- Убедитесь, что вы используете следующие параметры:
-hls_flags append_list
Этот флаг гарантирует, что ffmpeg продолжает добавлять сегменты в плейлист HLS до тех пор, пока поток активен.
- Убедитесь, что вы используете следующие параметры:
-
Настройка
-hls_time
:- Уменьшите значение параметра
-hls_time
до 2 или 1 секунды для более частой генерации сегментов. Хотя это увеличит количество файлов, оно сократит задержку при воспроизведении.
- Уменьшите значение параметра
-
Регулировка буферизации:
- Попробуйте использовать
-fflags nobuffer
и-flags low_delay
вместе с другими флагами. Это улучшит производительность за счет снижения времени буферизации, но может повлиять на стабильность потока, особенно при нестабильных сетевых соединениях.
- Попробуйте использовать
-
Обработка потока по протоколу RTP:
- Если ваш поток позволяет это, переключитесь на использование RTP вместо SRT, так как RTP может лучше справляться с требованиями по минимизации задержек в реальном времени.
-
Увеличение значения
idle_streams_timeout
:- Убедитесь, что параметр
idle_streams_timeout
не слишком мал, чтобы не прерывать передачи при неполном завершении потоков.
- Убедитесь, что параметр
Заключение
Мы рекомендуем вам протестировать совокупность указанных выше параметров и настроек, чтобы минимизировать задержку при записи последнего сегмента HLS. С учетом нестабильности сетевого соединения SRT и особенностей работы ffmpeg, зачастую требуется поэкспериментировать с несколькими настройками, чтобы найти оптимальную конфигурацию для вашего сценария.
Наблюдение за логами и их анализ помогут выявить наиболее эффективные параметры настройки и исключить возможные конфликты. Также подумайте о использованной инфраструктуре и провайдерах услуг, которые могут влиять на производительность потоковой передачи.