Вопрос или проблема
Я работаю над настройкой потоковой передачи DASH с низкой задержкой, где моя цель – достичь времени запуска близкого к 1.5 секунды. Вот текущая конфигурация:
Инструмент потоковой передачи: FFmpeg
Обслуживание запросов: Nginx
UI Плеер: DASH.js
Ниже моя команда FFmpeg:
ffmpeg -loglevel debug -probesize 32 -analyzeduration 0 -i udp://127.0.0.1:6311?buffer-size=1310172 \
-fflags +nobuffer -flags low_delay -err_detect ignore_err \
-c:v copy -b:v:0 1000k -b:v:1 2000k -c:a copy \
-keyint_min 10 -g 10 -sc_threshold 0 \
-movflags +frag_keyframe+empty_moov+default_base_moof \
-pix_fmt yuv420p -preset ultrafast -tune zerolatency \
-use_template 1 -use_timeline 0 -streaming 1 \
-adaptation_sets "id=0,seg_duration=1.0,streams=v id=1,seg_duration=1.0,streams=a" \
-flags +global_header -format_options "movflags=cmaf" \
-live 1 -ldash 1 -write_prft 1 -target_latency 1.0 \
-http_persistent 1 -f dash /path/manifest.mpd
Проблемы, с которыми я сталкиваюсь:
1> Задержка при запуске: Несмотря на все вышеуказанные оптимизации, мое время запуска все еще слегка превышает целевое значение ~1.5 секунды.
2> Сегментированная передача данных (CTE): FFmpeg записывает в .tmp файлы до завершения операции. Это затрудняет доступ к данным в реальном времени для потоковой передачи. Есть ли способ включить сегментированную передачу данных (CTE), чтобы смягчить эту проблему, особенно при использовании длительности сегментов больше 1 секунды?
Вопросы:
1> Есть ли какие-либо улучшения или настройки, которые я могу сделать в команде FFmpeg, чтобы дополнительно уменьшить задержку при запуске?
2> Как я могу включить сегментированную передачу данных (CTE), чтобы я мог использовать более длительные сегменты (>1 секунда) без увеличения задержки?
Ответ или решение
Для достижения минимальной задержки старта (~1.5 секунды) в вашей системе потоковой передачи DASH, важно тщательно проанализировать текущую конфигурацию и внести необходимые коррективы. Давайте рассмотрим несколько рекомендаций для улучшения производительности вашего потока.
1. Оптимизация команды FFmpeg
Ваш текущий FFmpeg в значительной мере нацелен на минимизацию задержек, однако некоторые аспекты можно улучшить:
-
Параметры сегментации: Убедитесь, что параметры сегментирования максимально эффективны. Попробуйте уменьшить
seg_duration
до 0.5 секунд, если это допустимо в вашем контексте. Это позволит вам быстрее полностью занять буфер и начать воспроизведение. -
Оптимизация параметров
movflags
: Вместо использованияmovflags=cmaf
, попробуйте ознакомиться с параметрами для новых версий FFmpeg, поскольку некоторые из них могут способствовать дальнейшему снижению задержки. -
Скорость кодирования: Вы уже используете
-preset ultrafast
и-tune zerolatency
. Также рекомендуется увеличить-g
до 20 или 30, чтобы контролировать интервал между кадрами для потоков с низкой задержкой, что может быть более продуктивным в зависимости от типа содержания.
2. Включение Chunked Transfer Encoding (CTE)
Для обеспечения возможности потоковой передачи с использованием CTE без увеличения задержки, следуйте данным рекомендациям:
-
Измените способ записи в .tmp файлы: Используйте параметр
-f dash
, чтобы обеспечить генерацию потока более адаптивно, выходя за рамки статической записи файла. Это повысит вероятность мгновенного доступа к данным. -
Параллельная обработка: Возможность одновременной обработки текущих сегментов может помочь уменьшить задержку. Рассмотрите варианты использования
-streaming 1
и-mpd_flags +single_file
, чтобы упростить работу с локальными сегментами и активировать Workflow для параллельной записи и чтения. -
Настройка Nginx: Убедитесь, что ваш Nginx конфигурирован для поддержки CTE, добавляя в конфигурацию
chunked_transfer_encoding on;
. Также рекомендуется оптимизировать настройки буфера и выравнивание для более эффективного управления сегментами.
3. Общие рекомендации
-
Сетевые настройки: Убедитесь в низком уровне задержки сети между потоковым сервером и клиентом. Использование протокола UDP для передачи видео также может дополнительно снизить задержки.
-
Клиентская сторона: Обратите внимание на настройки DASH.js. Возможно, включение таких параметров, как
initializationSegment
,minBufferTime
, а также оптимизация межсегментных пауз в воспроизведении помогут повысить производительность. -
Конкретные тестирования: Проведите тесты идентированными — настройте каждую метрику по отдельности, чтобы исключить влияние сторонних факторов на итоговую задержку при старте.
Эти шаги помогут вам существенно снизить задержку старта при потоковой передаче DASH и приблизить её к желаемым 1.5 секундам. Настройка каждой составляющей системы, включая сервера, кодеры и клиентские проигрыватели, играет критическую роль в обеспечении минимальной задержки и оптимального пользовательского опыта.