Как минимизировать задержку в прямом эфире с помощью ffmpeg
У меня проблема. Я хотел бы сделать прямой эфир с ffmpeg с моей веб-камеры.
- Я запускаю ffserver, и он работает.
С другого терминала я запускаю ffmpeg для потоковой передачи с помощью этой команды, и она работает:
sudo ffmpeg -re -f video4linux2 -i /dev/video0 -fflags nobuffer -an http://localhost:8090/feed1.ffm
В моем файле конфигурации у меня есть этот поток:
<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>
Я запускаю поток с
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
сделал качество векторов движения немного хуже, но задержка была для меня важнее, так что...