it-swarm.com.de

So minimieren Sie die Verzögerung bei einem Live-Streaming mit ffmpeg

ich habe ein Problem ... Ich würde ein Live-Streaming mit ffmpeg von meiner Webcam durchführen. 

  1. Ich starte den ffserver und es funktioniert.
  2. 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
    
  3. 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>
    
  4. 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

19
Pasquale C.

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 ist mplayer mit ihrem -nocache zum Testen der Latenzzeit (oder -benchmark). Mit dem SDL-Ausgang werden auch Frames mit minimaler Latenzzeit betrachtet: ffmpeg ... -f sdl -

14
Glen Blanchard

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;
2
wdanxna

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.

0
Teocci