I am trying to run some transcoding tests to figure out how well ffmpeg works on some GPU servers we have.
From my desktop I am sending up an RTMP stream via OBS to a media server system we have running. I then started ffmpeg with arguments to pull that feed from the media server and push it back to a different ingestion point on that server. So for example with libx264 I am invoking it with the following:
ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec libx264 -ar 44100 -f flv "rtmp://server/live/matt-test1"
This is meant as a bare bones basic test without doing any meaningful conversion, and it works perfectly. I"m able to subscribe to rtmp://server/live/matt-test1 and see my vide out.
However, when I change libx264 to nvec:
ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec nvenc -ar 44100 -f flv "rtmp://server/live/matt-test1"
After about 70-90 frames it gives me the error WriteN, RTMP send error 104 (136 bytes). The metadata that ffmpeg sees from this video is:
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
It appears that NVENC has some incompatibility when it comes to rtmp that libx264 does not have. It's also interesting to note that if I use ffmpeg to encode the big buck bunny video and send it up to rtmp://server/live/matt-input, then I am able to successfully use NVENC to pull down the video and push it back up no problem. For reference, the BBB video is seen by FFMPEG as:
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
If it helps I compiled FFMPEG using the instructions from http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdf, and the beginning of the ffmpeg output looks like:
# 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
I have tried changing my OBS settings one at a time (both multi-platform and non-multiplatform versions) to no avail. Pulling from other streams seems to cause the same thing to happen, and the only stream I've been able to pull, transcode, then re-push via RTMP (via NVENC) seems to be one that originates straight from FFMPEG
Does anyone have any suggestions on what might be wrong? Is there something on my end that is causing rtmp to fail or is it a bug in the NVENC encoder?