
Estou tentando executar alguns testes de transcodificação para descobrir quão bem o ffmpeg funciona em alguns servidores GPU que temos.
Do meu desktop, estou enviando um fluxo RTMP via OBS para um sistema de servidor de mídia que estamos executando. Em seguida, iniciei o ffmpeg com argumentos para extrair esse feed do servidor de mídia e enviá-lo de volta para um ponto de ingestão diferente nesse servidor. Então, por exemplo, com libx264 estou invocando-o com o seguinte:
ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec libx264 -ar 44100 -f flv "rtmp://server/live/matt-test1"
Isso é um teste básico básico, sem fazer nenhuma conversão significativa, e funciona perfeitamente. Posso me inscrever em rtmp://server/live/matt-test1 e ver meu vídeo.
No entanto, quando mudo libx264 para nvec:
ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec nvenc -ar 44100 -f flv "rtmp://server/live/matt-test1"
Depois de cerca de 70-90 quadros, ocorre o erro WriteN, RTMP send error 104 (136 bytes)
. Os metadados que o ffmpeg vê neste vídeo são:
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
Parece que o NVENC tem alguma incompatibilidade quando se trata de rtmp que a libx264 não possui. Também é interessante notar que se eu usar o ffmpeg para codificar o vídeo do big buck bunny e enviá-lo para rtmp://server/live/matt-input
, então poderei usar o NVENC com sucesso para baixar o vídeo e empurrá-lo de volta sem problemas. Para referência, o vídeo BBB é visto pelo FFMPEG como:
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
Se ajudar, compilei o FFMPEG usando as instruções dehttp://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdf, e o início da saída do ffmpeg se parece com:
# 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
Tentei alterar minhas configurações de OBS uma de cada vez (versões multiplataforma e não multiplataforma) sem sucesso. Extrair de outros fluxos parece fazer com que a mesma coisa aconteça, e o único fluxo que consegui extrair, transcodificar e reenviar via RTMP (via NVENC) parece ser aquele que se origina diretamente do FFMPEG
Alguém tem alguma sugestão sobre o que pode estar errado? Há algo do meu lado que está causando falha no rtmp ou é um bug no codificador NVENC?