Я пытаюсь запустить некоторые тесты транскодирования, чтобы выяснить, насколько хорошо ffmpeg работает на некоторых наших графических серверах.
Со своего рабочего стола я отправляю поток RTMP через OBS на используемую нами систему медиасервера. Затем я запустил 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, ошибка 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 есть некоторая несовместимость, когда дело доходит до rtmp, которого нет у libx264. Интересно также отметить, что если я использую ffmpeg для кодирования видео с большим кроликом и отправляю его на rtmp://server/live/matt-input
, то я могу успешно использовать NVENC, чтобы снять видео и отправить его Резервное копирование без проблем. Для справки, видео 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.pdf и начало вывод ffmpeg выглядит так:
# 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 по одной (как для мультиплатформенных, так и для не мультиплатформенных версий), но безрезультатно. Похоже, что из-за извлечения из других потоков происходит то же самое, и единственный поток, который мне удалось вытащить, перекодировать, а затем повторно протолкнуть через RTMP (через NVENC), кажется, происходит от FFMPEG.
У кого-нибудь есть предложения по поводу того, что может быть не так? Есть ли что-то на моем конце, что приводит к сбою rtmp или это ошибка в кодере NVENC?