Как минимизировать задержку в прямом эфире с помощью ffmpeg

У меня проблема. Я хотел бы сделать прямой эфир с ffmpeg с моей веб-камеры.

  1. Я запускаю ffserver, и он работает.
  2. С другого терминала я запускаю ffmpeg для потоковой передачи с помощью этой команды, и она работает:

    sudo ffmpeg -re -f video4linux2 -i /dev/video0 -fflags nobuffer -an http://localhost:8090/feed1.ffm
    
  3. В моем файле конфигурации у меня есть этот поток:

    <Stream test.webm>
    Feed feed1.ffm
    Format webm
     NoAudio
     VideoCodec libvpx
     VideoSize 720x576
     VideoFrameRate 25
     # Video settings
        VideoCodec libvpx
        VideoSize 720x576           # Video resolution
        VideoFrameRate 25           # Video FPS
        AVOptionVideo flags +global_header  # Parameters passed to encoder 
                                        # (same as ffmpeg command-line parameters)
        AVOptionVideo cpu-used 0
        AVOptionVideo qmin 10
        AVOptionVideo qmax 42
        #AVOptionVideo quality good
        PreRoll 5
         StartSendOnKey
        VideoBitRate 400            # Video bitrate
     </Stream>
    
  4. Я запускаю поток с

    ffplay http: //192.168.1.2: 8090 / test.webm Это работает, но у меня задержка 4 секунды, и я бы хотел минимизировать эту задержку, потому что это важно для моего приложения. Спасибо

5 ответов

Вы можете попробовать эту команду

ffplay -fflags nobuffer -rtsp_transport tcp rtsp://<host>:<port>

или более прославленный, но экспериментальный:

ffplay -fflags nobuffer -flags low_delay -framedrop \
 -strict experimental -rtsp_transport tcp rtsp://<host>:<port>

или хакерский

ffplay  -probesize 32 -sync ext -rtsp_transport tcp rtsp://<host>:<port>

-rtsp_transport можно настроить как udp или же tcp согласно вашей трансляции. Для этого примера я использую tcp,

В руководстве по потоковой передаче FFMpeg есть специальный раздел о том, как уменьшить задержку. Я еще не попробовал все их предложения. http://ffmpeg.org/trac/ffmpeg/wiki/StreamingGuide

Они особо отмечают задержку, которую представляет ffplay:

По умолчанию, ffplay вводит небольшую задержку самостоятельно, также полезно mplayer с этими -nocache для тестирования задержки (или -benchmark). Использование SDL также позволяет просматривать кадры с минимальной задержкой: ffmpeg ... -f sdl -

Попробуй установить flags из AVFormatContext в AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS

AVFormatContext *ctx;
...
ctx->flags = AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS;

Затем попытайтесь установить поток декодера в 1. Кажется, что больше потока вызовет большую задержку.

AVCodecContext *ctx;
...
ctx->thread_count = 1;

Рассмотрите возможность использования опции фильтра -vf setpts=0. Это позволяет отображать все кадры как можно скорее, не добавляя задержки для частоты кадров. Это позволит потоку наверстать упущенное в случае отставания, что, как я обнаружил, происходит, если я перемещаю или изменяю размер окна ffplay. Однако это может привести к тому, что видео будет выглядеть прерывистым, если ваши видеоданные будут приниматься с непостоянной скоростью.

для меня задержка решена путем передачи -tune zerolatency

      ffmpeg -f rawvideo -i /dev/video0 -preset slow -tune zerolatency -pix_fmt yuv420p -c:v libx264 -f rawvideo /tmp/pipe.h264

сделал качество векторов движения немного хуже, но задержка была для меня важнее, так что...

Другие вопросы по тегам