Ubuntu 22.04에서 Nginx-RTMP를 사용하여 비디오 스트리밍 서버를 설정하는 방법
소개
비디오 스트리밍에 대한 많은 사용 사례가 있습니다. OBS Studio와 같은 서비스 제공업체는 다양한 스트림 소스의 비디오 오버레이를 실시간으로 결합하는 데 널리 사용됩니다. 이러한 플랫폼은 매우 강력하지만 경우에 따라 다른 서비스 공급자에 의존하지 않는 스트림을 호스팅할 수 있기를 원할 수 있습니다.
이 자습서에서는 다른 응용 프로그램에서 연결하고 볼 수 있는 독립적인 RTMP 비디오 스트림을 호스팅하도록 Nginx 웹 서버를 구성하는 방법을 배웁니다. 실시간 메시징 프로토콜인 RTMP는 대부분의 인터넷 비디오 스트리밍의 기본을 정의합니다. 또한 동일한 기술을 사용하여 최신 플랫폼을 지원하는 HLS 및 DASH 스트림을 호스팅하는 방법도 배웁니다.
전제 조건
이 가이드를 완료하려면 다음이 필요합니다.
sudo
권한이 있는 Ubuntu 22.04 서버 및 루트가 아닌 사용자. Ubuntu 22.04 가이드로 초기 서버 설정에서 이러한 권한을 가진 사용자를 설정하는 방법에 대해 자세히 알아볼 수 있습니다.- Ubuntu 22.04에 Nginx를 설치하는 방법에 따라 Nginx가 설치되었습니다.
이 자습서에서는 URL 및 호스트 이름에 자리 표시자 도메인 이름 your_domain을 사용합니다. 자습서를 진행하면서 이것을 자신의 도메인 이름 또는 IP 주소로 대체하십시오.
1단계 - Nginx-RTMP 설치 및 구성
대부분의 최신 스트리밍 도구는 인터넷 비디오 스트림의 기본 매개변수를 정의하는 RTMP 프로토콜을 지원합니다. Nginx 웹 서버에는 기본적으로 웹 페이지에 대한 HTTP 액세스를 제공하는 방식과 유사하게 전용 URL에서 최소한의 구성으로 RTMP 스트림을 제공할 수 있는 모듈이 포함되어 있습니다. Nginx RTMP 모듈은 Nginx에 자동으로 포함되지 않지만 Ubuntu 22.04 및 대부분의 다른 Linux 배포판에서 추가 패키지로 설치할 수 있습니다.
루트가 아닌 사용자로 다음 명령을 실행하여 패키지 목록을 업데이트하고 Nginx 모듈을 설치하십시오.
- sudo apt update
- sudo apt install libnginx-mod-rtmp
모듈을 설치해도 스트림 제공이 자동으로 시작되지 않습니다. 스트림을 사용할 수 있는 위치와 방법을 정의하는 구성 블록을 Nginx 구성 파일에 추가해야 합니다.
nano
또는 선호하는 텍스트 편집기를 사용하여 Nginx의 기본 구성 파일인 /etc/nginx/nginx.conf
를 열고 이 구성 블록을 파일 끝에 추가합니다.
- sudo nano /etc/nginx/nginx.conf
. . .
rtmp {
server {
listen 1935;
chunk_size 4096;
allow publish 127.0.0.1;
deny publish all;
application live {
live on;
record off;
}
}
}
listen 1935
는 RTMP가 표준 포트1935
에서 연결을 수신함을 의미합니다.chunk_size 4096
은 RTMP가 표준인 4KB 블록으로 데이터를 전송한다는 의미입니다.127.0.0.1 게시 허용
및모두 게시 거부
는 다른 사용자가 자신의 동영상을 게시하는 것을 방지하기 위해 서버가 동일한 서버에서만 동영상 게시를 허용함을 의미합니다. 스트림.application live
는/live
URL 경로에서 사용할 수 있는 애플리케이션 블록을 정의합니다.live on
은 비디오 스트리밍의 기본 가정인 여러 사용자가 스트림에 동시에 연결할 수 있도록 라이브 모드를 활성화합니다.녹화 끄기
는 Nginx-RTMP의 녹화 기능을 비활성화하여 모든 스트림이 기본적으로 디스크에 별도로 저장되지 않도록 합니다.
파일을 저장하고 닫습니다. nano
를 사용하는 경우 CTRL+X
를 누른 다음 메시지가 표시되면 Y
및 ENTER
를 누릅니다.
이것은 RTMP 구성의 시작을 제공합니다. 기본적으로 포트 1935
에서 수신하므로 방화벽에서 해당 포트를 열어야 합니다. 초기 서버 설정의 일부로 ufw
를 구성한 경우 다음 명령을 실행합니다.
- sudo ufw allow 1935/tcp
이제 변경 사항으로 Nginx를 다시 로드할 수 있습니다.
- sudo systemctl reload nginx.service
이제 작동하는 RTMP 서버가 있습니다. 다음 섹션에서는 로컬 및 원격 소스에서 RTMP 서버로 스트리밍 비디오를 다룰 것입니다.
2단계 - RTMP 서버로 비디오 보내기
비디오를 RTMP 서버로 보내는 방법에는 여러 가지가 있습니다. 한 가지 옵션은 널리 사용되는 명령줄 오디오-비디오 유틸리티인 ffmpeg
를 사용하여 서버에서 직접 비디오 파일을 재생하는 것입니다. 서버에 아직 비디오 파일이 없는 경우 YouTube와 같은 스트리밍 플랫폼에서 비디오를 캡처하기 위한 명령줄 도구인 youtube-dl
을 사용하여 비디오 파일을 다운로드할 수 있습니다. youtube-dl
을 사용하려면 서버에도 최신 Python 설치가 필요합니다.
먼저 Python과 해당 패키지 관리자인 pip
를 설치합니다.
- sudo apt install python3-pip
다음으로 pip
를 사용하여 youtube-dl
을 설치합니다.
- sudo pip install youtube-dl
이제 youtube-dl
을 사용하여 YouTube에서 비디오를 다운로드할 수 있습니다. 생각나는 것이 없다면 DigitalOcean의 앱 플랫폼을 소개하는 이 비디오를 시도해 보십시오.
- youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk -f mp4
참고: 경우에 따라 오류: 비디오 데이터를 다운로드할 수 없음: HTTP 오류 403: 금지됨
이라는 오류가 표시됩니다. 그렇다면 URL이 올바른지 다시 한 번 확인하세요. URL이 정확하면 명령을 두 번 실행하면 작동합니다. 이것은 이 라이브러리를 통해 YouTube와 인터페이스하는 특이한 점입니다.
출력은 다운로드 중인 비디오 및 오디오 스트림을 다시 단일 파일로 결합하는 youtube-dl
로 반환됩니다. 이것은 정상입니다.
Output[youtube] iom_nhYQIYk: Downloading webpage
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4
[download] 100% of 7.90MiB in 01:39
이제 Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4
와 같은 제목의 비디오 파일이 현재 디렉토리에 있습니다. 스트리밍하려면 ffmpeg
를 설치하세요.
- sudo apt install ffmpeg
그리고 ffmpeg
를 사용하여 RTMP 서버로 보냅니다.
- ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream
이 ffmpeg
명령은 비디오를 스트리밍 친화적인 형식으로 준비하기 위해 몇 가지 작업을 수행합니다. 이것은 ffmpeg
튜토리얼이 아니므로 자세히 살펴볼 필요는 없지만 다음과 같이 다양한 옵션을 이해할 수 있습니다.
-re
는 입력이 기본 프레임 속도로 읽히도록 지정합니다.-i \Introducing App Platform by DigitalOcean-iom_nhYQIYk.mp4\
는 입력 파일의 경로를 지정합니다.-c:v
는복사
로 설정됩니다. 즉, 기본적으로 YouTube에서 가져온 동영상 형식을 복사한다는 의미입니다.-c:a
에는aac -ar 44100 -ac 1
과 같은 다른 매개변수가 있습니다. 오디오를 RTMP 친화적인 형식으로 다시 샘플링해야 하기 때문입니다.aac
는 널리 지원되는 오디오 코덱이고44100
hz는 일반적인 주파수이며-ac 1
은 호환성을 위해 AAC 사양의 첫 번째 버전을 지정합니다. 목적.-f flv
는 RTMP와의 최대 호환성을 위해 비디오를flv
형식 컨테이너로 래핑합니다.
1단계에서 live
구성 블록을 정의했고 stream
이 이 동영상에 대해 임의로 선택한 URL입니다.
참고: 공식 문서에서 ffmpeg
옵션에 대해 자세히 알아볼 수 있습니다.
ffmpeg
가 비디오를 스트리밍하는 동안 타임코드를 인쇄합니다.
Outputframe= 127 fps= 25 q=-1.0 size= 405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame= 140 fps= 25 q=-1.0 size= 628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame= 153 fps= 25 q=-1.0 size= 866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=
이것은 표준 ffmpeg
출력입니다. 비디오를 다른 형식으로 변환하는 경우 비디오가 얼마나 효율적으로 리샘플링되는지 이해하는 데 도움이 될 수 있지만 이 경우에는 비디오가 일관되게 재생되고 있는지 확인하고 싶지 않을 것입니다. 이 샘플 비디오를 사용하면 정확한 fps= 25
증가분을 얻어야 합니다.
ffmpeg가 실행되는 동안 비디오 플레이어에서 RTMP 스트림에 연결할 수 있습니다. VLC
, mpv
또는 다른 미디어 플레이어가 로컬에 설치되어 있는 경우 URL rtmp://를 열어 스트림을 볼 수 있습니다. your_domain/live/stream
을 미디어 플레이어에 저장합니다. ffmpeg
가 비디오 재생을 완료한 후 스트림이 종료됩니다. 계속 무한 반복하려면 ffmpeg
명령 시작 부분에 -stream_loop -1
을 추가하면 됩니다.
참고: rtmp://localhost/live/stream
을 교체하여 Nginx-RTMP를 전혀 사용할 필요 없이 ffmpeg
를 사용하여 예를 들어 Facebook Live로 직접 스트리밍할 수도 있습니다. rtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key
ffmpeg 명령에서 >. YouTube는 rtmp://a.rtmp.youtube.com/live2
와 같은 URL을 사용합니다. RTMP 스트림을 사용할 수 있는 다른 스트리밍 공급자는 유사하게 동작해야 합니다.
이제 명령줄에서 정적 비디오 소스를 스트리밍하는 방법을 배웠으므로 데스크탑에서 OBS를 사용하여 동적 소스에서 비디오를 스트리밍하는 방법을 배우게 됩니다.
3단계 - OBS를 통해 서버로 비디오 스트리밍(선택 사항)
ffmpeg
를 통한 스트리밍은 재생하려는 준비된 비디오가 있을 때 편리하지만 라이브 스트리밍은 훨씬 더 역동적일 수 있습니다. 라이브 스트리밍에 가장 많이 사용되는 소프트웨어는 OBS(Open Broadcaster Software)입니다. 이 소프트웨어는 무료이며 오픈 소스이며 매우 강력합니다.
OBS는 데스크톱 응용 프로그램이며 로컬 컴퓨터에서 서버에 연결됩니다.
OBS를 설치한 후 이를 구성한다는 것은 스트림에 추가할 데스크탑 창과 오디오 소스를 사용자 정의한 다음 스트리밍 서비스에 대한 자격 증명을 추가하는 것을 의미합니다. 이 자습서에서는 스트리밍 구성을 다루지 않습니다. 선호도에 따라 다르며 기본적으로 전체 데스크톱만 스트리밍하여 작동하는 데모를 볼 수 있습니다. 스트리밍 서비스 자격 증명을 설정하려면 OBS의 설정 메뉴를 열고 스트림 옵션으로 이동한 후 다음 옵션을 입력하세요.
Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream
obs_stream
은 임의로 선택한 경로입니다. 이 경우 비디오는 rtmp://your_domain/live/obs_stream
에서 사용할 수 있습니다. 인증을 활성화할 필요는 없지만 1단계에서 구성한 IP 화이트리스트에 추가 항목을 추가해야 합니다.
서버로 돌아가서 Nginx의 기본 구성 파일인 /etc/nginx/nginx.conf
를 열고 로컬 IP 주소에 대한 allow publish
항목을 추가합니다. 로컬 IP 주소를 모르는 경우 어디에서 액세스했는지 알려주는 What's my IP와 같은 사이트로 이동하는 것이 가장 좋습니다.
- sudo nano /etc/nginx/nginx.conf
. . .
allow publish 127.0.0.1;
allow publish your_local_ip_address;
deny publish all;
. . .
파일을 저장하고 닫은 다음 Nginx를 다시 로드합니다.
- sudo systemctl reload nginx.service
이제 OBS의 설정 메뉴를 닫고 기본 인터페이스에서 스트리밍 시작
을 클릭할 수 있습니다! 이전과 같이 미디어 플레이어에서 rtmp://your_domain/live/obs_stream
의 스트림을 시청해 보십시오. 이제 작동 중인 스트리밍 비디오의 기본 사항을 이해했으므로 서버에 몇 가지 다른 기능을 추가하여 프로덕션 준비 상태를 높일 수 있습니다.
4단계 - 구성에 모니터링 추가(선택 사항)
이제 Nginx-RTMP 모듈을 사용하여 비디오를 스트리밍하도록 Nginx를 구성했으므로 일반적인 다음 단계는 RTMP 통계 페이지를 활성화하는 것입니다. 기본 nginx.conf
파일에 점점 더 많은 구성 세부 정보를 추가하는 대신 Nginx를 사용하면 sites-available/
이라는 하위 디렉토리의 개별 파일에 사이트별 구성을 추가할 수 있습니다. . 이 경우 rtmp
라는 이름을 만듭니다.
- sudo nano /etc/nginx/sites-available/rtmp
다음 내용을 추가합니다.
server {
listen 8080;
server_name localhost;
# rtmp stat
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/html/rtmp;
}
# rtmp control
location /control {
rtmp_control all;
}
}
파일을 저장하고 닫습니다. 이 구성 블록의 stat.xsl
파일은 브라우저에서 RTMP 통계 페이지의 스타일을 지정하고 표시하는 데 사용됩니다. 이전에 설치한 libnginx-mod-rtmp
라이브러리에서 제공하지만 기본적으로 압축되어 제공되므로 압축을 풀고 /var/www에 넣어야 합니다. /html/rtmp
디렉토리를 예제 구성과 일치시킵니다. Nginx-RTMP 설명서에서 이러한 옵션에 대한 추가 정보를 찾을 수 있습니다.
/var/www/html/rtmp
디렉토리를 만든 다음 다음 명령을 사용하여 stat.xsl.gz
파일의 압축을 풉니다.
- sudo mkdir /var/www/html/rtmp
- sudo cp /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl /var/www/html/rtmp/stat.xsl
마지막으로 추가한 통계 페이지에 액세스하려면 방화벽에서 다른 포트를 열어야 합니다. 특히 listen
지시문은 8080
포트로 구성되어 있으므로 해당 포트에서 Nginx에 액세스하려면 규칙을 추가해야 합니다. 그러나 다른 사람이 통계 페이지에 액세스하는 것을 원하지 않을 수 있으므로 자신의 IP 주소에만 허용하는 것이 가장 좋습니다. 다음 명령을 실행합니다.
- sudo ufw allow from your_ip_address to any port http-alt
다음으로 이 새 구성을 활성화해야 합니다. Nginx의 규칙은 sites-available/
에 있는 파일에서 sites-enabled/
라는 다른 폴더로 심볼릭 링크(바로 가기와 같은)를 생성하여 활성화 또는 비활성화하는 것입니다. 명확성을 위해 전체 경로를 사용하여 해당 링크를 만듭니다.
- sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp
이제 Nginx를 다시 로드하여 변경 사항을 처리할 수 있습니다.
- sudo systemctl reload nginx.service
이제 브라우저에서 http://your_domain:8080/stat
로 이동하여 RTMP 통계 페이지를 확인할 수 있습니다. 비디오를 스트리밍하는 동안 페이지를 방문하고 새로 고침하고 스트림 통계가 변경되는 것을 지켜보십시오.
이제 비디오 스트림을 모니터링하고 타사 공급자에게 푸시하는 방법을 배웠습니다. 마지막 섹션에서는 타사 스트리밍 플랫폼이나 독립형 미디어 플레이어 앱을 사용하지 않고 브라우저에서 직접 제공하는 방법을 배웁니다.
5단계 - 브라우저용 최신 스트림 만들기(선택 사항)
마지막 단계로 사용자가 웹 브라우저를 사용하여 서버에서 직접 비디오를 스트리밍할 수 있도록 최신 스트리밍 프로토콜에 대한 지원을 추가할 수 있습니다. HTTP 기반 비디오 스트림을 생성하는 데 사용할 수 있는 두 가지 프로토콜은 Apple의 DASH입니다. 둘 다 장단점이 있으므로 둘 다 지원하고 싶을 것입니다.
Nginx-RTMP 모듈은 두 표준을 모두 지원합니다. 서버에 HLS 및 DASH 지원을 추가하려면 nginx.conf
파일에서 rtmp
블록을 수정해야 합니다. nano
또는 원하는 편집기를 사용하여 /etc/nginx/nginx.conf
를 연 다음 강조 표시된 다음 지시문을 추가합니다.
- sudo nano /etc/nginx/nginx.conf
. . .
rtmp {
server {
. . .
application live {
live on;
record off;
hls on;
hls_path /var/www/html/stream/hls;
hls_fragment 3;
hls_playlist_length 60;
dash on;
dash_path /var/www/html/stream/dash;
}
}
}
. . .
파일을 저장하고 닫습니다. 다음으로 sites-available/rtmp
하단에 다음을 추가합니다.
- sudo nano /etc/nginx/sites-available/rtmp
. . .
server {
listen 8088;
location / {
add_header Access-Control-Allow-Origin *;
root /var/www/html/stream;
}
}
types {
application/dash+xml mpd;
}
참고: Access-Control-Allow-Origin *
헤더는 CORS 또는 HLS 및 DASH 클라이언트를 활성화하고 다른 많은 웹 배포에서 공통 구성 토글을 활성화합니다.
파일을 저장하고 닫습니다. 여기서 포트 8088
을 사용하고 있다는 점에 유의하세요. 포트 80
또는 <코드>443. 지금은 방화벽에서도 해당 포트를 열고 싶을 것입니다.
- sudo ufw allow 8088/tcp
마지막으로 Nginx가 HLS 및 DASH에 필요한 파일을 생성할 수 있도록 구성 블록과 일치하도록 웹 루트에 stream
디렉터리를 만듭니다.
- sudo mkdir /var/www/html/stream
Nginx를 다시 로드합니다.
- sudo systemctl reload nginx
이제 http://your_domain:8088/hls/stream.m3u8
에서 사용할 수 있는 HLS 스트림과 http://<에서 사용할 수 있는 DASH 스트림이 있어야 합니다. mark>your_domain:8088/dash/stream.mpd
. 이러한 엔드포인트는 최신 API를 지원하기 위해 RTMP 비디오 피드 위에 필요한 메타데이터를 생성합니다.
결론
이 튜토리얼에서 사용한 구성 옵션은 모두 Nginx RTMP Wiki 페이지에 문서화되어 있습니다. Nginx 모듈은 일반적으로 공통 구문을 공유하고 매우 큰 구성 옵션 집합을 노출하며 해당 설명서를 검토하여 여기에서 설정을 변경할 수 있습니다.
거의 모든 인터넷 비디오 스트리밍은 RTMP, HLS 및 DASH 위에 구현되며 이 자습서에서 탐색한 접근 방식을 사용하여 다른 방송 서비스를 통해 스트림을 제공하거나 선택한 다른 방식으로 노출할 수 있습니다. 다음으로 Nginx를 리버스 프록시로 구성하여 이러한 다양한 비디오 엔드포인트 중 일부를 하위 도메인으로 사용할 수 있도록 하는 방법을 읽을 수 있습니다.