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

libx264에는 없는 rtmp와 관련하여 NVENC에는 약간의 비호환성이 있는 것으로 보입니다. 또한 ffmpeg를 사용하여 Big Buck Bunny 비디오를 인코딩하고 로 보내면 rtmp://server/live/matt-inputNVENC를 사용하여 비디오를 풀다운하고 문제 없이 다시 올릴 수 있다는 점도 흥미롭습니다. 참고로 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 인코더의 버그인가요?

관련 정보