Как минимизировать задержку запуска в DASH трансляции (~1.5 секунды)?

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

Я работаю над настройкой потоковой передачи 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. Общие рекомендации

  1. Сетевые настройки: Убедитесь в низком уровне задержки сети между потоковым сервером и клиентом. Использование протокола UDP для передачи видео также может дополнительно снизить задержки.

  2. Клиентская сторона: Обратите внимание на настройки DASH.js. Возможно, включение таких параметров, как initializationSegment, minBufferTime, а также оптимизация межсегментных пауз в воспроизведении помогут повысить производительность.

  3. Конкретные тестирования: Проведите тесты идентированными — настройте каждую метрику по отдельности, чтобы исключить влияние сторонних факторов на итоговую задержку при старте.

Эти шаги помогут вам существенно снизить задержку старта при потоковой передаче DASH и приблизить её к желаемым 1.5 секундам. Настройка каждой составляющей системы, включая сервера, кодеры и клиентские проигрыватели, играет критическую роль в обеспечении минимальной задержки и оптимального пользовательского опыта.

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

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