ich habe ein Problem ... Ich würde ein Live-Streaming mit ffmpeg von meiner Webcam durchführen.
Von einem anderen Terminal aus starte ich ffmpeg zum Streamen mit diesem Befehl Und es funktioniert:
Sudo ffmpeg -re -f video4linux2 -i /dev/video0 -fflags nobuffer -an http://localhost:8090/feed1.ffm
In meiner Konfigurationsdatei habe ich diesen Stream:
<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>
Ich starte den Stream mit
ffplay http: //192.168.1.2: 8090/test.webm Es funktioniert, aber ich habe eine Verzögerung von 4 Sekunden und ich würde diese Verzögerung minimieren, da dies für meine Anwendung wesentlich ist
Die Streaming-Anleitung von FFMpeg enthält einen speziellen Abschnitt zum Reduzieren der Latenz. Ich habe noch nicht alle ihre Vorschläge ausprobiert. http://ffmpeg.org/trac/ffmpeg/wiki/StreamingGuide#Latency
Sie machen eine besondere Notiz über die Latenzzeit, die ffplay einführt:
Standardmäßig führt
ffplay
eine kleine Latenzzeit ein. Ebenfalls nützlich istmplayer
mit ihrem-nocache
zum Testen der Latenzzeit (oder-benchmark
). Mit dem SDL-Ausgang werden auch Frames mit minimaler Latenzzeit betrachtet:ffmpeg ... -f sdl -
Versuchen Sie, flags
von AVFormatContext
auf AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS
Zu setzen.
AVFormatContext *ctx;
...
ctx->flags = AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS;
Versuchen Sie dann, den Decoder-Thread auf 1 zu setzen. Es scheint, als würde mehr Thread mehr Latenz verursachen.
AVCodecContext *ctx;
...
ctx->thread_count = 1;
Sie können diesen Befehl ausprobieren
ffplay -fflags nobuffer -rtsp_transport tcp rtsp://<Host>:<port>
oder eine wohlwollendere, aber experimentellere:
ffplay -fflags nobuffer -flags low_delay -framedrop \
-strict experimental -rtsp_transport tcp rtsp://<Host>:<port>
oder der Hacker:
ffplay -probesize 32 -sync ext -rtsp_transport tcp rtsp://<Host>:<port>
Der -rtsp_transport
kann je nach Streaming als udp
oder tcp
eingerichtet werden. Für dieses Beispiel verwende ich tcp
.