Tag: MediaLive

cheatsheet/aws/medialive

チャンネル操作

効果コマンド
チャンネルのリストaws medialive list-channels –region ap-southeast-1 | jq -r ‘.Channels[].Id’)
止めるaws medialive stop-channel –channel-id チャンネル ID
削除aws medialive delete-channel –channel-id チャンネル ID
作成aws medialive create-channel –cli-input-json file://channel_sample.json | jq ‘.Channel.Id’
開始aws medialive start-channel –channel-id チャンネル ID
インプットを作成するaws medialive create-input –cli-input-json “$CREATEINPUT” –region ap-southeast-1
インプット id を調べるaws medialive list-inputs –region ap-southeast-1 | jq -r ‘.Inputs[].Id’
インプット id から詳細を得るaws medialive describe-input –input-id インプット ID –region ap-southeast-1
インプット用のスケルトンを得る( 上記の json より、Destinations の雛形が良い )aws medialive create-input –generate-cli-skeleton

セキュリティグループの雛形を得る

aws medialive create-input-security-group --generate-cli-skeleton
{
    "WhitelistRules": [
        {
            "Cidr": ""
        }
    ]
}

こんな感じにしたい

Read more...

MediaLiveでRTMP接続があった事を検知する

ひょっとするとServerlessFrameworkでも検索条件が作れるかもしれないが手動で作成した

MediaLiveでRTMPで接続ができた際にトリガーとする方法

{
  "source": [
    "aws.medialive"
  ],
  "detail": {
    "alarm_state": [
      "cleared"
    ],
    "message": [
      "Waiting for RTMP input"
    ]
  }
}

ターゲットはStepFunctionを指定した。 ServerlessFrameworkで、直接、CloudWatch ルールからStepfunctionを指定することはできなかった。 通常のlambdaであれば、ServerlessFrameworkで指定可能だろう、若干面倒そうではあるかな。手動で設定しよう。

Read more...

MediaLiveでライブ配信システムを構築する

ライブ配信システムの構成

映像データは下記のように流れる。

カメラ、マイク -> ローランドの映像ミキサー -> LiveShell X -> MediaLive -> MediaStore -> CloudFront -> 各プラットフォームのプレーヤー

この手順では、MediaLive、MediaStore、CloudFrontの設定について行う。

このうち、MediaLiveには

  1. インプット( LiveShell X からの RTMP を受け取る )
  2. チャンネル( 映像データをエンコードする ) で構成されている。

またMediaStoreはストレージで、MediaLiveでエンコードされたデータを保存する領域になっている( MediaLive だけでは映像を保存できない、かならず別の保存する領域に転送する必要がある )

CloudFrontは大規模配信で使われるCDNで、 複数ユーザにキャッシュを見せる事で、MediaStoreの負荷を下げるために用いている。つまりCloudFront無しでも配信は可能だが、CloudFront無しだとライブ授業のユーザー数には耐えられないため、導入しておいた方がよい。

MediaStore( 映像チャンク置き場 )を作る

MediaStoreは「MediaLiveでエンコードされた映像のチャンクを置く場所」として必要( MediaLiveにはストレージが無いので、別途つくる必要がある ) MediaLiveを作る際にMediaStoreのアドレスを指定する必要があるので、事前に作成する。

チャンネルを作成する

MediaLiveで映像データをエンコードするチャンネルを作成する

管理画面 からログイン

設定例

入力名: dev 入力タイプ: RTMP (プッシュ) Network mode: Public 入力セキュリティグループ: 既存の使用、0.0.0.0/0 入力の送信先: SINGLE_PIPELINE

  1. [チャンネルの作成] をクリック

  2. ( その環境にMediaLive用のロールが無ければ作る必要があるので )テンプレートからロールを作成する

チャンネルテンプレートは[ Live Action ]をベースに作成する事にした。 ( このテンプレートの内容は時代によって変わるようだ。以前よりテンプレートも増えているし内容も異なる )

[ Channel class ] は [ SINGLE PIPELINE ]を選択する。 標準では[ STANDARD ]になっているが、正しく冗長化を試みるとなると、インターネット回線を2つ用意するような話になるので、シンプルに[ SINGLE PIPELINE ]で設定する。

Read more...

MediaLiveで配信中のファイルを結合する

ライブ動画のTS結合方法

高解像度側 現在のチャンク数を確認

$ curl https://live3.test.com/a/live_1080p30.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:1230

現在、1230までチャンク数が進んでいる。

最初から現在までのチャンクをダウンロード ( ユーザから見えるのはCloudFrontであるため、MediaStore経由ではなく、CloudFront経由で取得している。 特にライブ中はMediaStoreの制限にかかるケースがありえるので、直接の取得は避ける ) wgetコマンドでTSファイルを取得

作業ディレクトリ作成

mkdir -p ~/tmp/$(date +%Y%m%d)
cd  ~/tmp/$(date +%Y%m%d)

ファイル取得

for num in $(seq -w 1 1230) ; do echo $num ; wget https://live3.test.com/a/live_1080p30_0${num}.ts ; done

ダウンロードしたファイルリスト作成

for num in $(seq -w 1 1230) ; do echo "file ./live_1080p30_0${num}.ts" >> file_list.txt ; done

結合

ffmpeg -f concat -safe 0 -i file_list.txt -c copy $(date +%Y%m%d).mp4

低解像度側 作業

ファイル取得

Read more...

MediaLiveでテンプレートから作製する

AWSメディアサービスで 動画配信のパラメータを変更して検証するの… 超面倒。

そもそも、都度チャンネル作らなきゃならない設定はなんなの。辛み。 CLIから作りたくなってきた。aws-cliをアップデートするとメディアサービスも使えるようになります!

最初に aws-cliをアップデートする

pip install -U awscli

チャンネルidを取得する

先にチャンネルのIDを確認します。WebUIだと [ MediaLive ]->[ Channels ]->作成したチャンネルのラジオボタンをクリック->[ ID ]の所の数字をメモ

aws medialive describe-channel --region ap-southeast-1 --channel-id チャンネルid > channel_sample.json

CLIからだと

aws medialive list-channels --region ap-southeast-1

で取得できます

チャンネル設定を変更する

上記の describe-channel はユニークであるべきidやチャンネルごとに振られるIPアドレス、ステータスなども出力されてしまいますので削除します。

  • PipelinesRunningCount
  • EgressEndpoints
  • State
  • Id
  • Arn

既にある設定を削除する

注) 下記を実行すると、既にあるチャンネル設定が一つ消えます。高速に検証するため、チャンネル設定を消して作ってを行っていますが、サービスするようになったら変更する必要があるでしょう。

上記のチャンネルidを取得する方法を利用して、既存のチャンネル設定を削除しています。

aws medialive delete-channel --region ap-southeast-1 --channel-id $(aws medialive list-channels --region ap-southeast-1 | jq -r '.Channels[].Id')

jsonからチャンネルを作る

aws medialive create-channel  --region ap-southeast-1  --cli-input-json file://channel_sample.json

チャンネルをスタートする

aws medialive start-channel --region ap-southeast-1 --channel-id $(aws medialive list-channels --region ap-southeast-1 | jq -r '.Channels[].Id')

チャンネルをストップする

aws medialive stop-channel --region ap-southeast-1 --channel-id (aws medialive list-channels --region ap-southeast-1 | jq -r '.Channels[].Id')
Read more...

MediaLiveをCloudWatchで監視する

背景

MediaLive ですが、いろいろなエラーを通知してくれます。

やれ「RTMP 接続が切れたよ」とか「オーディオ入力 or ビデオ入力が無いよ」とかですね。 通常、ライブ配信が始まる前は当然、MediaLive への入力は無いはずなので、通知は構わないのですが、 ライブ配信中に出ると、それはもうトラブルシューティングの情報の一つとして重要なものになります。 ( というか当初、エラーは出てるっぽいし、挙動はおかしいんだけど、どんなエラーが出てるか分からないケースがあって窮地な時がありました )

今は管理画面の[ channels ]->[ 目的のチャンネル ]->[ Alerts ]から確認できます。が、ログとして残しておくのは良い事だと思います。 このエラー出力のフォーマットは決まっている訳ではなく、たまに変わります。ので 『あー、エラー出力が変わったからアラートが上がらなくなったのね』、という事がログを残しておくと分かります。

手順

WebUI

SNS トピック作成

  • SNS のページ( https://ap-northeast-1.console.aws.amazon.com/sns/ )を開く

  • [ トピック ]->[ 新しいトピックの作成 ]->トピック名の入力、私は[ MediaLiveEvent ]、表示名[ MediaLiveEvent ]と入れてみた

  • 作成したトピックの ARN をコピペ arn:aws:sns:ap-northeast-1:123456789012:MediaLiveEvent

  • 同じ SNS 内の左側メニュー->[ サブスクリプションの作成 ]

  • [ トピック ARN ]に先程作成した MediaLive のトピックの ARN を入力

  • プロトコル メール(ほかにも lambda とかから Slack に送信できたりする)

  • エンドポイント : 自分のメールアドレス

はじめてのアラートメール設定の場合、AWS から確認のメールが飛ぶ

  • [ AWS Notification - Subscription Confirmation ]という件名のメールがあったらメール本文内のリンクをクリック

CloudWatch

  • cloudwatch のページに移動*
  • [ イベント ]->[ ルールの作成 ]
  • [ イベントパターン ]になってること
  • [ カスタムイベントパターン ]に変更 カスタムイベントパターンの内容としては下記を入力
{
  "source": [
    "aws.medialive"
  ]
}
  • 右側の[ ターゲットの追加 ]->[ SNS トピック ]に変更->[ トピック ]はプルダウンメニューから先程、作成した SNS のトピックを選択
  • [ 設定の詳細 ]
  • ルールの定義
  • 名前: 任意
  • 説明: 任意
  • [ ルールの作成 ]
  • メールボックスを確認

CLI

参考: SNS をコマンドラインから設定する : 電子の密林を開拓する

Read more...

MediaLive+MediaStore+CloudFrontで手軽に動画配信

2018年初頭 ライブ配信基盤を AdobeMdiaServer から MediaLive によるライブ配信に切り替えました。 2020年以降ですとVimeo Liveが有力候補です。

背景

  • 動画配信システムだけで良いのでシンプルに立てたい( カメラの映像を手っ取り早くユーザに届けたい )
  • 必要なときだけ配信システムを立てて終了したい。
  • 似たような案件ができたときに、似たようなシステムをスピーディーに構築したい
  • 現状、EC2 で AdobeMediaServer 立ててライブ配信している
  • AdobeMediaServer のバージョンアップ? <- それに伴う検証したいか、というと検証工数を割きづらい…
  • その点、AWS 上のサービスなら、後から機能追加があったりする。
  • 今回は使っていませんが、CMAF 対応が追加された。機能追加の検証をクラウドベンダがやってくれて、我々はその時間をもっと別な事に使える。あるいは早く帰れてハッピー。
  • 逆に「我々は配信方法で独自のチャレンジをして差別化を狙うぜ」には向いてない(現状、弊社的にそこでチャレンジはしてない)その観点でのチャレンジは EC2 上で構築した方が様々な戦術がとり得る
  • 何か仕様変更に伴う負荷上昇(対応ビットレートの追加とか)に対する検証工数がビジネスに繋がりにくい

なぜ、MediaService?

  • AWS で費用をまとめられる。あとトラフィックが増えた場合、ネットワーク費用のディスカウントができるかもという。
  • lambda から配信システムの起動/終了とかできそう
  • Azure も魅力的に見える。ただ CLI や API での操作ってどうやるんだろうか、という調査に時間とられそうだった(その点、AWS なら手軽に CLI で操作できるのは知っていった)

システム構成

カメラ -> エンコーダー -> MediaLive -> MediaStore -> CloudFront -> Safari

CDN でコストを下げつつ、ライブ配信したい構成ですね。

それぞれの役割は

  • MediaLive: RTMP などカメラからの情報を受け付ける。目的の動画フォーマットにエンコードする。ただ、これ自体にはストレージ機能は無い。

  • MediaStore: CloudFront と経由するためのストレージ

  • CloudFront: MediaStore に貯められた

それぞれを構築する順序だが、MediaLive の設定で「どこに動画データを貯めるのか」という設定が必要なため、 MediaStore の設定から行う

Read more...

AWS MediaLive + MediaPackageを使ってライブ配信

目的

2017/11 にリリースされた AWS メディアサービスを使って、ラクして動画配信したい。 できる限り遅延は無い方向で! まずざっくりとした使い方を把握して、どの程度、細かく設定できるのか知りたい! ( 実際のスマホでの確認までではなく、PC 上でエンコードされたライブが見えるところまでが今回のゴール )

作りたいシステム構成

ライブカメラ -> Wirecast -> RTMP(ないし RTSP) -> エンコーダー -> CDN -> ユーザ

CDN 使うと大規模に安く配信できるので使いたい。が、当然できる限り遅延は少なくしたい。

感想

あとマルチビットレートの設定が最初から入っているのとか、冗長化を初めから考慮されてる設定は素敵。 2017/12/04 時点では、MediaPackage で選択可能な配信フォーマットは HLS のみでした。Mpeg-DASH とか必要な場合は、対応待ちです。

ただ、UI というか画面遷移が迷うところが多いし、一通り設定が完了しないと、 カメラからのデータを送れないしで、挫けそうになりました。この辺は時間が解決してくれるよ!という気持ちで。

背景

EC2 で wowza や AdobeMediaServer 立てて運用するのはもちろんありだし、カスタマイズ性はこちらの方が高そうではある(インスタンスプランも選択できるし) が、運用コストはかかるのでありできれば減らしたい。

AWS メディアサービスって?(複数サービスの集合でした)

参考 クラウドベースの映像処理、保存、収益化 classmethod 様

2017/12 現在、MediaConvert、MediaLive、MediaPackage、MediaStore、MediaTailor という 5 つのサービスで構成されています。 このうち、自分に必要そうな『MediaLive』『MediaPackage』のみを使ってみました。 VOD、および他動画解析サービスなどと連携する場合は S3 に保存する MediaStore も併せて使う必要があるかもしれません。

設定方法

MediaLive について

(先に MediaPackage から設定する必要があります ) 当初、名前に Live ってあるし、MediaLive だけで完結できるか?と思いきやできず… なんか、CDN から見えるはずのオリジンサーバに該当する設定が無くね? どこで作るの? と見つからなかった。 MediaLive は「カメラから入ってきたデータをエンコードして Push する」という機能までなので、 それを「CDN などから Pull するための機能は『MediaPackage』が担当する」という事に気づかなかった。ので先に MediaPackage の設定から行う必要があります。

Read more...

MediaService関連で知ったこまごまとした事

RTMPの接続が切れた場合どうするか

チャンネルのグローバル設定にありそう

グローバル構成 - 入力損失の動作

グローバル構成設定。 Input Loss Behaviorフィールドは、AWS Elemental MediaLiveが入力ロスを処理する方法を変更します。 AWS Elemental MediaLiveは、入力が予定時刻内に到着していないことを検出すると、前のフレームを設定可能なミリ秒数(ゼロから永遠に)繰り返します。 その時間が経過すると、設定可能なミリ秒数(ゼロから永遠)の黒いフレームが表示されます。 その時間が経過すると、指定されたスレートまたは指定された色に切り替わります。 入力が再開されると、通常の取り込みが続行されます。

この動作を変更することができます。入力損失動作で、入力損失動作を選択します。 表示されるフィールドにはデフォルト値が表示されます。 必要に応じてフィールドを変更します。 後でデフォルトの動作に戻したい場合は、Input Loss BehaviorをDisabledに設定するだけです。

TSファイルを確認する

ffmpeg内のツールの ffprobeを使う -show_frames

フレームごとの情報を取得する( かなり出力されるのでlessで見る )

キーフレームを30秒ごとに入れると、videoとaudioで30フレーム分の情報を見ることになるのでかなり出力される。

ffprobe -show_frames hoge.ts  | less

フォーマットを確認する

❯ ffprobe -show_format hoge.ts
ffprobe version 3.3.2 Copyright (c) 2007-2017 the FFmpeg developers
  built with Apple LLVM version 8.1.0 (clang-802.0.42)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
  libavutil      55. 58.100 / 55. 58.100
  libavcodec     57. 89.100 / 57. 89.100
  libavformat    57. 71.100 / 57. 71.100
  libavdevice    57.  6.100 / 57.  6.100
  libavfilter     6. 82.100 /  6. 82.100
  libavresample   3.  5.  0 /  3.  5.  0
  libswscale      4.  6.100 /  4.  6.100
  libswresample   2.  7.100 /  2.  7.100
  libpostproc    54.  5.100 / 54.  5.100
Input #0, mpegts, from 'hoge.ts':
  Duration: 00:00:01.06, start: 27410.447556, bitrate: 1105 kb/s
  Program 1
    Stream #0:0[0x1e1]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 320x240 [SAR 4:3 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x1e2](und): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 192 kb/s
[FORMAT]
filename=hoge.ts
nb_streams=2
nb_programs=1
format_name=mpegts
format_long_name=MPEG-TS (MPEG-2 Transport Stream)
start_time=27410.447556
duration=1.064000
size=147016
bit_rate=1105383
probe_score=50
[/FORMAT]
Read more...