Questão Erro RTMP WriteN usando NVENC enquanto libx264 funciona bem via ffmpeg


Eu estou tentando executar alguns testes de transcodificação para descobrir o quão bem o ffmpeg funciona em alguns servidores de GPU que temos.

Da minha área de trabalho estou enviando um fluxo RTMP via OBS para um sistema de servidor de mídia que estamos executando. Eu então iniciei o ffmpeg com argumentos para puxar esse feed do servidor de mídia e empurrá-lo de volta para um ponto de ingestão diferente naquele 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 significa um teste básico básico sem fazer nenhuma conversão significativa e funciona perfeitamente. Eu consigo inscrever-me no rtmp: // server / live / matt-test1 e ver meu vide out.

No entanto, quando altero a 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, isso me dá o erro WriteN, RTMP send error 104 (136 bytes). Os metadados que o ffmpeg vê deste 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 a 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 eu sou capaz de usar com sucesso NVENC para puxar para baixo o vídeo e empurrá-lo de volta sem nenhum problema. 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, eu compilei o FFMPEG usando as instruções de http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdf, e o começo 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

Eu tentei alterar minhas configurações de OBS uma de cada vez (versões multi-plataforma e não multiplataforma) sem sucesso. Puxar de outros streams parece causar a mesma coisa, e o único stream que eu consegui puxar, transcodificar e re-empurrar via RTMP (via NVENC) parece ser aquele que se origina direto do FFMPEG.

Alguém tem alguma sugestão sobre o que pode estar errado? Existe algo no meu fim que está causando o rtmp a falhar ou é um bug no codificador NVENC?


1


origem




Respostas: