RTMP to MPEG-DASH로 라이브 스트리밍하는 방법

소개



스테디셀러 nginx-rtmp-module 로 RTMP to HLS 전송을 실시하고 있었습니다만,
RTMP to MPEG-DASH로 해달라고 말해 버렸으므로 그 대응을 실시했습니다.

RTMP to HLS로 전달하는 방법은 많은 웹으로 넘쳐났습니다만,
RTMP to MPEG-DASH로 전송하는 방법에 대해서는 찾지 못했기 때문에,
기사로 남겨두려고 생각하고 하는 방법에 대해 정리했습니다.

nginx-rtmp-module에서 MPEG-DASH 배포를 위한 설정(Docker)



RTMP to MPEG-DASH를 수행하는 Dockerfile은 ↓입니다.

Dockerfile
FROM tiangolo/nginx-rtmp

# Debian OS (64bit) に対応した static build をダウンロード & 解凍して、/usr/local/bin 以下に移動する
WORKDIR /tmp
RUN mkdir ffmpeg
RUN curl -L -O https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
RUN tar -Jxvf ffmpeg-release-amd64-static.tar.xz -C ffmpeg --strip-components 1
RUN mv ./ffmpeg/ffmpeg /usr/local/bin/ffmpeg

# MPEG-DASH の配信ファイルを配置するためのフォルダ (.mpd, .m4s)
RUN mkdir -p /usr/local/nginx/dash
WORKDIR /usr/local/nginx/dash

# MPEG-DASH 配信のための設定を記載した nginx.conf で
# Docker イメージ内の nginx.conf を上書きする (nginx.conf の詳細は後述)
COPY nginx.conf /etc/nginx/nginx.conf

CMD nginx -g "daemon off;"

이번에는 이 Docker 이미지을 사용했습니다.

MPEG-DASH 배포를 위해 ffmpeg 버전은 4 이상을 사용합니다. (Defo apt-get에서 설치할 수있는 ffmpeg 버전 (3.2)에서는 MPEG-DASH를 라이브 스트리밍 전송하는 데 필요한 streaming 옵션을 사용할 수 없기 때문에)

이번에 사용한 nginx-rtmp-module의 Docker 이미지 OS에는 Debian OS(64bit)가 사용되고 있습니다.

ffmpeg 를 빌드하는 것은 시간과 노력이 걸리기 때문에 ffmpeg 공식 사이트 (ffmpeg-release-amd64-static.tar.xz)

nginx.conf의 내용



nginx.conf의 내용은 ↓와 같습니다.
중요한 것은 application live 의 범위내의 exec 부분이 됩니다.

nginx.conf
user root;
worker_processes auto;
rtmp_auto_push on;
events {}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location /index.html {
            root   /usr/local/nginx/html;
        }
        location / {
            root   /usr/local/nginx/dash;

            # dash.js で MPEG-DASH の動作確認を行うための CORS を設定 (詳細は後述)
            location ~* \.(mpd)$ {
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Methods "GET, OPTIONS";
                add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
                add_header Access-Control-Allow-Credentials true;

                if ($request_method = 'OPTIONS') {
                    return 204;
                }
            }

            # dash.js で MPEG-DASH の動作確認を行うための CORS を設定 (詳細は後述)
            location ~* \.(m4s)$ {
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Methods "GET, OPTIONS";
                add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";

                add_header Access-Control-Allow-Credentials true;
                if ($request_method = 'OPTIONS') {
                    return 204;
                }
            }
        }
    }
}

rtmp {
    server {
        listen 1935;
        listen [::]:1935 ipv6only=on;

        application live {
            live on;
            record off;

            wait_key on;
            wait_video on;

            # ffmpeg を使用して RTMP のストリームを MPEG-DASH に変換する
            # 変換した MPEG-DASH 関連のファイルは /usr/local/nginx/dash フォルダに生成される
            exec /usr/local/bin/ffmpeg -i rtmp://localhost:1935/$app/$name -c copy -r 30 -sc_threshold 0 -b_strategy 0 -streaming 1
                 -use_timeline 1 -use_template 1 -seg_duration 4 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a"
                 -init_seg_name $name\$RepresentationID\$.m4s -media_seg_name $name\$RepresentationID\$-\$Number%05d\$.m4s
                 -f dash /usr/local/nginx/dash/$name.mpd;
        }
    }
}

ffmpeg 의 옵션으로 init_seg_namemedia_seg_name 를 명시적으로 지정하고 있는 것은,
복수의 RTMP 를 받았을 때에, 생성되는 MPEG-DASH 관련의 파일명이 중복하지 않게 하기 (위해)때문에입니다.

실제로 움직여보세요



폴더 구성은 Dockerfile 와 같은 계층구조에 nginx.conf 를 배치하기만 하면 됩니다.
tree -L 2 nginx-rtmp-to-dash/ 
nginx-rtmp-to-dash/
├── Dockerfile
└── nginx.conf

0 directories, 2 files

터미널에서 nginx-rtmp-to-dash 폴더에 들어간 후,
↓ 명령을 실행하여 실제로 움직여보십시오.
↓ 와 같은 출력을 확인할 수 있으면 빌드와 실행이 성공한 상태입니다.
$ docker build -t nginx-rtmp-to-dash .
Sending build context to Docker daemon   5.12kB
Step 1/10 : FROM tiangolo/nginx-rtmp
 ---> ab0f3f3dcb6f
Step 2/10 : WORKDIR /tmp
 ---> Using cache
 ---> 46e748fb4d69
Step 3/10 : RUN mkdir ffmpeg
 ---> Using cache
 ---> 945870247325
Step 4/10 : RUN curl -L -O https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
 ---> Using cache
 ---> f2ee9c7e8e70
Step 5/10 : RUN tar -Jxvf ffmpeg-release-amd64-static.tar.xz -C ffmpeg --strip-components 1
 ---> Using cache
 ---> fcf0ddca90f6
Step 6/10 : RUN mv ./ffmpeg/ffmpeg /usr/local/bin/ffmpeg
 ---> Using cache
 ---> 79a38f12d835
Step 7/10 : RUN mkdir -p /usr/local/nginx/dash
 ---> Using cache
 ---> 2d6aaeaa3bcb
Step 8/10 : WORKDIR /usr/local/nginx/dash
 ---> Using cache
 ---> 9968125c8fac
Step 9/10 : COPY nginx.conf /etc/nginx/nginx.conf
 ---> Using cache
 ---> b83b59608d28
Step 10/10 : CMD nginx -g "daemon off;"
 ---> Using cache
 ---> bb90e10e5c8e
Successfully built bb90e10e5c8e
Successfully tagged nginx-rtmp-to-dash:latest

$ docker run --name nginx-rtmp-to-dash -p 80:80 -p 1935:1935 nginx-rtmp-to-dash
# エラーが発生する等で処理が中断されなければ成功

OBS 을 사용하여 실제로 rtmp://localhost:1935/live/test브라우저에서 http://localhost/test.mpd에 액세스하면,
생성된 MPEG-DASH 파일에 액세스할 수 있는지 확인할 수 있습니다.

그러나 ↑로 파일의 생성은 확인할 수 있다고 생각합니다만,
실제로 동영상도 재생해보고 정상적으로 보이고 있는지 확인할 수 없으면 불안하므로,
이번에는 dash.js 을 사용하여 실제로 전달되는 영상을 보고 싶습니다.

html 파일을 준비하고 Chrome에서 연 후 화면 중앙에 나오는 로딩이 끝난 단계에서 재생 버튼을 클릭하면 MPEG-DASH 재생을 확인할 수 있습니다.

동영상 재생을 확인하는 데 사용한 html 파일은 ↓입니다.

index.html
<head>
  <title>RTMP to MPEG-DASH</title>
  <meta charset="UTF-8">
  <script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
  <style>
    video {
      width: 640px;
      height: 360px;
    }
  </style>
</head>

<body>
  <div>
    <!-- rtmp://localhost:1935/live/test に配信した際に生成される MPEG-DASH の URLを指定 -->
    <video data-dashjs-player autoplay src="http://localhost/test.mpd" controls></video>
  </div>
</body>

OBS에서 rtmp://localhost:1935/live/test로 RTMP를 보낼 때 Chrome에서 ↑의 HTML을 열 때 ↓



결론



RTMP에서 MPEG-DASH로 변환하기위한 ffmpeg의 구성을 고려하여,
컨버터에서 재생 가능하게 될 때까지 옵션 설정을 찾을 때까지
여러가지 빠져 버려, 이것만으로 꽤 시간을 먹어 버렸습니다. .

참고 링크



htps : // 니코 b. 네 t/다 sh_무ぇr_우ぃth_っ fmぺg/
htps : // 기주 b. 이 m/다 sh-인즈 스트리-후우 m/다 sh. js ?
htps : // m / mh / ms / d5c3-b173 에바 c5b0b53

좋은 웹페이지 즐겨찾기