🗓️ 2024. 04. 14
⏱️ 5

nginx와 ffmpeg으로 미디어 서버 간단히 구축하기

로컬 환경에서 테스트할 때 좋아요

배경

최근 회사에서 RTMP(Real-Time Messaging Protocol)로 들어오는 영상을 처리하고 있습니다.
테스트와 개발에 사용할 RTMP 서버를 별도로 분리해야 했는데요,
로컬 환경에서 nginxffmpeg을 활용해 간단하게 RTMP 서버를 구축했던 방법을 공유드리려 합니다.

nginx는 익숙하실 텐데 ffmpeg은 다소 낯서실 거예요. 글을 시작하기 전에 간단히 ffmpeg를 소개드리겠습니다.
ffmpeg은 음악, 영상, 사진을 인코딩/디코딩해주는 오픈 소스 프로그램입니다.
우리가 흔히 접하는 avi→mp4, wav→mp3, png→jpg 등의 포맷 변환뿐만 아니라 음악, 영상, 사진 편집툴에서 제공하는 대부분의 기능들을 명령어로 수행할 수 있게 도와줍니다. 혹시 미디어를 다룰 일을 앞두고 있는 분이라면 꼭 배워보셨으면 합니다. 이렇게 편리하고 막강한 도구가 있다는 걸 저는 이번에 처음 알았거든요.

구축하기

nginx

RTMP 서버를 구축하기 위해선 nginx-rtmp-module이 필요합니다.
이름에서 알 수 있듯이 nginx 위에서 미디어 서버를 돌릴 수 있게 도와주는 모듈입니다.

nginx와 미디어를 다루는 데 아직 익숙치 않은 분이라면 다소 사용하기 어려울 수 있습니다.
하지만 다행히도 곧바로 사용해볼 수 있는 docker 이미지가 이미 마련돼 있습니다.

파이썬의 FastAPI 제작자인 tiangolo가 만든 nginx-rtmp-docker인데요,
아래 명령어로 간단히 RTMP 서버를 띄울 수 있습니다.

$ docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp

ffmpeg

이제 ffmpeg을 사용해 스트림을 RTMP 서버로 전송해보겠습니다.
준비된 샘플 영상이 있다면 다음과 같이 전송할 수 있습니다.

# 샘플 영상을 무한 반복하면서 실시간으로 송출
# 'IP주소' 부분엔 192.168.35.17 같은 로컬 IP주소를 입력해주시면 됩니다
$ ffmpeg -re -stream_loop -1 \
    -i sample.mp4 -vcodec libx264 \
    -pix_fmt yuv420p -f flv rtmp://IP주소/live/sample

ffmpeg으로 직접 띄우는 것이 번거로우시다면 nginx.conf를 다음과 같이 직접 수정하셔도 됩니다.

...
    application big {
        live on;

        exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
                    -f flv rtmp://localhost:1935/small/${name};
    }
...

때론 실시간 영상이 필요할 때도 있습니다. 그럴 땐 개발 PC에 연결된 웹캠을 사용하시면 편리합니다.
ffmpeg은 URL뿐만 아니라 장치도 입력으로 사용할 수 있기 때문에 입력값만 웹캠으로 바꿔주시면 됩니다.

# MacOS, 맥북에 있는 웹캠을 사용하는 옵션이에요
$ ffmpeg -f avfoundation -i "0" -framerate 30 ...

# Linux
$ ffmpeg -f video4linux2 -i /dev/video0 ...

이외에도 nginx-rtmp-module의 공식 문서에는 웹캠 영상 송출을 비롯한 여러 예시를 설명하고 있으니 과정을 더 자동화하고 싶거나 설정을 세밀히 하고 싶다면 참고하시기 바랍니다.

마무리

하드웨어 인코더하드웨어 인코더

사실 이상적으로 테스트 환경을 구축하려면 위 장비같은 하드웨어 인코더를 사용하는 게 가장 좋긴 합니다.
하지만 CPU가 충분하다면 별다른 비용없이 이렇게 간단히 RTMP 서버를 구축할 수 있으니 시도해보시길 권해드립니다.

⚠️ ffmpeg이 CPU를 많이 사용하기 때문에 테스트 및 개발 환경에서 영상이 버벅일 수 있습니다.
그럴 땐 ffmpegpreset 옵션 등으로 조절해주세요.

돌아가기
© 2024 VERYCOSY.