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?
sumber