Was ist mit FFMPEG die leichteste Möglichkeit, ein überwiegend statisches Bild zu streamen? (im Hinblick auf die Bandbreite)

Was ist mit FFMPEG die leichteste Möglichkeit, ein überwiegend statisches Bild zu streamen? (im Hinblick auf die Bandbreite)

Ich möchte einen radioähnlichen Stream für YouTube oder Twitch optimieren, der einen Fortschrittsbalken enthält, der 5 Mal pro Sekunde aktualisiert wird. Abgesehen von diesem Fortschrittsbalken sind die anderen Teile des Videos statisch. Etwa alle 10 Minuten wechselt der Stream zu einem neuen Titel und der gesamte Bildschirm sollte sich ändern.

Um es ganz deutlich zu machen, hier ein paar Abbildungen, wie der Bildschirm aussehen sollte.

Der Anfang des Tracks würde so aussehen:

+++++++++++++++++++++++++++++
+  First track name         +
+                ,          +
+  BG n⁰1     _ `|.         +
+            /o`=|          +
+     .=""=./::(.=""=.      +
+    /./.' .::::. \'. \     +
+   //\/ / :::::: \/\ \\    +
+  /\/ /\/\'::::'/\ \/\ \   +
+  /' `     '::'     ` `\   +
+           /::\            +
+          /\/\/\           +
+                           +
+  Progress-bar is below    +
+  |                   |    +
+                           +
+++++++++++++++++++++++++++++

Für etwa 10 Minuten würde sich nur der Fortschrittsbalken ändern:

+++++++++++++++++++++++++++++
+  First track name         +
+                ,          +
+  BG n⁰1     _ `|.         +
+            /o`=|          +
+     .=""=./::(.=""=.      +
+    /./.' .::::. \'. \     +
+   //\/ / :::::: \/\ \\    +
+  /\/ /\/\'::::'/\ \/\ \   +
+  /' `     '::'     ` `\   +
+           /::\            +
+          /\/\/\           +
+                           +
+  Progress-bar is below    +
+  |==========         |    +
+                           +
+++++++++++++++++++++++++++++

Wenn der Titel nach 10 Minuten endet, sollte das Gesamtbild geändert werden und einen neuen Hintergrund anzeigen:

+++++++++++++++++++++++++++++
+  Second track name        +
+                           +
+  (the whole screen        +
+   should have refreshed)  +
+                           +
+  BG n⁰2        ,-.        +
+        ,      ( {o\       +
+        {`"=,___) (`~      +
+         \  ,_.-   )       +
+    ~^~^~^`- ~^ ~^ '~^~    +
+                           +
+                           +
+  Progress-bar is below    +
+  |                   |    +
+                           +
+++++++++++++++++++++++++++++

Um zur eigentlichen Frage zu kommen, ich habe derzeit eine Lösung, die mit diesem ffmpeg-Befehl funktioniert:

 ffmpeg -f x11grab -s "1280x720" -i :99.0+0,0 -f pulse -i default -f flv \
   -vcodec libx264 -b:v 1000k -maxrate 1360k -bufsize 1360k -g 60 -tune stillimage \
   -s "1280x720" -preset veryfast -vf "format=yuv420p" \
   "rtmp://SERVER_EITHER_YOUTUBE_OR_TWITCH/STREAM_KEY"

Allerdings führt diese Lösung zu einem relativ hohen Bandbreitenverbrauch:

  • für eine Sekunde erfolgt der Upload mit einer Rate von ~ 900-1000 KB/s
  • für eine Sekunde erfolgt der Upload mit einer Rate von ~ 1500-1600 KB/s

Dieses Muster ist in der Ausgabe von a zu sehen nload -t 100, wobei jedes Zeichen 100 ms entspricht:

Device eth0 [xyz.xyz.xyz.xyz] (1/1):
====================================================================================
Incoming:
                                                               Curr: 60.77 kBit/s
                                                               Avg: 72.08 kBit/s
                                                               Min: 52.23 kBit/s
                                                               Max: 252.88 kBit/s
                                                               Ttl: 118.24 GByte
Outgoing:

   #||||..|||          #|.|||..|#          #|..|...|#          Curr: 1002.47 kBit/s
   ##########          ##########          ##########          Avg: 1.24 MBit/s
|#|##########.||||##|||##########.||#||##|.##########..||..||  Min: 749.30 kBit/s
#############################################################  Max: 8.83 MBit/s
#############################################################  Ttl: 92.46 GByte

Ich habe versucht, die Bitrate zu reduzieren, aber dann wird das Bild merklich blockig.

In einer idealen Weltwürde dieser Stream mit zehnmal weniger Bandbreite durchgeführt werden:

  • ein Bild des Bildschirms (ca. 100 kB im PNG-Format), das alle 2 Sekunden als Keyframe hochgeladen wird
  • und ansonsten weniger als 100 kB/s zur Übertragung des Audios und der kleinen Änderungen im Fortschrittsbalken

Die Frage ist also:Gibt es eine FFMPEG-Einstellung, die mit den Einschränkungen von Streaming-Diensten (ein Keyframe alle 2 Sekunden) kompatibel ist und mit der eine geringere Bandbreite bei gleichbleibend hoher Qualität erreicht werden kann?




BEARBEITENIch habe versucht, die Option zu verwenden -crf 23. Der ffmpeg-Befehl lautete folgendermaßen:

 ffmpeg -f x11grab -s "1280x720" -i :99.0+0,0 -f pulse -i default -f flv \
   -vcodec libx264 -crf 23 -g 60 -tune stillimage \
   -s "1280x720" -preset veryfast -vf "format=yuv420p" \
   "rtmp://SERVER_EITHER_YOUTUBE_OR_TWITCH/STREAM_KEY"

Positiv ist, dass die Bandbreite tatsächlich abgenommen hat, was eine Verbesserung darstellt. Aber ich sehe immer noch dieses rechteckige Signal, mit einer Sekunde geringer Bandbreitennutzung bei 300 KB/s und einer Sekunde hoher Nutzung bei 1300 KB/s.

 Device eth0 [xyz.xyz.xyz.xyz] (1/1):                                                 
 =================================================================================
 Incoming:
                                                                 Curr: 76.65 kBit/
                                                                 Avg: 76.11 kBit/s
                                                                 Min: 10.08 kBit/s
                                                                 Max: 9.78 MBit/s
                                                                 Ttl: 118.88 GByte
 Outgoing:
 
                                                                 Curr: 1.26 MBit/s
  ||||||||||          |||||||||          ||||||||||          ||  Avg: 1.09 MBit/s
  ##########          ##########         ##########          ##  Min: 55.66 kBit/s
  ##########         |##########         ##########          ##  Max: 10.86 MBit/s
 ####################################|||#######################  Ttl: 103.00 GByte

verwandte Informationen