FFmpeg — как обеспечить задержку отбрасывания кадров >1 [с]?

#ffmpeg #streaming #live-streaming #low-latency #mpv

#ffmpeg #потоковая передача #прямая трансляция #низкая задержка #mpv

Вопрос:

Я использую ffmpeg и mpv для потоковой передачи аудио / видео между двумя хостами. Один из хостов отправляет поток с помощью ffmpeg:

 ffmpeg -f pulse            
       -thread_queue_size 0 
       -i audioInput         
       -f video4linux2        
       -thread_queue_size 0    
       -standard PAL            
       -i videoInput             
       -vcodec mpeg4              
       -r 10                       
       -s 176x144                   
       -maxrate 256K                 
       -acodec pcm_s16le              
       -ar 8000                        
       -b:a 32k                         
       -af aresample=async=1000          
       -f rtsp                            
       -rtsp_transport tcp                 
    url
  

и второй хост получает mpv:

 mpv url --rtsp-transport=tcp             
        --profile=low-latency             
        --demuxer-lavf-o=rtsp_flags=listen 
        --no-cache                          
        --autosync=30                        
        --no-demuxer-thread                   
        --demuxer-lavf-analyzeduration=0       
        --demuxer-lavf-probesize=32
  

Я перепробовал множество опций и комбинаций, чтобы максимально уменьшить задержку. Вышеуказанные команды работают хорошо, задержка при запуске составляет < 1 с. К сожалению, иногда задержка появляется во время потоковой передачи, и она может даже увеличиваться со временем. Моя цель — обеспечить, чтобы задержка была более или менее постоянной (близкой к 1 с), и если появится некоторая задержка, задержанные кадры будут отброшены (даже если это повлияет на качество аудио или видео).

Как заставить ffmpeg / mpv отбрасывать кадры, которые задерживаются, например, более 1 секунды?

Комментарии:

1. Я абсолютно не эксперт в этом, но я просто не уверен, что вы используете протокол tcp. Afaik переключение на udp может очень помочь, поскольку задержки вполне могут исходить от отправителя, ожидающего пакетов подтверждения, которые являются частью протокола tcp и которые информируют отправителя о сообщении, что оно прибыло. udp не ожидает этих подтверждений.

2. @olidem спасибо, вы правы, это был один из вариантов, которые я уже тестировал. К сожалению, при использовании udp потери пакетов слишком высоки, а качество видео и звука неприемлемо.