Saya mencoba menjalankan beberapa tes transcoding untuk mengetahui seberapa baik ffmpeg bekerja pada beberapa server GPU yang kita miliki.

Dari desktop saya, saya mengirimkan aliran RTMP melalui OBS ke sistem server media yang telah kami jalankan. Saya kemudian mulai ffmpeg dengan argumen untuk menarik umpan itu dari server media dan mendorongnya kembali ke titik konsumsi yang berbeda di server itu. Jadi misalnya dengan libx264 saya memohonnya dengan yang berikut:

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

Ini dimaksudkan sebagai tes dasar tulang kosong tanpa melakukan konversi yang berarti, dan bekerja dengan sempurna. Saya dapat berlangganan rtmp: // server / live / matt-test1 dan melihat vide saya keluar.

Namun, ketika saya mengubah libx264 ke nvec:

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

Setelah sekitar 70-90 frame itu memberi saya kesalahan WriteN, RTMP send error 104 (136 bytes). Metadata yang dilihat ffmpeg dari video ini adalah:

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

Tampaknya NVENC memiliki beberapa ketidakcocokan ketika datang ke rtmp yang tidak dimiliki libx264. Ini juga menarik untuk dicatat bahwa jika saya menggunakan ffmpeg untuk mengkodekan video kelinci uang besar dan mengirimkannya rtmp://server/live/matt-input, maka saya dapat berhasil menggunakan NVENC untuk menarik video dan mendorongnya kembali ke atas tanpa masalah. Untuk referensi, video BBB dilihat oleh FFMPEG sebagai:

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

Jika itu membantu saya mengkompilasi FFMPEG menggunakan instruksi dari http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdf , dan awal dari output ffmpeg terlihat seperti:

# 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

Saya telah mencoba mengubah pengaturan OBS saya satu per satu (baik versi multi-platform dan non-multiplatform) tetapi tidak berhasil. Menarik dari aliran lain tampaknya menyebabkan hal yang sama terjadi, dan satu-satunya aliran yang dapat saya tarik, transcode, lalu dorong kembali melalui RTMP (via NVENC) tampaknya merupakan aliran yang berasal langsung dari FFMPEG

Adakah yang punya saran tentang apa yang mungkin salah? Apakah ada sesuatu di ujung saya yang menyebabkan rtmp gagal atau apakah itu bug dalam NVENC encoder?

KallDrexx
sumber