ffmpeg streaming zu rtmp mit 30 fps

727
user6326558

Ich versuche, meinen Desktop mithilfe eines Screen-Capture-Recorders auf den facebook RTMP-Server zu streamen:

ffmpeg -re -rtbufsize 256M -f dshow -i audio="Mikrofon (Realtek Audio)"  -rtbufsize 256M -f dshow -i audio="virtual-audio-capturer"  -rtbufsize 1024M -f dshow -i video=screen-capture-recorder -r 30  -filter:v scale=1280:720 -c:v h264_nvenc -pix_fmt yuv420p -preset fast  -b:v 8M -maxrate:v 10M -c:a aac -b:a 128k -ar 44100  -f flv rtmp://live-api.facebook.com:80/rtmp/.............. 

Ich verwende den h264_nvenc-Codec für die gpu-Beschleunigung, aber ich kann nur mit 12-18 fps zu RTMP streamen. Wenn ich jedoch in eine Datei streame:

ffmpeg -re -rtbufsize 256M -f dshow -i audio="Mikrofon (Realtek Audio)"  -rtbufsize 256M -f dshow -i audio="virtual-audio-capturer"  -rtbufsize 1024M -f dshow -i video=screen-capture-recorder -r 30  -filter:v scale=1280:720 -c:v h264_nvenc -pix_fmt yuv420p -preset fast  -b:v 8M -maxrate:v 10M -c:a aac -b:a 128k -ar 44100  D:\test.mp4 -y 

Ich bekomme ohne Probleme 30 fps, auch wenn ich Spiel spiele (z. B. Call of Duty 6, ziemlich HW-Entleerung).

Auch wenn das Streaming (in rtmp) beginnt, bekomme ich nach einiger Zeit diesen Fehler, obwohl meine -rtbufsize-Größe 1024M beträgt, was ich für ziemlich groß halte, und viele Frames gehen verloren:

real-time buffer too full or near too full! frame dropped! 

Können Sie mir helfen, wie man den rtbufsize-Fehler verhindert, und ist es möglich, meinen Befehl so zu ändern, dass ich mit 30 fps zu rtmp streamen kann? Vielen Dank

Bei Bedarf ist meine ffmpeg-Build-Konfiguration:

ffmpeg Version 3.3.3 Copyright (c) 2000-2017 die FFmpeg-Entwickler, die mit gcc 7.1.0 (GCC) -Konfiguration erstellt wurden:--disable-static --enable-shared --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 - -enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo- amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg--enable-lzma --enable-zlib

0

1 Antwort auf die Frage

0
user3052786

Zu Beginn würde ich die Einzelperson -rtbufsizefür jede Eingabe verlieren . Wenn ffmpeg hinterherhinkt, wird die Erhöhung des Echtzeitpuffers nicht helfen, es sei denn, Sie versuchen, gelegentliche Spitzen zu beseitigen. Ich bin mir nicht sicher, wie viel Spielraum ffmpeg für Windows reserviert, aber ich denke, man kann davon ausgehen, dass es bei einer Framerate von 12 Bildern pro Sekunde bei einer auf 30 eingestellten Framerate für die Bildwiederholrate nie aufholen wird. Im Grunde nimmt er bis zu 1 GB des Screenshots auf, um ihn später zu codieren, und fungiert als Puffer von vielleicht einer Minute, möglicherweise kürzer, bevor Frames fallen.

Sie sagten, Sie könnten ohne Probleme mit 30 Bildern pro Sekunde speichern, daher ist es wahrscheinlich die Geschwindigkeit beim Hochladen auf Facebook. Sie müssen also die Ausgabe im Grunde kleiner machen.

Ich bin mir ziemlich sicher, dass ffmpeg alle Eingaben standardmäßig als 25fps liest. Wenn Sie also die Ausgabe auf 25fps statt auf 30 setzen, wird Ihre FPS wahrscheinlich auf über 20 kostenlos erhöht. Ich bin mir nicht sicher, wie dshow funktioniert, daher kann ich mich irren, wenn Sie wirklich 30 Bilder pro Sekunde wollen.

und ich habe gerade bemerkt, dass Sie sich -b:v 8Mfür den Encoder entschieden haben ... ist das für Ihre Internetverbindung realistisch? Viele ISPs werden die Uploads für Privatkunden drosseln, so dass Sie möglicherweise nicht mehr als 3-4 MBit / s erreichen können, insbesondere wenn Sie Live-Streams nutzen möchten.

Sie möchten -preset=slowoder verwenden, mediumwenn Sie eine Voreinstellung verwenden möchten . Für den Hardware-Encoder ist dies möglicherweise etwas anderes. Daher sollten Sie die Optionen überprüfen. Da die Netzwerkgeschwindigkeit jedoch der Engpass ist, können Sie nicht viel tun, wenn Sie Echtzeit-Streaming wünschen. Das Video muss also in der Framerate kleiner sein Auflösung oder Komprimierung.