LoginSignup
2
3

Azure Media Services の移行・お引越し・Migration: MediaKind 編 (2) MKPlayer 設定

Posted at

さて。前回から間が空きました。

前回は Azure Media Service の Dynamic Packaging 用にエンコードされたファイル。そのファイルを MK/IO から参照できるようにした状態で。

続きをやっていきましょう😎
MKPlayer の組み込みを実施します。具体的には HTML としての埋め込みですね。

作戦

MKPlayer は、npm のパッケージとして提供されています。そのため、ローカルの Player 環境で web アプリへ組み込みます。Webアプリは、Azure Static Web App で動かします。ローカルだと動かないです😅

ドキュメントはこちらですね。

Azure Static Web Apps のドキュメントはこちら。

必要なもの

  • Azure の Subscription
    • Web アプリのホスティングが必要です
  • MK/IO の契約
    • これは前回の手順で
  • GitHub のアカウント
    • Azure Static Web Apps にアプリをデプロイするために使います

手順

前回の続きとなります。

事前にMK/IO の Streaming Endpoint を起動させるのをお忘れなきように。

1. MK/IO ポータルでの動作確認

[Assets] の画面から、当該ファイルの動作確認を行います。
はい、再生できていますね😊

image.png

で。
DASHHLSの2つのURLが取得できます。これは、Azure Media Service と同じ書式ですね。
で、双方 CMAF のコンテナである点にも留意ください。ファイルとしては同じですので CDN のキャッシュも有効活用できます。素晴らしい。

これが、実際のHLS の URLです。

| https://ep-dahatakeorigin01-dahatakemediakindio.japaneast.streaming.mediakind.com/fa2b4e01-685f-4cd6-aef0-4733d7a513a5/Common_60.ism/manifest(format=m3u8-cmaf)

今、皆さんがアクセスしても動きませんよ😊 Streaming Endpoint をまめに停止させてますから。

次に、[MKPlayer] へ移動します。

[Protocol] は HLSを選択して。
[Source URL] に、先ほどの HLS のURLを貼り付けます

はい。動いていますね。仕組みがわかってきましたね😊

image.png

注意したいのは、画面上部にある MKPlayer のライセンスコードです。
MKPlayer を実際に使う際には、このライセンスコードが必要です。セキュアに扱う必要がありますね。APIから取得するなどして。

image.png

2. Player の作成

MKPlayer は JavaScript のアプリケーションです。HTMLに組み込めば動きます。

2.1. 環境作成

準備していきましょう。

2.1.1. 作業用フォルダーの作成

作業用フォルダーを作成します。そのままPlayerアプリのフォルダー扱いですね。

ここでは、C:\Work\mkplayer としています。

2.1.2. Visual Studio Code の整備

Visual Studio Code を起動します。
こちらのドキュメントが何かあった際のお助けに。

2.2. MKPlayer のインストール

それでは、MKPlayerのインストールをします。

npm i @mediakind/mkplayer

サクッとインストールできました。

image.png

2.3. HTML 作成

ドキュメントに従って進みます。ほぼコピペ😎

まずは、MKPlayer のJavaScript と CSSの参照

<head>
    <title>My Video Player</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- MKPlayer JavaScript and CSS -->
    <script  type="text/javascript"  src="./node_modules/@mediakind/mkplayer/mkplayer.js"></script>
    <link  rel="stylesheet"  href="./node_modules/@mediakind/mkplayer/mkplayer-ui.css">
</head>

そして、body に div タグ

<body>
    <div id="video-container"></div>
</body>

HTML タグで、それぞれを囲って、現状は以下の感じ。
image.png

次に JavaScript で Player の初期化を行います。

// 1. Grab the video container
const videoContainer = document.getElementById("video-container");

// 2. Prepare the player configuration
const playerConfig = {
    key: "PLAYER_LICENSE_HERE",
    playback: {
        muted: true,
        autoplay: true
    },
    // Subscribe to player events
    events: {
        [mkplayer.MKPlayerEvent.Error]: (event) => {
            console.log("Encountered player error: ", JSON.stringify(event));
        },
        [mkplayer.MKPlayerEvent.TimeChanged]: (event) => {
            console.log("Current player position: ", event.time);
        }
    }
};

// 3. Initialize the player with video container and player configuration
let player = new mkplayer.MKPlayer(videoContainer, playerConfig);

各種設定については MKPlayerConfig のドキュメントにあります。

ここでポイントなのが:

key: "PLAYER_LICENSE_HERE"

です。
MK/IO のポータルの [MKPlayer] のページから入手します。ここでは、動作確認を優先するために HTML コードに直接入力します。

警告!

  • 今回作成した GitHub のリポジトリーは、速やかに削除することをおススメします。License Key が History として残ってしまうためです
  • 本番環境で使う際には、API 化して設定するなどして、漏れないように保護してください。

先ほどの図を再度掲載しますね。

image.png

いよいよ 動画のURLを指定します。
HLS と DASH の両方ですね。

const sourceConfig = {
    title: "It's time to Software Engineer!!!",
    description: "Software Engineer の皆さんへのメッセージ。可能性しかない!",
    hls: "https://ep-dahatakeorigin01-dahatakemediakindio.japaneast.streaming.mediakind.com/fa2b4e01-685f-4cd6-aef0-4733d7a513a5/Common_60.ism/manifest(format=m3u8-cmaf)",
    dash: "https://ep-dahatakeorigin01-dahatakemediakindio.japaneast.streaming.mediakind.com/fa2b4e01-685f-4cd6-aef0-4733d7a513a5/Common_60.ism/manifest(format=mpd-time-cmaf)"
};

そして、それを MKPlayer へ設定します。

player.load(sourceConfig)
.then(() => {
    // you can also get notified when subscribed to `SourceLoaded` event.
    console.log("Source loaded successfull!");
})
.catch((error) => {
    console.error("An error occurred while loading the source!");
});

ドキュメントでは、この後クリーンアップをするコードがありますが、ここでは省略します。
Webアプリに組み込む際には、動画の入れ替えがある度にやったほうがいいと思います。つまりイベントハンドルをちゃんとやってね。という事ですね。

コードの全体はこちらです。

<html>
<head>
    <title>My Video Player</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- MKPlayer JavaScript and CSS -->
    <script  type="text/javascript"  src="./node_modules/@mediakind/mkplayer/mkplayer.js"></script>
    <link  rel="stylesheet"  href="./node_modules/@mediakind/mkplayer/mkplayer-ui.css">
</head>

<body>
    <div id="video-container"></div>

    <script>
        // 1. Grab the video container
const videoContainer = document.getElementById("video-container");

// 2. Prepare the player configuration
const playerConfig = {
    key: "(内緒)",
    playback: {
        muted: true,
        autoplay: true
    },
    // Subscribe to player events
    events: {
        [mkplayer.MKPlayerEvent.Error]: (event) => {
            console.log("Encountered player error: ", JSON.stringify(event));
        },
        [mkplayer.MKPlayerEvent.TimeChanged]: (event) => {
            console.log("Current player position: ", event.time);
        }
    }
};

// 3. Initialize the player with video container and player configuration
let player = new mkplayer.MKPlayer(videoContainer, playerConfig);


const sourceConfig = {
    title: "It's time to Software Engineer!!!",
    description: "Software Engineer の皆さんへのメッセージ。可能性しかない!",
    hls: "https://ep-dahatakeorigin01-dahatakemediakindio.japaneast.streaming.mediakind.com/fa2b4e01-685f-4cd6-aef0-4733d7a513a5/Common_60.ism/manifest(format=m3u8-cmaf)",
    dash: "https://ep-dahatakeorigin01-dahatakemediakindio.japaneast.streaming.mediakind.com/fa2b4e01-685f-4cd6-aef0-4733d7a513a5/Common_60.ism/manifest(format=mpd-time-cmaf)"
};


player.load(sourceConfig)
.then(() => {
    // you can also get notified when subscribed to `SourceLoaded` event.
    console.log("Source loaded successfull!");
})
.catch((error) => {
    console.error("An error occurred while loading the source!");
});

    </script>
</body>
</html>

3. GitHub の リポジトリ作成

HTML ファイルをローカルで実行しても、MK Player は動作しません。
そのために、コスト面でもアプリケーションアーキテクチャの面でも理にかない過ぎている Azure Static Web Apps を使います。HTMLだけですからね。

Azure Static Web Apps を使うためには、GitHub のリポジトリがあると便利です。Azure DevOps でもいいです。皆さんの使い慣れたほうを。

ここではGitHubを使います。

GitHub リポジトリーを作成してください。

image.png

4. GitHub のリポジトリーのクローン

ローカル環境にクローンします。
コード書く前に本当はすべき事なんですがね😊

image.png

ここでは GitHub Desktop を使います。Git Clone コマンドでも、何を使ってもいいんです。

image.png

5. 作成したファイルのコピー

GitHub でローカルに持ってきたフォルダーに、先ほどまでの作業フォルダーからのファイルをコピーします。
その際、以下のファイルのコピーは避けます。GitHub Actions で不要なjobが作成されるのを避けるためです。

  • package.json
  • package-lock.json

image.png

6. ローカルでのリポジトリーへのファイルのコミット。そして、プッシュ

ここでは、GitHub Desktop で行っています。
Visual Studio Code でもOK!

image.png

PUSH はファイルの数が多いので。私の環境では1分くらいかかりました。ネットの環境などに依存しますね。

image.png

... README.md 作れば良かったっすね... お恥ずかしい😅

7. Azure Static Web Apps の作成

ポータルから作成します。

image.png

ご参考まで...

image.png

こちらが、デプロイのサンプルです。先ほど作成した GitHub のリポジトリーと連携させます。CDですね😊

image.png

作成を行います。
image.png

はい! 数分で出来ましたー

image.png

GitHub との CD の状況は、Azure Static Web Apps の [デプロイ履歴] から確認できます。

image.png

はい。GitHub の [Actions]から、CDの部分で実行されたジョブの確認ができますね。

image.png

image.png

8. 動作確認

Azure Static Web Apps の[参照]からWebアプリを見てみます。

image.png

動きましたね!

image.png

ブラウザーでパケットを見てみましょう。
Windows 上でのMicrosoft Edge では、MPEG-DASH で通信されているのがわかります。

image.png

まとめ

MKPlayer も、Azure Media Player 同様に、既存の HTML にタグを埋め込むだけで動作することがわかりました。
実際にアプリケーションに組み込む際には以下の実装が必要になる場合もあります。

  • DRM/暗号化の実装
  • APIからの MK Player 用の License Key 取得
  • MK Player とのイベントのサブスクライブ

次回は CDN 連携ですね!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3