배경
최근 회사에서 RTMP(Real-Time Messaging Protocol)로 들어오는 영상을 처리하고 있습니다.
테스트와 개발에 사용할 RTMP 서버를 별도로 분리해야 했는데요,
로컬 환경에서 nginx
와 ffmpeg
을 활용해 간단하게 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를 많이 사용하기 때문에 테스트 및 개발 환경에서 영상이 버벅일 수 있습니다.
그럴 땐 ffmpeg
의 preset 옵션 등으로 조절해주세요.