libx264 は ffmpeg 経由では正常に動作するが、NVENC を使用すると RTMP WriteN エラーが発生する

libx264 は ffmpeg 経由では正常に動作するが、NVENC を使用すると RTMP WriteN エラーが発生する

私たちが所有するいくつかの GPU サーバーで ffmpeg がどの程度うまく機能するかを調べるために、いくつかのトランスコーディング テストを実行しようとしています。

デスクトップから、実行中のメディア サーバー システムに OBS 経由で RTMP ストリームを送信しています。次に、引数を指定して ffmpeg を起動し、メディア サーバーからフィードをプルして、そのサーバー上の別の取り込みポイントにプッシュバックします。たとえば、libx264 の場合は、次のように呼び出します。

ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec libx264 -ar 44100 -f flv "rtmp://server/live/matt-test1"

これは意味のある変換を行わない、必要最低限​​の基本テストを目的としており、完璧に動作します。rtmp://server/live/matt-test1 にサブスクライブして、ビデオを見ることができます。

ただし、libx264 を nvec に変更すると次のようになります。

ffmpeg -loglevel verbose -i "rtmp://server/live/matt-input live=1" -vcodec nvenc -ar 44100 -f flv "rtmp://server/live/matt-test1"

約 70 ~ 90 フレーム後にエラーが発生しますWriteN, RTMP send error 104 (136 bytes)。ffmpeg がこのビデオから認識するメタデータは次のとおりです。

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

NVENC には、libx264 にはない rtmp に関する非互換性があるようです。また、ffmpeg を使用してビッグ バック バニー ビデオをエンコードし、 に送信すると、NVENC を使用してrtmp://server/live/matt-inputビデオをプルダウンし、問題なくプッシュアップできることも興味深い点です。参考までに、BBB ビデオは FFMPEG によって次のように表示されます。

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

もし役に立つなら、私はFFMPEGを以下の指示に従ってコンパイルしましたhttp://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdfffmpeg 出力の冒頭は次のようになります。

# 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

OBS の設定を 1 つずつ変更してみましたが (マルチプラットフォーム版と非マルチプラットフォーム版の両方)、効果はありませんでした。他のストリームからプルしても同じことが起こるようで、プルしてトランスコードし、RTMP (NVENC 経由) 経由で再プッシュできた唯一のストリームは、FFMPEG から直接発信されたもののようです。

何が問題なのか、何かアドバイスはありますか? 私の側で rtmp が失敗する原因があるのでしょうか、それとも NVENC エンコーダーのバグでしょうか?

関連情報