Skip to content

H264 포맷 문제

top-chaser edited this page Nov 20, 2023 · 1 revision

문제 상황

OBS를 사용해 RTMP 수신 서버로 스트리밍 데이터를 보내고 다시 인코딩 서버를 거쳐 Object Storage에 m3u8, ts 파일을 저장했는데 화면이 없이 오디오만 스트리밍 된다.

해결 과정

OBS 비디오 인코더가 맥북에서는 Apple H.264, 윈도우에서는 NVIDIA NVENC H.264, AMD H.264가 있었는데

맥북에서 비디오 인코더를 Apple H.264로 설정하면 화면을 포함해 정상적으로 스트리밍이 됐다. 하지만 윈도우는 모든 인코더가 동일하게 오디오만 나왔다.

RTMP 수신 서버는 node-media-server 라이브러리를 사용하는데 여기서 아래 명령어로 다음 서버에 relay한다.

ffmpeg -re -i [INPUT-URL] -c copy -f flv [인코딩-서버-URL]

이 명령어는 비디오는 H264, 오디오는 AAC 포맷이어야 RTMP 요청이 정상적으로 동작한다.

ffmpeg -re -i [INPUT-URL] -c:v libx264 -preset veryfast -tune zerolatency -c:a aac -ar 44100 -f flv [인코딩-서버-URL]

스트리밍 서버에 경우 어떠한 포맷으로 요청이 오더라도 정상 작동해야 되므로 위처럼 포맷을 수정하도록 명령어를 바꿀 필요가 있었다.

하지만 node-media-server 내부에서 ffmpeg 명령을 호출하는데 argv를 설정하는 기능은 제공하지 않았다.

ffmpeg 명령어를 호출하는 기존의 node_modules/node-media-server/src/node_relay_session.js 파일을 복사해서, 그 안의 코드를 수정한 수정본 파일을 만들었다.

그리고 이 수정본을 적용하는 코드를 Dockerfile에 추가해 ffmpeg의 argv를 수정했다.

RUN mv ./node_relay_session.js ./node_modules/node-media-server/src/node_relay_session.js

하지만 이 방법으로 로컬에선 정상 작동하지만 이상하게도 클라우드 서버에선 audio만 저장됩니다.

Clone this wiki locally