
Ich versuche, einige Transcodierungstests durchzuführen, um herauszufinden, wie gut ffmpeg auf einigen unserer GPU-Server funktioniert.
Von meinem Desktop aus sende ich einen RTMP-Stream über OBS an ein Medienserversystem, das wir betreiben. Dann habe ich ffmpeg mit Argumenten gestartet, um diesen Feed vom Medienserver abzurufen und ihn an einen anderen Aufnahmepunkt auf diesem Server zurückzuschicken. Mit libx264 rufe ich es beispielsweise folgendermaßen auf:
ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec libx264 -ar 44100 -f flv "rtmp://server/live/matt-test1"
Dies ist als grundlegender Test ohne sinnvolle Konvertierung gedacht und funktioniert einwandfrei. Ich kann mich bei rtmp://server/live/matt-test1 anmelden und mein Video ansehen.
Wenn ich jedoch libx264 in nvec ändere:
ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec nvenc -ar 44100 -f flv "rtmp://server/live/matt-test1"
Nach etwa 70-90 Frames erhalte ich den Fehler WriteN, RTMP send error 104 (136 bytes)
. Die Metadaten, die ffmpeg aus diesem Video erkennt, sind:
Metadata:
Server NGINX RTMP (github.com/arut/nginx-rtmp-module)
width 1920.00
height 1080.00
displayWidth 1920.00
displayHeight 1080.00
duration 0.00
framerate 30.00
fps 30.00
videodatarate 0.00
videocodecid 0.00
audiodatarate 0.00
audiocodecid 0.00
profile
level
Input #0, live_flv, from 'rtmp://server/live/matt-input live=1':
Metadata:
Server : NGINX RTMP (github.com/arut/nginx-rtmp-module)
displayWidth : 1920
displayHeight : 1080
fps : 30
profile :
level :
Duration: 00:00:00.00, start: 4.736000, bitrate: N/A
Stream #0:0: Video: h264 (High), 3 reference frames, yuv420p(tv, bt709/bt709/iec61966-2-1), 1920x1080 (1920x1088) [SAR 1:1 DAR 16:9], 30.30 fps, 30 tbr, 1k tbn, 60 tbc
Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp
Es scheint, dass NVENC eine gewisse Inkompatibilität mit RTMP hat, die libx264 nicht hat. Es ist auch interessant zu bemerken, dass ich, wenn ich ffmpeg verwende, um das Big Buck Bunny-Video zu kodieren und es hochzuladen rtmp://server/live/matt-input
, NVENC problemlos verwenden kann, um das Video herunterzuziehen und wieder hochzuladen. Zur Referenz: Das BBB-Video wird von FFMPEG wie folgt angezeigt:
Metadata:
Server NGINX RTMP (github.com/arut/nginx-rtmp-module)
width 1920.00
height 1080.00
displayWidth 1920.00
displayHeight 1080.00
duration 0.00
framerate 60.00
fps 60.00
videodatarate 0.00
videocodecid 7.00
audiodatarate 125.00
audiocodecid 1.00
profile
level
Input #0, live_flv, from 'rtmp://server/live/matt-input live=1':
Metadata:
Server : NGINX RTMP (github.com/arut/nginx-rtmp-module)
displayWidth : 1920
displayHeight : 1080
fps : 60
profile :
level :
Duration: 00:00:00.00, start: 1.950000, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(tv), 1920x1080 [SAR 1:1 DAR 16:9], 62.50 fps, 60 tbr, 1k tbn, 120 tbc
Stream #0:1: Audio: adpcm_swf, 44100 Hz, stereo, s16, 352 kb/s
Falls es hilft, ich habe FFMPEG kompiliert, gemäß den Anweisungen vonhttp://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdf, und der Anfang der ffmpeg-Ausgabe sieht so aus:
# ffmpeg -i "rtmp://server/live/matt-input live=1" -vcodec nvenc -ar 44100 -f flv "rtmp://server/live/matt-test1"
ffmpeg version N-76538-gb83c849 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04)
configuration: --enable-nonfree --enable-nvenc --enable-nvresize --extra-cflags=-I../cudautils --extra-ldflags=-L../cudautils --enable-gpl --enable-libx264 --enable-librtmp
libavutil 55. 5.100 / 55. 5.100
libavcodec 57. 15.100 / 57. 15.100
libavformat 57. 14.100 / 57. 14.100
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 15.100 / 6. 15.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Ich habe versucht, meine OBS-Einstellungen einzeln zu ändern (sowohl Multiplattform- als auch Nicht-Multiplattform-Versionen), aber ohne Erfolg. Das Abrufen von anderen Streams scheint dasselbe zu verursachen, und der einzige Stream, den ich abrufen, transkodieren und dann über RTMP (über NVENC) erneut pushen konnte, scheint einer zu sein, der direkt von FFMPEG stammt.
Hat jemand Vorschläge, was falsch sein könnte? Liegt es an mir, dass RTMP fehlschlägt, oder ist es ein Fehler im NVENC-Encoder?