2020.10.23
マルチビットレート配信とは、1つのライブ配信を複数のビットレートで配信する方法です。
通常のライブ配信では1つのビットレートでの配信となり、全ての視聴者が同じ画質で動画を視聴します。
それに対しマルチビットレート配信では、視聴者のネット環境に応じて最も快適に視聴できるビットレートを複数の中から自動判定し配信するというものです。
前回の以下の記事では、1つのビットレートでの配信環境を作りました。
まずは、この手順に従って1つのビットレートでの配信環境を作りましょう。
その後、FFMPEGを利用してストリーミングを3つに分割して m3u8ファイルを構成する手順を説明します。
■ライブストリーミングサーバ構築
https://trans-it.net/centos7-ngin-livestreaming/
また、ストリーミングを分割するのにFFMPEGを利用します。
FFMPEGのインストールは以下の手順を参考に行ってください。
■FFMPEG4.3のインストール(コーデック H264、fdk-aac)
https://trans-it.net/centos7-ffmpeg43-h264-fdkaac/
/usr/local/nginx/conf/nginx.conf
を vi で開き、以下のように設定します。
application srcに、
exec /var/scripts/exec_ffmpeg.sh $name;
と設定し、シェル exec_ffmpeg.shの中に、ffmpegでストリーミングを分割する処理を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | user root; worker_processes auto; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } rtmp_auto_push on; rtmp { server { listen 1935; access_log logs/rtmp_access.log; chunk_size 1024; application src { live on; exec /var/scripts/exec_ffmpeg.sh $name; #exec_kill_signal term; } application live1 { live on; #wait_video on; hls on; #hls_cleanup on; hls_path /usr/local/nginx/html/hls; hls_fragment 1s; hls_playlist_length 4s; hls_type live; hls_nested on; hls_variant _low BANDWIDTH=350000; hls_variant _mid BANDWIDTH=460000; hls_variant _hi BANDWIDTH=700000; } } } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; location /hls { types { application/vnd.apple.mpegurl m3u8; } root html; index index.html index.htm; } } } |
また、以下のコマンドで hlsディレクトリを作成しておく。
1 | mkdir /usr/local/nginx/html/hls |
exec /var/scripts/exec_ffmpeg.sh の内容は以下の通りです。
まずは
1 2 3 4 5 6 7 | #!/bin/bash ffmpeg -re -y -i rtmp://localhost:1935/src/$1 -c:v libx264 -preset veryfast -crf 20 -r 30 -c:a libfdk_aac -b:a 128k -ar 44100 -s 640x360 -f flv rtmp://localhost:1935/live1/$1_low -c:v libx264 -preset veryfast -crf 20 -r 30 -c:a libfdk_aac -b:a 128k -ar 44100 -s 720x480 -f flv rtmp://localhost:1935/live1/$1_mid -c:v libx264 -preset veryfast -crf 20 -r 30 -c:a libfdk_aac -b:a 128k -ar 44100 -s 1280x720 -f flv rtmp://localhost:1935/live1/$1_hi </dev/null >/dev/null 2>/dev/null & |
※改行は消して1行にしてください。
1 | $ chmod +x /var/scripts/exec_ffmpeg.sh |
上記コマンドにより実行権限を付与しておく事。
ストリーミングをFFMPEGを利用して動的に3つのビットレートに変換し、それを再度、nginxにストリーミングとして流し直す感じですね。
CPUパワーをとてつもなく消費するので、それなりのスペックのサーバが必要となります。
パラメータがサーバの環境に合っていないと、ストリーミングが途中で止まってしまいます。