
우리가 가지고 있는 일부 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
libx264에는 없는 rtmp와 관련하여 NVENC에는 약간의 비호환성이 있는 것으로 보입니다. 또한 ffmpeg를 사용하여 Big Buck Bunny 비디오를 인코딩하고 로 보내면 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 인코더의 버그인가요?