<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LiveInstantly, LLC.</title><link>https://www.liveinstantly.com/ja/resources/blog/</link><description>Recent content in ブログ アーカイブ on LiveInstantly</description><generator>Hugo Generator - gohugo.io</generator><language>ja</language><copyright>Copyright &amp;copy; 2020-2022 LiveInstantly, LLC. All rights reserved.</copyright><atom:link href="https://www.liveinstantly.com/ja/resources/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Resources: THEOplayer プレイヤーのデモ Web アプリ</title><link>https://www.liveinstantly.com/ja/resources/blog/theo-player-demo-app/</link><pubDate>Thu, 10 Nov 2022 09:00:00 +0900</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/theo-player-demo-app/</guid><description>&lt;img src="https://www.liveinstantly.com/ja/resources/blog/theo-player-demo-app/featured-screenshot-theoplayer-demo-webapp_hu5ed571e1c25cc6c3b0592b8689a378b3_536779_640x0_resize_catmullrom_3.png" width="640" height="427"/>&lt;p>このブログ記事では、サービスのWeb サイト用に THEOplayer Web SDK と統合された実用的なアプリケーションとして、THEOplayer プレーヤー デモ Web アプリケーションを紹介します。&lt;/p>
&lt;p>THEOplayer は、THEO Technologies によって開発されたユニバーサル ビデオ プレーヤー ソリューションです。 THEOplayer は、複数のプラットフォーム (HTML5 (Web)、Apple iOS、Apple tvOS、Google Android、Google Android TV、Samsumg Tizen、LG webOS、Amazon FireTV、ROKU など) 用のプレーヤー SDK を提供し、HLS、MPEG-DASH、広告、DRM などを様々な機能をサポートします。&lt;/p>
&lt;p>このデモ Web アプリは Nuxt 3、Vue 3、および、Vuetify 3 フレームワークと統合されており、THEOplayer Web SDK で複数のビデオ ストリームの例を再生します。このプレーヤーの例の Git リポジトリを Github で公開しています: &lt;a href="https://github.com/liveinstantly/theoplayer-web-nuxt3-demos" target="_blank">https://github.com/liveinstantly/theoplayer-web-nuxt3-demos&lt;/a>
.詳細はリポジトリを参照してください。&lt;/p>
&lt;p>&lt;img src="./featured-screenshot-theoplayer-demo-webapp.png" alt="Screenshot of THEOplayer Demo Web App">&lt;/p>
&lt;p>このデモ Web アプリは Netlify にデプロイされます。デモ サイト &lt;a href="https://theoplayer.demo.liveinstantly.cloud/" target="_blank">https://theoplayer.demo.liveinstantly.cloud/&lt;/a>
にアクセスして確認してみてください。&lt;/p>
&lt;p>現時点では、THEOplayer Web SDK のデモンストレーションはビデオ ストリームの例のみを使用していますが、THEOplayer Web SDK のより多くの機能とシナリオをデモンストレーションするために、すぐにさらに多くの例を追加する予定です。&lt;/p></description></item><item><title>Resources: Nuxt v3 フレームワークでの THEOplayer プレイヤーアプリの実装例</title><link>https://www.liveinstantly.com/ja/resources/blog/theoplayer-web-nuxt3-example/</link><pubDate>Fri, 28 Oct 2022 09:00:00 +0900</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/theoplayer-web-nuxt3-example/</guid><description>&lt;p>このブログ記事では、シンプルなストリーミング プレーヤー アプリの実装例として、THEOplayer Web SDK と Nuxt3 (Vue3/Viteを利用) フレームワークを統合する方法について説明します。&lt;/p>
&lt;p>THEOplayer は、THEO Technologies によって開発されたユニバーサル ビデオ プレーヤー ソリューションです。 THEOplayer は、複数のプラットフォーム (HTML5 (Web)、Apple iOS、Apple tvOS、Google Android、Google Android TV、Samsumg Tizen、LG webOS、Amazon FireTV、ROKU など) 用のプレーヤー SDK を提供し、HLS、MPEG-DASH、広告、DRM などを様々な機能をサポートします。&lt;/p>
&lt;p>Nuxt は、JavaScript を実行している任意のプラットフォームにデプロイできる最新のパフォーマンスの高い Web アプリケーションを構築するための MIT ライセンスに基づくオープンソース フレームワークです。&lt;/p>
&lt;p>Nuxt はビュー エンジンとして Vue.js を使用します。 Vue 3 の機能はすべて Nuxt で利用できます。 Nuxt の詳細については、&lt;a href="https://v3.nuxtjs.org/getting-started/introduction" target="_blank">Nuxt 3 の紹介&lt;/a>
記事を参照してください。&lt;/p>
&lt;p>このプレーヤーの実装例では、Nuxt3 CLI (nuxi) ツールによって提供されるスターター テンプレートを使って用意され、Nuxt3 およびコンポジション API を使用して、プレイヤーを統合します。&lt;/p>
&lt;p>このプレーヤーの実装例の Git リポジトリを GitHub で公開しています: &lt;a href="https://github.com/liveinstantly/theoplayer-web-vue3-example" target="_blank">https://github.com/liveinstantly/theoplayer-web-vue3-example&lt;/a>
&lt;/p>
&lt;p>詳細は、リポジトリの内容を参照してください。&lt;/p>
&lt;h2 id="theoplayer-web-sdk-を統合するためのステップバイステップ">THEOplayer Web SDK を統合するためのステップバイステップ&lt;/h2>
&lt;h3 id="前提条件">前提条件&lt;/h3>
&lt;p>このガイドでは、次の開発ツールが使用されています。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>開発ツール&lt;/th>
&lt;th style="text-align:right">バージョン&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>npm&lt;/td>
&lt;td style="text-align:right">8.19.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>yarn&lt;/td>
&lt;td style="text-align:right">1.22.5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>node&lt;/td>
&lt;td style="text-align:right">v16.18.0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="1-nuxt3-アプリ-テンプレートを作成する">1. Nuxt3 アプリ テンプレートを作成する&lt;/h3>
&lt;p>次のコマンドを実行して、新規の Nuxt3 アプリケーション テンプレートを作成します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">npx nuxi init theoplayer-web-nuxt3-example
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>コマンド出力は次のようになります。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">yarn install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yarn install v1.22.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">info No lockfile found.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[1/4] Resolving packages...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[2/4] Fetching packages...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> :
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[4/4] Building fresh packages...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">success Saved lockfile.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ nuxt prepare
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Nuxi 3.0.0-rc.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">√ Types generated in src/.nuxt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Done in 5.76s.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-nuxt3-ソースコード群を-src-ディレクトリに移動する">2. Nuxt3 ソースコード群を &lt;code>./src&lt;/code> ディレクトリに移動する&lt;/h3>
&lt;p>これは任意のステップですが、本リポジトリでは &lt;code>src&lt;/code> ディレクトリを利用します。&lt;/p>
&lt;p>Vue Web アプリケーションでは、プロジェクトのルート ディレクトリの下の &lt;code>./src&lt;/code> ディレクトリ内のソース ファイル/ディレクトリにソースコード群が配置されることを期待されてますが、Nuxt Web アプリケーションの既定では、ソース ファイル/ディレクトリがルート プロジェクト ディレクトリの下に、ソースコード群がフラットに配置されることが期待されています。混乱を避けるため、このリポジトリでは、Nuxt Web アプリケーションのソースコードを &lt;code>./src&lt;/code> ディレクトに移動します。&lt;/p>
&lt;p>Nuxt3 Web アプリケーションのソース ファイル/ディレクトリを移動する場合は、以下の手順に従ってください:&lt;/p>
&lt;h4 id="21-src-ディレクトリを作成しappvue-を-src-に移動する">2.1. &lt;code>src&lt;/code> ディレクトリを作成し、&lt;code>app.vue&lt;/code> を &lt;code>./src&lt;/code> に移動する&lt;/h4>
&lt;p>Nuxt3 アプリのスターター テンプレートを作成したら、次のコマンドを実行します:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">mkdir src &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> mv app.vue ./src/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="22-tsconfigjson-を変更する">2.2. &lt;code>tsconfig.json&lt;/code> を変更する&lt;/h4>
&lt;p>以下のように &lt;code>./tsconfig.json&lt;/code> を変更します: &lt;code>extend&lt;/code> プロパティを &lt;code>./.nuxt/tsconfig.json&lt;/code> から &lt;code>./src/.nuxt/tsconfig.json&lt;/code> に変更します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// https://v3.nuxtjs.org/concepts/typescript
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="s2">&amp;#34;extends&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;./src/.nuxt/tsconfig.json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-必要なコンポーネントをインストールする">3. 必要なコンポーネントをインストールする&lt;/h3>
&lt;p>次のコマンドを実行して、Vue フレームワーク パッケージの依存関係をインストールします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yarn install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>yarn コマンド出力の &lt;code>esbuild&lt;/code> モジュールに関する情報メッセージは無視できます。&lt;/p>
&lt;/blockquote>
&lt;h3 id="4theoplayer-を統合する">4.THEOplayer を統合する&lt;/h3>
&lt;h4 id="41-モジュール宣言の追加-theoplayerdts">4.1 モジュール宣言の追加 (THEOplayer.d.ts)&lt;/h4>
&lt;p>次のコマンドを実行して、THEOplayer Web SDK の型定義モジュールを含む theoplayer NPM パッケージをインストールします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yarn add theoplayer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="42-theoplayer-web-sdk-の-playervue-を追加">4.2 THEOplayer Web SDK の &lt;code>Player.vue&lt;/code> を追加&lt;/h4>
&lt;p>次のコードを &lt;code>src/components&lt;/code> フォルダに &lt;code>Player.vue&lt;/code> として追加します。
このコードは Vue3 Composition API に基づいており、上位の（親の）コンポーネントから指定された &lt;code>source&lt;/code> 配列変数を引数として使って、プレイヤーが動作します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">setup&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;ts&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">ref&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">onMounted&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;vue&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">theoplayer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">ref&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">HTMLElement&lt;/span> &lt;span class="err">|&lt;/span> &lt;span class="na">null&lt;/span>&lt;span class="p">&amp;gt;(&lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">props&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">defineProps&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="p">{&lt;/span> &lt;span class="nx">source&lt;/span>: &lt;span class="kt">Array&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">any&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">playerInit() {&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">THEOplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Player&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fluid&lt;/span>: &lt;span class="kt">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">libraryLocation&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;//cdn.theoplayer.com/dash/theoplayer/&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">player&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">sources&lt;/span>: &lt;span class="kt">props.source&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">onMounted&lt;/span>&lt;span class="p">(()&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">playerInit&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;theoplayer-container video-js theoplayer-skin vjs-16-9 theoplayer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ref&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;theoplayer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">style&lt;/span> &lt;span class="na">scoped&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">container&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">margin&lt;/span>: &lt;span class="kt">0&lt;/span> &lt;span class="nx">auto&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">padding&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">top&lt;/span>: &lt;span class="kt">28.13&lt;/span>&lt;span class="o">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">width&lt;/span>: &lt;span class="kt">50&lt;/span>&lt;span class="o">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="43-welcomevue-と-nuxtlogovue-を追加する">4.3 &lt;code>Welcome.vue&lt;/code> と &lt;code>NuxtLogo.vue&lt;/code> を追加する&lt;/h4>
&lt;p>次のコードを &lt;code>src/components&lt;/code> フォルダーに &lt;code>Welcome.vue&lt;/code> および &lt;code>NuxtLogo.vue&lt;/code> として追加します:&lt;/p>
&lt;p>&lt;code>Welcome.vue&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">setup&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;ts&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">Player&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;./Player.vue&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">ref&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;vue&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">ref&lt;/span>&lt;span class="p">([&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;application/x-mpegurl&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">src&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;//cdn.theoplayer.com/video/elephants-dream/playlist.m3u8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;container&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">NuxtLogo&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">h1&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;span class="nx">Welcome&lt;/span> &lt;span class="nx">to&lt;/span> &lt;span class="nx">Nuxt&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">h1&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Player&lt;/span> &lt;span class="err">:&lt;/span>&lt;span class="na">source&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;source&amp;#34;&lt;/span> &lt;span class="na">v&lt;/span>&lt;span class="err">-&lt;/span>&lt;span class="na">if&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;source&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">body&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">margin&lt;/span>: &lt;span class="kt">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">container&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">height&lt;/span>: &lt;span class="kt">100vh&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">width&lt;/span>: &lt;span class="kt">100vw&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">background&lt;/span>: &lt;span class="kt">rgb&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">42&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">53&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">display&lt;/span>: &lt;span class="kt">flex&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">flex&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">direction&lt;/span>: &lt;span class="kt">column&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">align&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">items&lt;/span>: &lt;span class="kt">center&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">justify&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">content&lt;/span>: &lt;span class="kt">center&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">h1&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">color&lt;/span>: &lt;span class="kt">white&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">text&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">align&lt;/span>: &lt;span class="kt">center&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">font&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">family&lt;/span>: &lt;span class="kt">helvetica&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">arial&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">sans&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">serif&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">font&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">weight&lt;/span>: &lt;span class="kt">400&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>NuxtLogo.vue&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">svg&lt;/span> &lt;span class="na">viewBox&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;0 0 221 65&amp;#34;&lt;/span> &lt;span class="na">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;none&amp;#34;&lt;/span> &lt;span class="na">xmlns&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;http://www.w3.org/2000/svg&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;h-8&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">g&lt;/span> &lt;span class="na">clip&lt;/span>&lt;span class="err">-&lt;/span>&lt;span class="na">path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;url(#a)&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">path&lt;/span> &lt;span class="na">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;currentColor&amp;#34;&lt;/span> &lt;span class="na">d&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;M82.5623 18.5705h7.3017l15.474 24.7415V18.5705h6.741v35.0576h-7.252L89.3025 28.938v24.6901h-6.7402V18.5705ZM142.207 53.628h-6.282v-3.916c-1.429 2.7559-4.339 4.3076-8.015 4.3076-5.822 0-9.603-4.1069-9.603-10.0175V28.3847h6.282v14.3251c0 3.4558 2.146 5.8592 5.362 5.8592 3.524 0 5.974-2.7044 5.974-6.4099V28.3847h6.282V53.628ZM164.064 53.2289l-6.026-8.4144-6.027 8.4144h-6.69l9.296-13.1723-8.58-12.0709h6.843l5.158 7.2641 5.106-7.2641h6.895l-8.632 12.0709 9.295 13.1723h-6.638ZM183.469 20.7726v7.6116h7.149v5.1593h-7.149v12.5311c0 .4208.17.8245.473 1.1223.303.2978.715.4654 1.144.4661h5.532v5.9547h-4.137c-5.617 0-9.293-3.2062-9.293-8.8109V33.5484h-5.056v-5.1642h3.172c1.479 0 2.34-.8639 2.34-2.2932v-5.3184h5.825Z&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">path&lt;/span> &lt;span class="na">fill&lt;/span>&lt;span class="err">-&lt;/span>&lt;span class="na">rule&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;evenodd&amp;#34;&lt;/span> &lt;span class="na">clip&lt;/span>&lt;span class="err">-&lt;/span>&lt;span class="na">rule&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;evenodd&amp;#34;&lt;/span> &lt;span class="na">d&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;M30.1185 11.5456c-1.8853-3.24168-6.5987-3.24169-8.484 0L1.08737 46.8747c-1.885324 3.2417.47133 7.2938 4.24199 7.2938H21.3695c-1.6112-1.4081-2.2079-3.8441-.9886-5.9341l15.5615-26.675-5.8239-10.0138Z&amp;#34;&lt;/span> &lt;span class="na">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#80EEC0&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">path&lt;/span> &lt;span class="na">d&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;M43.1374 19.2952c1.5603-2.6523 5.461-2.6523 7.0212 0l17.0045 28.9057c1.5603 2.6522-.39 5.9676-3.5106 5.9676h-34.009c-3.1206 0-5.0709-3.3154-3.5106-5.9676l17.0045-28.9057ZM209.174 53.8005H198.483c0-1.8514.067-3.4526 0-6.0213h10.641c1.868 0 3.353.1001 4.354-.934 1-1.0341 1.501-2.3351 1.501-3.9029 0-1.8347-.667-3.2191-2.002-4.1532-1.301-.9674-2.985-1.4511-5.054-1.4511h-2.601v-5.2539h2.652c1.701 0 3.119-.4003 4.253-1.2009 1.134-.8006 1.701-1.9849 1.701-3.5527 0-1.301-.434-2.3351-1.301-3.1023-.834-.8007-2.001-1.201-3.503-1.201-1.634 0-2.918.4837-3.853 1.4511-.9.9674-1.401 2.1517-1.501 3.5527h-6.254c.133-3.2358 1.251-5.7877 3.352-7.6558 2.135-1.868 4.887-2.8021 8.256-2.8021 2.402 0 4.42.4337 6.055 1.301 1.668.834 2.919 1.9515 3.753 3.3525.867 1.4011 1.301 2.9523 1.301 4.6536 0 1.9681-.551 3.636-1.651 5.0037-1.068 1.3344-2.402 2.235-4.004 2.7021 1.969.4003 3.57 1.3677 4.804 2.9022 1.234 1.5011 1.852 3.4025 1.852 5.7043 0 1.9347-.468 3.7028-1.402 5.304-.934 1.6012-2.301 2.8855-4.103 3.8529-1.768.9674-3.953 1.4511-6.555 1.4511Z&amp;#34;&lt;/span> &lt;span class="na">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#00DC82&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">g&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">defs&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">clipPath&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">path&lt;/span> &lt;span class="na">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#fff&amp;#34;&lt;/span> &lt;span class="na">d&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;M0 0h221v65H0z&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">clipPath&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">defs&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">svg&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">svg&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">width&lt;/span>: &lt;span class="kt">50vw&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="44-srcglobaldts-に-theoplayer-の型宣言の読み込みを追加する">4.4 &lt;code>src/global.d.ts&lt;/code> に THEOplayer の型宣言の読み込みを追加する&lt;/h4>
&lt;p>次のスクリプト コードを &lt;code>src/global.d.ts&lt;/code> として追加します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Import types for THEOplayer
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="nx">theoplayer&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;theoplayer&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">declare&lt;/span> &lt;span class="kr">global&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">interface&lt;/span> &lt;span class="nx">Window&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">THEOplayer&lt;/span>: &lt;span class="kt">typeof&lt;/span> &lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="45-appvue-に-theoplayer-javascriptcss-モジュールを追加する">4.5 &lt;code>app.vue&lt;/code> に THEOplayer JavaScript/CSS モジュールを追加する&lt;/h4>
&lt;p>次のセクションを &lt;code>src/app.vue&lt;/code> に追加して、THEOplayer CSS と JavaScript をインポートします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">setup&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;ts&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">useHead&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">meta&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;viewport&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">content&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;width=device-width, initial-scale=1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">link&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">rel&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;stylesheet&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">href&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;https://cdn.theoplayer.com/dash/theoplayer/ui.css&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">script&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;text/javascript&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">src&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https:/cdn.theoplayer.com/dash/theoplayer/THEOplayer.js&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">body&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="45-appvue-のコンポーネントを変更する">4.5 &lt;code>app.vue&lt;/code> のコンポーネントを変更する&lt;/h4>
&lt;p>このサンプル Web アプリで THEOplayer をレンダリングするには、&lt;code>src/app.vue&lt;/code> で &lt;code>NuxtWelcome&lt;/code> コンポーネントを (セクション 4.3 で作成された) &lt;code>Welcome&lt;/code> コンポーネントに変更します:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Welcome&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-このサンプル-アプリケーション-コードを実行しブラウザで開きます">5. このサンプル アプリケーション コードを実行し、ブラウザで開きます&lt;/h3>
&lt;p>次のコマンドを実行して、コードをコンパイルし、ローカル サーバーを実行して、サンプル アプリケーションをホストします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yarn dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>コマンド出力は次のようになります。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Nuxi 3.0.0-rc.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Nuxt 3.0.0-rc.12 with Nitro 0.6.0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;gt; Local: http://localhost:3000/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">i Vite client warmed up in 2321ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">√ Nitro built in 734 ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>localhost&lt;/code> のホスト名と指定されたポートでアプリケーションを参照して、Vue3 Web アプリケーションの動作を確認できます。&lt;/p>
&lt;p>このアプリケーション実装例では、一般に公開されているビルトイン ライセンス付きの THEOplayer プレーヤー SDK を使用しているため、明示的なライセンスなしで THEOplayer の再生機能を有効にすることができますが、ビルトイン ライセンスでは ホワイトリストに登録されたホスト名として &lt;code>localhost&lt;/code> での動作のみが許可されます。 これは、&lt;code>localhost&lt;/code> 以外でこのアプリケーションを実行すると、エラー メッセージ (&amp;quot;&lt;em>The given license is invalid!&lt;/em>&amp;quot;) が表示されることを意味します。&lt;/p>
&lt;p>スクリーンショットは次のとおりです:&lt;/p>
&lt;p>&lt;img src="./screenshot-nuxt3-theoplayer-example.png" alt="Screenshot of THEOplayer Nuxt3 application example">&lt;/p>
&lt;h2 id="ローカルの-theoplayer-web-sdk-を使用する">ローカルの THEOplayer Web SDK を使用する&lt;/h2>
&lt;p>独自の THEOplayer Web SDK を使用する場合は、(カスタマイズされた) Web SDK をホストする URL を参照するように変更するか、Web SDK を Nuxt3 ソース ツリーの &lt;code>src/public&lt;/code> フォルダーに配置する必要があります。&lt;/p>
&lt;p>次に、以下のファイルを変更して、THEOplayer SDK (JS/CSS とライブラリ) の場所を適切に指定する必要があります。&lt;/p>
&lt;p>また、Player クラスの引数に、THEOplayer のポータルで取得したライセンスを設定する必要があります。&lt;/p>
&lt;ul>
&lt;li>&lt;code>src/app.vue&lt;/code>&lt;/li>
&lt;li>&lt;code>src/components/Player.vue&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>例えば、SDK ファイルを &lt;code>src/public/js/theoplayer&lt;/code> フォルダーに配置すると、&lt;code>src/app.vue&lt;/code> と &lt;code>src/components/Player.vue&lt;/code> は次のようになります:&lt;/p>
&lt;p>&lt;code>src/app.vue&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">setup&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;ts&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">useHead&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">meta&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;viewport&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">content&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;width=device-width, initial-scale=1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">link&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">rel&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;stylesheet&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">href&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;/js/theoplayer/ui.css&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">script&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;text/javascript&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">src&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;/js/theoplayer/THEOplayer.js&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">body&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>src/components/Player.vue&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">THEOplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Player&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fluid&lt;/span>: &lt;span class="kt">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">libraryLocation&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;/js/theoplayer/&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">license&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;ライセンス文字列&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="最後に">最後に&lt;/h2>
&lt;p>この記事では、シンプルなプレーヤー アプリの実装例として、THEOplayer Web SDK と Nuxt v3 フレームワークを統合する方法について説明しました。&lt;/p>
&lt;p>GitHub のリポジトリでこのサンプル アプリのソースコードを参照してください: &lt;a href="https://github.com/liveinstantly/theoplayer-web-nuxt3-example" target="_blank">https://github.com/liveinstantly/theoplayer-web-nuxt3-example&lt;/a>
&lt;/p>
&lt;p>ご不明な点がございましたら、お気軽にお問い合わせください。&lt;/p></description></item><item><title>Resources: Vue3 フレームワークでの THEOplayer プレイヤーアプリの実装例</title><link>https://www.liveinstantly.com/ja/resources/blog/theoplayer-vue3-example/</link><pubDate>Fri, 28 Oct 2022 09:00:00 +0900</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/theoplayer-vue3-example/</guid><description>&lt;p>このブログ記事では、シンプルなストリーミング プレーヤー アプリの実装例として、THEOplayer Web SDK と Vue.js v3 フレームワークを統合する方法について説明します。&lt;/p>
&lt;p>THEOplayer は、THEO Technologies によって開発されたユニバーサル ビデオ プレーヤー ソリューションです。 THEOplayer は、複数のプラットフォーム (HTML5 (Web)、Apple iOS、Apple tvOS、Google Android、Google Android TV、Samsumg Tizen、LG webOS、Amazon FireTV、ROKU など) 用のプレーヤー SDK を提供し、HLS、MPEG-DASH、広告、DRM などを様々な機能をサポートします。&lt;/p>
&lt;p>Vue は、ユーザー インターフェイスを構築するための進歩的な JavaScript フレームワークです。これは、標準の HTML/CSS/JavaScript の上に構築され、宣言型のコンポーネント ベースのプログラミング モデルを提供します。Vue エコシステムは、フロントエンド開発に必要な一般的な機能のほとんどをカバーしています。しかし、Web は非常に多様で、私たちが Web 上に構築するものは、形態や規模が大幅に異なる場合があります。 Vue は、こういった様々なシナリオに対して、柔軟で段階的に採用できるように設計されています。ユースケースに応じて、Vue はさまざまな方法で使用できます。このため、近年では人気の開発フレームワークになってきています。&lt;/p>
&lt;ul>
&lt;li>ビルドステップなしで静的 HTML を強化する&lt;/li>
&lt;li>任意のページに Web コンポーネントとして埋め込む&lt;/li>
&lt;li>シングルページ アプリケーション (SPA)&lt;/li>
&lt;li>フルスタック / サーバーサイド レンダリング (SSR)&lt;/li>
&lt;li>Jamstack / 静的サイト生成 (SSG)&lt;/li>
&lt;li>デスクトップ、モバイル、WebGL などの様々なプラットフォームをターゲットとする&lt;/li>
&lt;/ul>
&lt;p>このプレーヤーの実装例では、Vue CLI ツールによって提供されるスターター テンプレートを使って用意され、Vue3/Vite およびコンポジション API を使用して、プレイヤーを統合しています。&lt;/p>
&lt;p>このプレーヤーの実装例の Git リポジトリを GitHub で公開しています: &lt;a href="https://github.com/liveinstantly/theoplayer-web-vue3-example" target="_blank">https://github.com/liveinstantly/theoplayer-web-vue3-example&lt;/a>
&lt;/p>
&lt;p>詳細は、リポジトリの内容を参照してください。&lt;/p>
&lt;h2 id="theoplayer-web-sdk-を統合するためのステップバイステップ">THEOplayer Web SDK を統合するためのステップバイステップ&lt;/h2>
&lt;h3 id="前提条件">前提条件&lt;/h3>
&lt;p>このガイドでは、次の開発ツールが使用されています。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>開発ツール&lt;/th>
&lt;th style="text-align:right">バージョン&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>npm&lt;/td>
&lt;td style="text-align:right">8.19.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>yarn&lt;/td>
&lt;td style="text-align:right">1.22.5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>node&lt;/td>
&lt;td style="text-align:right">v16.18.0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="1-vue3-アプリ-テンプレートを作成する">1. Vue3 アプリ テンプレートを作成する&lt;/h3>
&lt;p>次のコマンドを実行して、新規の Vue3 アプリケーション テンプレートを作成します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yarn create vite theoplayer-web-vue-example --template vue-ts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>コマンド出力は次のようになります。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">yarn create v1.22.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[1/4] Resolving packages...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[2/4] Fetching packages...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[3/4] Linking dependencies...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[4/4] Building fresh packages...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">success Installed &amp;#34;create-vite@3.1.0&amp;#34; with binaries:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - create-vite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - cva
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Scaffolding project in C:\srcs\THEOplayer\theoplayer-web-vue-example...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Done. Now run:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cd theoplayer-web-vue-example
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> yarn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> yarn dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Done in 14.52s.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-必要なコンポーネントをインストールする">2. 必要なコンポーネントをインストールする&lt;/h3>
&lt;p>次のコマンドを実行して、Vue フレームワーク パッケージの依存関係をインストールします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yarn install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>yarn コマンド出力の &lt;code>esbuild&lt;/code> モジュールに関する情報メッセージは無視できます。&lt;/p>
&lt;/blockquote>
&lt;h3 id="3theoplayer-を統合する">3.THEOplayer を統合する&lt;/h3>
&lt;h4 id="31-モジュール宣言の追加-theoplayerdts">3.1 モジュール宣言の追加 (THEOplayer.d.ts)&lt;/h4>
&lt;p>次のコマンドを実行して、THEOplayer Web SDK の型定義モジュールを含む theoplayer NPM パッケージをインストールします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yarn add theoplayer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="32-theoplayer-web-sdk-の-playervue-を追加">3.2 THEOplayer Web SDK の &lt;code>Player.vue&lt;/code> を追加&lt;/h4>
&lt;p>次のコードを &lt;code>src/components&lt;/code> フォルダに &lt;code>Player.vue&lt;/code> として追加します。
このコードは Vue3 Composition API に基づいており、上位の（親の）コンポーネントから指定された &lt;code>source&lt;/code> 配列変数を引数として使って、プレイヤーが動作します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">setup&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;ts&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">ref&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">onMounted&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;vue&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">theoplayer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">ref&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">HTMLElement&lt;/span> &lt;span class="err">|&lt;/span> &lt;span class="na">null&lt;/span>&lt;span class="p">&amp;gt;(&lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">props&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">defineProps&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="p">{&lt;/span> &lt;span class="nx">source&lt;/span>: &lt;span class="kt">Array&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">any&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">playerInit() {&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">THEOplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Player&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fluid&lt;/span>: &lt;span class="kt">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">libraryLocation&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;//cdn.theoplayer.com/dash/theoplayer/&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">player&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">sources&lt;/span>: &lt;span class="kt">props.source&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">onMounted&lt;/span>&lt;span class="p">(()&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">playerInit&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;theoplayer-container video-js theoplayer-skin vjs-16-9 theoplayer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ref&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;theoplayer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">style&lt;/span> &lt;span class="na">scoped&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">container&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">margin&lt;/span>: &lt;span class="kt">0&lt;/span> &lt;span class="nx">auto&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">padding&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">top&lt;/span>: &lt;span class="kt">56.24&lt;/span>&lt;span class="o">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">width&lt;/span>: &lt;span class="kt">100&lt;/span>&lt;span class="o">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="33-playervue-コンポーネントを-appvue-に追加する">3.3 &lt;code>Player.vue&lt;/code> コンポーネントを &lt;code>App.vue&lt;/code> に追加する&lt;/h4>
&lt;p>&lt;code>src/App.vue&lt;/code> の &lt;code>&amp;lt;script setup&amp;gt;&lt;/code> セクション (&lt;code>HelloWorld&lt;/code> コンポーネントをインポートする命令行の後) に、次のスクリプト コードを追加します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">Player&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;./components/Player.vue&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">ref&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;vue&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">source&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">ref&lt;/span>&lt;span class="p">([&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;application/x-mpegurl&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">src&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;//cdn.theoplayer.com/video/elephants-dream/playlist.m3u8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最初の &lt;code>&amp;lt;div&amp;gt;&lt;/code> ブロックの直後の &lt;code>src/App.vue&lt;/code> の &lt;code>&amp;lt;template&amp;gt;&lt;/code> セクションに次の行を追加します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Player&lt;/span> &lt;span class="na">:source&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;source&amp;#34;&lt;/span> &lt;span class="na">v-if&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;source&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="34-maints-に-theoplayer-の型宣言の読み込みを追加する">3.4 &lt;code>main.ts&lt;/code> に THEOplayer の型宣言の読み込みを追加する&lt;/h4>
&lt;p>&lt;code>src/main.ts&lt;/code> の &lt;code>createApp&lt;/code> 関数呼び出しの行の前に、次のスクリプト コードを追加します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Import types for THEOplayer
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="nx">theoplayer&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;theoplayer&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">declare&lt;/span> &lt;span class="kr">global&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">interface&lt;/span> &lt;span class="nx">Window&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">THEOplayer&lt;/span>: &lt;span class="kt">typeof&lt;/span> &lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="35-indexhtml-に-theoplayer-javascriptcss-モジュールを追加する">3.5 &lt;code>index.html&lt;/code> に THEOplayer JavaScript/CSS モジュールを追加する&lt;/h4>
&lt;p>次の行を &lt;code>index.html&lt;/code> の &lt;code>&amp;lt;head&amp;gt;&lt;/code> セクション (&lt;code>&amp;lt;/head&amp;gt;&lt;/code> 行の直前) に追加して、THEOplayer CSS をインポートします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">link&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">rel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;stylesheet&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text/css&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;//cdn.theoplayer.com/dash/theoplayer/ui.css&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>次の行を &lt;code>index.html&lt;/code> の &lt;code>&amp;lt;body&amp;gt;&lt;/code> セクション (&lt;code>&amp;lt;/body&amp;gt;&lt;/code> 行の直前) に追加して、THEOplayer JavaScript コードを読み込みます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text/javascript&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;//cdn.theoplayer.com/dash/theoplayer/THEOplayer.js&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-このサンプル-アプリケーション-コードを実行しブラウザで開きます">4. このサンプル アプリケーション コードを実行し、ブラウザで開きます&lt;/h3>
&lt;p>次のコマンドを実行して、コードをコンパイルし、ローカル サーバーを実行して、サンプル アプリケーションをホストします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">yarn dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>コマンド出力は次のようになります。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">yarn run v1.22.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ vite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> VITE v3.2.0 ready in 750 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ➜ Local: http://127.0.0.1:5174/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ➜ Network: use --host to expose
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>localhost&lt;/code> のホスト名と指定されたポートでアプリケーションを参照して、Vue3 Web アプリケーションの動作を確認できます。&lt;/p>
&lt;p>このアプリケーション実装例では、一般に公開されているビルトイン ライセンス付きの THEOplayer プレーヤー SDK を使用しているため、明示的なライセンスなしで THEOplayer の再生機能を有効にすることができますが、ビルトイン ライセンスでは ホワイトリストに登録されたホスト名として &lt;code>localhost&lt;/code> での動作のみが許可されます。 これは、&lt;code>localhost&lt;/code> 以外でこのアプリケーションを実行すると、エラー メッセージ (&amp;quot;&lt;em>The given license is invalid!&lt;/em>&amp;quot;) が表示されることを意味します。&lt;/p>
&lt;blockquote>
&lt;p>&lt;code>127.0.0.1&lt;/code> でブラウザアクセスを行った場合、ホワイトリストに登録された文字列の &lt;code>localhost&lt;/code> と一致しないため、THEOplayer SDK のプレイヤーは動作しないことに注意してください。&lt;/p>
&lt;/blockquote>
&lt;p>スクリーンショットは次のとおりです:&lt;/p>
&lt;p>&lt;img src="./screenshot-vue3-theoplayer-example.png" alt="Screenshot of THEOplayer Vue3 application example">&lt;/p>
&lt;h2 id="ローカルの-theoplayer-web-sdk-を使用する">ローカルの THEOplayer Web SDK を使用する&lt;/h2>
&lt;p>独自の THEOplayer Web SDK を使用する場合は、(カスタマイズされた) Web SDK をホストする URL を参照するように変更するか、Web SDK を Vue3 ソース ツリーの &lt;code>public&lt;/code> フォルダーに配置する必要があります。&lt;/p>
&lt;p>次に、以下のファイルを変更して、THEOplayer SDK (JS/CSS とライブラリ) の場所を適切に指定する必要があります。&lt;/p>
&lt;p>また、Player クラスの引数に、THEOplayer のポータルで取得したライセンスを設定する必要があります。&lt;/p>
&lt;ul>
&lt;li>index.html&lt;/li>
&lt;li>src/components/Player.vue&lt;/li>
&lt;/ul>
&lt;p>例えば、SDK ファイルを public/js/theoplayer フォルダーに配置すると、index.html と src/components/Player.vue は次のようになります:&lt;/p>
&lt;p>&lt;code>index.html&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> :
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">link&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">rel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;stylesheet&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text/css&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/js/theoplayer/ui.css&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>index.html&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> :
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text/javascript&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/js/theoplayer/THEOplayer.js&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>src/components/Player.vue&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">THEOplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Player&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">theoplayer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fluid&lt;/span>: &lt;span class="kt">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">libraryLocation&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;/js/theoplayer/&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">license&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;ライセンス文字列&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="最後に">最後に&lt;/h2>
&lt;p>この記事では、シンプルなプレーヤー アプリの実装例として、THEOplayer Web SDK と Vue.js v3 フレームワークを統合する方法について説明しました。&lt;/p>
&lt;p>GitHub のリポジトリでこのサンプル アプリのソースコードを参照してください: &lt;a href="https://github.com/liveinstantly/theoplayer-web-vue3-example" target="_blank">https://github.com/liveinstantly/theoplayer-web-vue3-example&lt;/a>
&lt;/p>
&lt;p>ご不明な点がございましたら、お気軽にお問い合わせください。&lt;/p></description></item><item><title>Resources: ビデオストリーミング技術の紹介</title><link>https://www.liveinstantly.com/ja/resources/blog/video-streaming-introduction/</link><pubDate>Mon, 24 Oct 2022 09:00:00 +0900</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/video-streaming-introduction/</guid><description>&lt;h2 id="ビデオストリーミングの歴史">ビデオストリーミングの歴史&lt;/h2>
&lt;p>インターネットの普及に伴い、様々なシナリオで色々なビジネスに、デジタルビデオがあたりまえのように利用されていますが、デジタルビデオ技術はこれまでに様々な歴史を紡いできています。&lt;/p>
&lt;p>2000年代から様々なビデオストリーミング技術が各社で開発され、色々な技術が世の中に溢れていきました。独自のプロトコルで独自のサーバー・クライアント技術を使ったストリーミング技術が開発され、それぞれの技術に精通する必要があり大変な時期でした。これらの技術では、再生するビデオやオーディオの品質はクライアントとサーバー間の通信で制御することもできましたが、ルーター製品やネットワークアドレス変換 (NAT) などのネットワーク環境によって、通信ができないなどの制限もありました。&lt;/p>
&lt;p>と同時に、加速度的に普及する HTTP 技術とビデオストリーミングの親和性のために、2000年代後半に、HTTP ベースのアダプティブストリーミングのビデオ配信技術が各社で開発されました。ストリーミングの世界は、アダプティブストリーミングにより、これまでのビデオストリーミング技術がアップデートされました。単純な HTTP ダウンロードでビデオをファイルを再生する際には、たとえビデオをダウンロードしながら再生できたとしても、ビデオのダウンロード速度（ネットワークのバンド幅）とビデオの品質の関係が問題になってきます。&lt;/p>
&lt;blockquote>
&lt;p>つまり、ビデオの品質（ビデオの1秒間のデータ容量）がダウンロード速度（1秒間にダウンロードできる容量）よりも遅い（大きい）場合は、ビデオの再生が追いつかず、ビデオが途中で止まってしまうということになります。&lt;/p>
&lt;/blockquote>
&lt;p>この問題を解決しようとするのが、アダプティブストリーミングという技術です。&lt;/p>
&lt;p>アダプティブストリーミングでは、ビデオを複数のセグメントに分割し、分割したビデオごとにダウンロードして再生することを基本としました。1つのビデオのセグメントは、例えば、2~10秒という長さのビデオで、これらの分割したビデオセグメント群を様々な品質（ビットレート）と解像度でそれぞれ準備することで、ビデオを再生するプレイヤーは、ビデオを配信する Web サーバーとの通信の速度や状態によって、どの品質と解像度のビデオセグメントを再生するか選ぶことができるようになります。&lt;/p>
&lt;blockquote>
&lt;p>この技術によって、再生するクライアントは、接続しているネットワークのバンド幅に合わせて、再生するビデオの品質をスイッチしながら再生することができ、途中でビデオが止まることがなく再生することができるようになります。&lt;/p>
&lt;/blockquote>
&lt;figure class="">
&lt;img src="https://www.liveinstantly.com/ja/resources/blog/video-streaming-introduction/video-tech-adaptive-streaming-ja_hu32021ac8a93725661b0b507469448210_596907_600x0_resize_q75_catmullrom.jpg" width="600" height="274" />
&lt;figcaption>
&lt;p>
&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>また、HTTP ベースのストリーミングであるため、HTTP キャッシングが可能な CDN (コンテンツ デリバリ ネットワーク) を使って、ストリーミングサーバーの負荷を最小限にしながら、大規模なエンドユーザー向けにビデオストリーミングを配信することができます。&lt;/p>
&lt;h2 id="アダプティブストリーミング">アダプティブストリーミング&lt;/h2>
&lt;p>アダプティブストリーミングとして、当時、3つのストリーミング技術が開発され、それぞれの技術では、ライブ、ビデオオンデマンドのどちらのビデオ配信シナリオをサポートし、専用のクライアントプレイヤーがそれぞれ用意されました。&lt;/p>
&lt;ul>
&lt;li>Adobe HTTP Dynamic Streaming (HDS)&lt;/li>
&lt;li>Apple HTTP Live Streaming (HLS)&lt;/li>
&lt;li>Microsoft Smooth Streaming&lt;/li>
&lt;/ul>
&lt;p>当時の HTML 技術には、&amp;lt;video&amp;gt; タグや &amp;lt;audio&amp;gt; タグは定義されておらず、リッチメディアと呼ばれるビデオなどのメディアは、ブラウザーのプラグインを使って実装されたプレイヤーで再生されていました。このため、多くのユーザーに向けて配信するためには、コンテンツの配信側は、それぞれのプラグインに対応する3つのストリーミング方式に対応する必要がありました。&lt;/p>
&lt;p>モバイルデバイスの普及、マルチデバイス化とともに、ビデオストリーミング技術の標準化やクライアントの標準化が課題となり、様々な企業がビデオストリーミングの技術の発展に寄与してきました。&lt;/p>
&lt;p>ビデオストリーミング技術の標準化においては、MPEG-DASH (Dynamic Adaptive Streaming over HTTP) は、2012 年に最初に国際標準として制定されたアダプティブストリーミング技術で、Microsoft や Adobe は、これまで培った技術と経験をベースに、この MPEG-DASH の技術の開発に貢献しました。また、Akamai, Ericsson, Microsoft, Netflix, Qualcomm, Samsung が設立メンバーとして設立した &lt;a href="https://dashif.org/" target="_blank">DASH Industry Forum&lt;/a>
という団体において、標準化された MPEG-DASH 技術に関するマーケットで実際の互換性問題の解決や推奨事項のガイドライン化などを行いながら、技術の普及につとめています。&lt;/p>
&lt;p>また、Apple の HLS は、開発当初の2009年から IETF (Internet Engineering Task Force) に RFC ドラフトとして HLS 技術を提出し、最終的に、&lt;a href="https://mailarchive.ietf.org/arch/msg/ietf-announce/WYDfL1x3FOwz7T6YojPqSnluQWo/" target="_blank">2017年に RFC8216 として発表されました&lt;/a>
。&lt;/p>
&lt;p>クライアントの標準化については、HTML5 に &amp;lt;video&amp;gt; タグ / &amp;lt;audio&amp;gt; タグを導入してプラグインなしでビデオ再生を可能にするだけでなく、セグメント化されたビデオによるアダプティブ ストリーミング技術をサポートするための Media Source Extension (MSE) という技術が、HTML5 のメディア拡張として、Google/Microsoft/Netflix で開発されました。これにより、MPEG-DASH 方式のビデオ再生が JavaScript で実装されたプレイヤーで実現できるようになりました。&lt;/p>
&lt;h2 id="ビデオストリーミング技術の現在">ビデオストリーミング技術の現在&lt;/h2>
&lt;p>現在では、MPEG-DASH と HLS の2つの技術がアダプティブストリーミング技術として、多くのサービスやアプリケーションで利用されています。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.iso.org/standard/83314.html" target="_blank">ISO/IEC 23009-1&lt;/a>
- MEPG-DASH (Dynamic Adaptive Streaming over HTTP)&lt;/li>
&lt;li>&lt;a href="https://www.rfc-editor.org/rfc/rfc8216" target="_blank">IETF RFC 8216&lt;/a>
HTTP Live Streaming (HLS)&lt;/li>
&lt;/ul>
&lt;p>これらのストリーミング技術の再生には、PC (Windows/macOS) では、HTML5 のメディア拡張機能を使った JavaScript のプレイヤーによりブラウザ上で再生することができますが、モバイルデバイスは、Android, iOS のオペレーティングシステムを中心に開発されており、これらのオペレーティングシステムに標準搭載されている OS API・プラットフォーム等を使ったプレイヤーを開発することで再生することができます。&lt;/p>
&lt;p>ブラウザ環境向けの JavaScript ベースのプレイヤーとしては、以下のオープンソースのプレイヤーが市場では多く利用されています。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/Dash-Industry-Forum/dash.js/" target="_blank">dash.js&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/videojs/" target="_blank">video.js&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/video-dev/hls.js/" target="_blank">hls.js&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>Apple の OS では &lt;a href="https://developer.apple.com/documentation/avfoundation/avplayer" target="_blank">AVPlayer&lt;/a>
と呼ばれるプラットフォームを使って開発されていることが多く、HLS のビデオストリームを再生することができます。&lt;/p>
&lt;p>Android の OS では Google が開発しているオープンソースの &lt;a href="https://exoplayer.dev/" target="_blank">ExoPlayer&lt;/a>
のプレイヤープラットフォームが使われていることが多く、HLS と MPEG-DASH の両方のビデオストリームを再生することができます。&lt;/p>
&lt;p>当社が取り扱う THEOplayer の商用プレイヤー SDK は、同様にアプローチで上記に示したプレイヤーの基本機能をベースに、様々な追加の高度な機能を加え、開発が容易な SDK となっています。&lt;/p>
&lt;h2 id="ストリーミングプラットフォーム">ストリーミングプラットフォーム&lt;/h2>
&lt;p>上述の通り、ビデオストリーミング技術は、依然として、2つの方式が市場では利用されており、ビデオストリーミングを行うプラットフォームでは一般的に両方の技術方式をサポートする必要がありますが、1つのコンテンツのストリーム入力に対して、リアルタイムで動的に 2つの方式の生成し出力する機能が、いくつかのストリーミングプラットフォームに備わっています。&lt;/p>
&lt;p>この動的なストリーム生成は、「動的パッケージング (Just-in-Time Packaging)」と一般的に呼ばれていますが、ライブストリーム、および、オンデマンドストリームの両方に適用できるため、シンプルなワークフローのストリーミング アーキテクチャを構築することができます。&lt;/p>
&lt;figure class="">
&lt;img src="https://www.liveinstantly.com/ja/resources/blog/video-streaming-introduction/video-tech-wowza-streaming_hufcc71dfbe047f1aca147821d67bd1a0e_44232_600x0_resize_q75_catmullrom.jpg" width="600" height="205" />
&lt;figcaption>
&lt;p>
&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>当社が取り扱う Wowza Media Systems 社の製品も上記に示したストリーミング プラットフォームのひとつで、様々な入力方式のコンテンツをサポートし、MPEG-DASH および HLS のストリームの動的パッケージングを行い、入力されたコンテンツのストリーミング配信をすることができます。&lt;/p>
&lt;h2 id="最後に">最後に&lt;/h2>
&lt;p>この記事では、ストリーミング技術の歴史と取り巻く技術を簡単にご紹介しました。&lt;/p>
&lt;p>デジタルビデオ・オーディオ、および、ストリーミングの技術は年々進化しており、それらの技術やそれを支える製品・ソリューションのキャッチアップが、ビデオストリーミングを使ったシステムやサービスの構築にあたっては重要になっています。当社は、それらの技術の仕組みや背景を正しくキャッチアップしながら、グローバルのメディア企業と連携し、顧客のプロジェクトやサービスをサポートします。&lt;/p></description></item><item><title>Resources: Wowza Streaming Engine での HLS ストリーミング</title><link>https://www.liveinstantly.com/ja/resources/blog/wse-configs-hls/</link><pubDate>Thu, 10 Dec 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/wse-configs-hls/</guid><description>&lt;h2 id="はじめに">はじめに&lt;/h2>
&lt;p>この記事では、Wowza Streaming Engine での HLS 方式でのストリーミングに関する
技術的に詳細な設定・カスタマイズの方法について触れます。&lt;/p>
&lt;h2 id="hls-プレイリスト-マニフェスト-について">HLS プレイリスト (マニフェスト) について&lt;/h2>
&lt;p>HLS プレイリストには、&lt;code>EXT-X-VERSION&lt;/code> タグと呼ばれる Apple HLS (HTTP Live Streaming) のプレイリスト互換性バージョンを示すタグが含まれています。&lt;/p>
&lt;p>Wowza Streaming Engine の HTTPStreamer の既定の設定では、Apple HLS 互換性バージョン 3 のプレイリストを生成します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">#EXT-X-VERSION:3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>VOD またはライブアプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) 内の
以下のパラメーターで HLS プレイリストの互換性バージョンを制御することができます。&lt;/p>
&lt;p>Wowza Streaming Engine では、バージョン 3 から 6 までをサポートしています。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoExtXVersion&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>プレイリストの互換性バージョンを指定する (既定値: 3)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Wowza Streaming Engine では、指定された &lt;code>EXT-X-VERSION&lt;/code> (プレイリストの互換性バージョン) に基づいてプレイリスト機能を有効または無効にすることができます。&lt;/p>
&lt;p>次の機能は &lt;code>EXT-X-VERSION&lt;/code> の値によって制御されます。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>浮動小数点形式によるセグメント長&lt;/strong>
&lt;ul>
&lt;li>&lt;code>EXT-X-VERSION&lt;/code> が 3 以上の場合、整数形式ではなく浮動小数点形式を使用してセグメント長を表します&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>コーデック形式&lt;/strong>
&lt;ul>
&lt;li>&lt;code>EXT-X-VERSION&lt;/code> が 4 以上の場合、iOS 4.0 以降のコーデック形式 (例: avc1.42c015) を使用して、playlist.m3u8 レスポンスのコーデック値を表します&lt;/li>
&lt;li>&lt;code>EXT-X-VERSION&lt;/code> が 4 未満の場合、iOS 4.0 以前のコーデック形式 (例: avc1.66.21) を使用します&lt;/li>
&lt;li>&lt;code>cupertinoCodecStringFormatId&lt;/code> (パス名:/Root/Application/HTTPStreamer) プロパティの値によってコーデック形式の制御することも可能です
&lt;ul>
&lt;li>&lt;code>Integer&lt;/code> 型で、値が 2 の場合、iOS 4.0 以降のコーデック形式を使用します&lt;/li>
&lt;li>&lt;code>Integer&lt;/code> 型で、値が 1 の場合、iOS 4.0 以前のコーデック形式を使用します&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="hls-セグメントの長さについて">HLS セグメントの長さについて&lt;/h2>
&lt;p>Wowza Streaming Engine では、HLS ストリーミングを行うためにビデオファイルをセグメントに分割してプレイヤーに提供します。&lt;/p>
&lt;p>分割するセグメントの長さは、既定では 10 秒 (10000 ミリ秒) となっていますが、
以下のアプリケーション プロパティを変更することでセグメントの長さをカスタマイズすることができます。&lt;/p>
&lt;blockquote>
&lt;p>注意&lt;/p>
&lt;p>HLS アダプティブストリーミングが正しく動作するには、ビデオセグメントの始まりは必ずキーフレーム (I-フレーム) で開始する必要があり、
ビデオセグメントの境界は キーフレームの間隔と整合性がとれている必要があります。
例えば、10秒のビデオセグメントの場合、2秒、2.5秒、5秒、10秒などのキーフレーム間隔でエンコードされたビデオを入力する必要があります。
これにより、再生中に異なるビットレートや解像度のビデオストリーム間で再生の切り替えを正しく行うことができます。&lt;/p>
&lt;p>このため、Wowza Streaming Engine に入力するビデオ (VOD ファイルやライブストリーム) は、指定するセグメントの長さに気を付けて入力する必要があります。&lt;/p>
&lt;/blockquote>
&lt;h3 id="vod-ストリーミングのセグメントの長さの設定パラメーター">VOD ストリーミングのセグメントの長さの設定パラメーター&lt;/h3>
&lt;p>VOD アプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、HLS VOD ストリーミングのセグメントの長さを変更することができます。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoChunkDurationTarget&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>セグメントの長さ (ミリ秒) を指定する (既定値: 10000)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="ライブストリーミングのセグメントの長さの設定パラメーター">ライブストリーミングのセグメントの長さの設定パラメーター&lt;/h3>
&lt;p>ライブ入力デバイス等からのオーディオ・ビデオ パケットは、 Wowza Streaming Engine で時刻に基づいてセグメントに分割されます。
各セグメントの長さは、&lt;code>cupertinoChunkDurationTarget&lt;/code> プロパティによって制御されます。
セグメントは、作成時にアクセス可能なセグメント リストに追加されます。
リストに格納される項目の最大数は、&lt;code>cupertinoMaxChunkCount&lt;/code> プロパティによって制御されます。
MPEG-DASH クライアント (プレイヤー) がストリームを要求すると、Wowza Streaming Engine は最近追加された n 個のセグメントを含むマニフェストを提供します。
マニフェストで返されるアイテムの数 (n) は、&lt;code>cupertinoPlaylistChunkCount&lt;/code> プロパティによって制御されます。&lt;/p>
&lt;p>また、ライブストリーム リピーター システムは、オリジン/エッジの構成で単一のライブストリームを複数のエッジ サーバーに配信するために使用されます。
エッジ サーバーは、ライブストリームを最初に要求するときに、オリジンへセグメント化されたライブストリームのリクエストを行って、クライアントに配信します。
&lt;code>cupertinoRepeaterChunkCount&lt;/code> プロパティは、最初の接続後すぐにオリジンからエッジに送信されるセグメントの数を制御します。
&lt;code>cupertinoRepeaterChunkCount&lt;/code> は &lt;code>cupertinoPlaylistChunkCount&lt;/code> 以上で &lt;code>cupertinoMaxChunkCount&lt;/code> 未満であることが最適です。
この設定パラメーターは、&lt;strong>Live Edge&lt;/strong> タイプのアプリケーションでリピーター構成となっている場合に利用します。&lt;/p>
&lt;p>ライブアプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、HLS ライブストリーミングのセグメントの長さを変更することができます。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoChunkDurationTarget&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>セグメントの長さ (ミリ秒) を指定する (既定値: 10000)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoMaxChunkCount&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>WSE 内部で格納する有効なライブストリームのセグメント数を指定する (既定値: 10)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoPlaylistChunkCount&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>プレイリストで提供するライブストリームのセグメント数を指定する (既定値: 5)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoRepeaterChunkCount&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>エッジからオリジンへの最初の接続後、オリジンからエッジにすぐに送信されるセグメント数を指定する (既定値: 5)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="hls-audio-only-ストリームの設定">HLS Audio-only ストリームの設定&lt;/h2>
&lt;p>過去の Apple デバイス向けの Apple HLS オーサリングガイドラインでは、
3G ネットワークなどの低帯域ネットワークに向けたアクセスのために、
HLS ストリーミング コンテンツに Audio-only (音声のみ) のストリームを用意することが
ガイドラインとして設けられていました。&lt;/p>
&lt;p>例えば、取得したプレイリスト
(例: &lt;a href="https://[%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9]/[%e3%82%a2%e3%83%97%e3%83%aa%e5%90%8d]/mp4:sample.mp4/playlist.m3u8" target="_blank">https://[アドレス]/[アプリ名]/mp4:sample.mp4/playlist.m3u8&lt;/a>
)
は以下のような内容となります。&lt;/p>
&lt;p>&lt;code>_ao.m3u8&lt;/code> のサフィックスが付いたプレイリスト (以下の例では &lt;code>chunklist_[WowzaセッションID]_ao.m3u8&lt;/code>) が、
Audio-only ストリームのプレイリストです。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">#EXTM3U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-VERSION:6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-STREAM-INF:BANDWIDTH=868638,CODECS=&amp;#34;avc1.42c015,mp4a.40.2&amp;#34;,RESOLUTION=512x288
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chunklist_w298755728.m3u8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-STREAM-INF:BANDWIDTH=116046,CODECS=&amp;#34;mp4a.40.2&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chunklist_w298755728_ao.m3u8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>現在のガイドラインには、該当する記載はなくなっているようです。&lt;/p>
&lt;p>&lt;a href="https://developer.apple.com/documentation/http_live_streaming/http_live_streaming_hls_authoring_specification_for_apple_devices" target="_blank">HTTP Live Streaming (HLS) Authoring Specification for Apple Devices&lt;/a>
&lt;/p>
&lt;/blockquote>
&lt;p>この Audio-only のストリームが追加されるように HLS プレイリストの変更を行うには、以下のプロパティの設定を行います。&lt;/p>
&lt;h3 id="vod-hls-audio-only-ストリームの設定">VOD HLS Audio-only ストリームの設定&lt;/h3>
&lt;p>VOD アプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、HLS VOD ストリーミングのプレイリストに Audio-only ストリームを追加します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoAutoCreateMultibitratePlaylist&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>true に設定する (既定値: false)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="ライブ-hls-audio-only-ストリームの設定">ライブ HLS Audio-only ストリームの設定&lt;/h3>
&lt;p>ライブアプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、HLS ライブストリーミングのプレイリストに Audio-only ストリームを追加します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoCreateAudioOnlyRendition&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>true に設定する (既定値: false)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoAutoCreateMultibitratePlaylist&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>true に設定する (既定値: false)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="hls-keyframes-only-プレイリストの設定">HLS KeyFrames-only プレイリストの設定&lt;/h2>
&lt;p>Apple のネイティブ HLS プレイヤーでは、VOD コンテンツのトリックプレイ再生をサポートしています。
トリックプレイ再生とは、プレーヤーでコンテンツの巻き戻しや早送りをしてコンテンツのタイムラインを探すときに、
ビューア―に視覚的な手がかりとなるビデオのサムネイルを提供するものです。&lt;/p>
&lt;p>トリックプレイ再生をサポートするために特別な目的のコンテンツを別に作成する必要はなく、
ビデオストリームのキーフレーム&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> の場所をプレイヤーに提供するだけです。
ビデオストリームのキーフレームの場所を指定するために、Apple iOS 5 以降では KeyFrames-only プレイリスト (Iフレームのみのプレイリスト) を使用します。&lt;/p>
&lt;blockquote>
&lt;p>この設定はラVODアプリケーションにのみ有効な設定です&lt;/p>
&lt;/blockquote>
&lt;p>Wowza Streaming Engine では、KeyFrames-only プレイリストを動的に生成し、ビデオストリームのキーフレームをストリーミングすることができます。
KeyFrames-only プレイリストは、&lt;code>playlist.m3u8&lt;/code> プレイリストの中で &lt;code>EXT-X-I-FRAME-STREAM-INF&lt;/code> タグを使って URL を指定します。
KeyFrames-only プレイリストは &lt;code>EXT-X-I-FRAMES-ONLY&lt;/code> タグを使用してキーフレームのみを提供するプレイリストです。
KeyFrames-only プレイリストでは、&lt;code>EXTINF&lt;/code> タグはセグメントの長さのかわりにキーフレームの間隔を参照します。&lt;/p>
&lt;p>この I-Frames-only のプレイリストが追加されるように HLS プレイリストの変更を行うには、以下のプロパティの設定を行います。&lt;/p>
&lt;p>VOD アプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、HLS VOD ストリーミングのプレイリストに I-Frames-only プレイリストを追加します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoExtXVersion&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>4 以上の値に設定する (既定値: 3)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoCreateKeyFrameOnlyPlaylist&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>true に設定する (既定値: false)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>プレイリストのサンプルは以下の通りです。&lt;/p>
&lt;ul>
&lt;li>playlist.m3u8&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">#EXTM3U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-VERSION:6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-STREAM-INF:BANDWIDTH=868638,CODECS=&amp;#34;avc1.42c015,mp4a.40.2&amp;#34;,RESOLUTION=512x288
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chunklist_w1520434929.m3u8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=875,CODECS=&amp;#34;avc1.42c015&amp;#34;,URI=&amp;#34;chunklist_w1520434929_ko.m3u8&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-STREAM-INF:BANDWIDTH=116046,CODECS=&amp;#34;mp4a.40.2&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chunklist_w1520434929_ao.m3u8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>KeyFrames-only プレイリスト&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">#EXTM3U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-VERSION:6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-TARGETDURATION:2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-MEDIA-SEQUENCE:0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-I-FRAMES-ONLY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXTINF:2.0,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-BYTERANGE:999624@376
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">media_w1520434929_ko_0.ts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXTINF:2.0,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-BYTERANGE:999624@376
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">media_w1520434929_ko_1.ts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXTINF:2.0,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-BYTERANGE:999624@376
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">media_w1520434929_ko_2.ts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXTINF:2.0,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#EXT-X-BYTERANGE:999624@376
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">media_w1520434929_ko_3.ts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> :
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="hls-audioストリームの-ts-パッケージングの設定">HLS Audioストリームの TS パッケージングの設定&lt;/h2>
&lt;p>Wowza Streaming Engine の既定の設定では、HLS Audio ストリームは、MPEG-2 エレメンタリストリームでパッケージングされます。&lt;/p>
&lt;p>以下のプロパティの設定を行うことで、HLS Audio ストリームをビデオストリームと同様に
HLS Audio ストリームを　MPEG-2 トランスポートストリーム (TS) でパッケージングを行います。&lt;/p>
&lt;h3 id="vod-hls-audio-ストリームの-ts-パッケージングの設定">VOD HLS Audio ストリームの TS パッケージングの設定&lt;/h3>
&lt;p>VOD アプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、HLS VOD ストリーミングのプレイリストに Audio-only ストリームを追加します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoPacketizeAllStreamsAsTS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>true に設定する (既定値: false)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="ライブ-hls-audio-ストリームの-ts-パッケージングの設定">ライブ HLS Audio ストリームの TS パッケージングの設定&lt;/h3>
&lt;p>ライブアプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、HLS ライブストリーミングのプレイリストに Audio-only ストリームを追加します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoPacketizeAllStreamsAsTS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>true に設定する (既定値: false)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="タイムコードに基づいたライブストリームのセグメントの番号付けの設定">タイムコードに基づいたライブストリームのセグメントの番号付けの設定&lt;/h2>
&lt;p>Wowza Streaming Engine では、エンコーダーから受信したライブストリームにタイムコードが含まれている場合に、
タイムコードに基づいたセグメント (チャンク) の番号付けを行うことができます。&lt;/p>
&lt;blockquote>
&lt;p>この設定はライブアプリケーションにのみ有効な設定です&lt;/p>
&lt;/blockquote>
&lt;p>この機能を有効にするには、ライブアプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下のプロパティを設定します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>cupertinoCalculateChunkIDBasedOnTimecode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>true に設定する (既定値: false)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>この機能を有効にすると、セグメントの ID はタイムコードを cupertinoChunkDurationTarget 値で割った (割り算の) 商に等しくなります。&lt;/p>
&lt;blockquote>
&lt;p>注意: &lt;code>cupertinoCalculateChunkIDBasedOnTimecode&lt;/code> プロパティは、
時刻同期されたタイムコードを Wowza Streaming Engine に送信するエンコーダーを使う場合のみ有効にしてください。
時刻同期されたタイムコードは、UTC またはその他の時刻をベースに同期するようにします。&lt;/p>
&lt;p>もし、時刻同期されたタイムコードを送信しないエンコーダーのライブソースストリームと &lt;code>cupertinoCalculateChunkIDBasedOnTimecode&lt;/code> が使用されている場合、
ソースストリームが再起動すると セグメント ID は 0 で再起動するか、場合によってはランダムな値で再起動します。
HTTP オリジンを使ってプライマリ サーバーとバックアップ サーバーの2つのソースから取り込まれたライブ ストリームを取り扱う場合、
セグメント ID の整合性がとれなくなってしまうため、特に問題になります。&lt;/p>
&lt;/blockquote>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>キーフレームは、I フレーム、または、イントラ コード化されたフレームと呼ばれることもあり、
ビデオフレームのエンコード時に他のフレームから独立してエンコードされたビデオ フレームです。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Resources: Wowza Streaming Engine での MPEG-DASH ストリーミング</title><link>https://www.liveinstantly.com/ja/resources/blog/wse-configs-mpeg-dash/</link><pubDate>Mon, 30 Nov 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/wse-configs-mpeg-dash/</guid><description>&lt;h2 id="はじめに">はじめに&lt;/h2>
&lt;p>この記事では、Wowza Streaming Engine での MPEG-DASH 方式でのストリーミングに関する
技術的に詳細な設定・カスタマイズの方法について触れます。&lt;/p>
&lt;h2 id="mpeg-dash-mpd-マニフェストについて">MPEG-DASH MPD マニフェストについて&lt;/h2>
&lt;p>MPEG-DASH サーバーは、メディア プレゼンテーション記述 (MPD) マニフェスト ファイルで、
利用可能なメディア セグメント URL のリストをプレーヤーに提供します。
その後、プレイヤーは、中断のない再生を行うために、必要に応じてメディア セグメントを順次要求します。&lt;/p>
&lt;p>MPD ファイル内でこのセグメント URL のリストの識別方法を定義する方式をセグメントアドレス方式とは呼び、
以下のセグメントアドレス方式があります。&lt;/p>
&lt;ul>
&lt;li>セグメント リスト方式
&lt;ul>
&lt;li>利用可能なすべてのセグメントについて、セグメント URL の完全なリストを提供する方式です&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>セグメント テンプレート (時刻ベース) 方式
&lt;ul>
&lt;li>プレイヤーがセグメント URL リストを作成できるようにするための URL テンプレートを提供する方式です&lt;/li>
&lt;li>セグメント URL にはセグメントごとの開始時刻が含まれます&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>セグメント テンプレート (セグメント番号ベース) 方式
&lt;ul>
&lt;li>プレイヤーがセグメント URL リストを作成できるようにするための URL テンプレートを提供する方式です&lt;/li>
&lt;li>セグメント URL にはセグメントごとのセグメントの番号 (インデックス番号など) が含まます&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>セグメント ベース (BaseURL) 方式
&lt;ul>
&lt;li>すべてのセグメントが単一の URL (BaseURL) で識別されるセグメント分割を行わない方式で、セグメントがバイトレンジの HTTP リクエストを通じて取得する方式です&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Wowza Streaming Engine の MPEG-DASH サポートでは、セグメントベース方式以外のセグメントアドレス方式の MPD 形式をサポートしていて、
プレイヤーは以下の URL フォーマット指定で必要なマニフェスト形式を指定できます。&lt;/p>
&lt;p>http://[アドレスまたはホスト名]:[ポート]/[アプリケーション名]/[アプリインスタンス]/[ストリーム名]/manifest**_mv[セグメントアドレス方式]**.mpd&lt;/p>
&lt;p>**[セグメントアドレス方式]**には、以下のいずれかを指定します。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>mvtime&lt;/strong>: セグメント テンプレート (時間ベース) 方式&lt;/li>
&lt;li>&lt;strong>mvlist&lt;/strong>: セグメント リスト方式&lt;/li>
&lt;li>&lt;strong>mvnumber&lt;/strong>: セグメント テンプレート (セグメント番号ベース) 方式&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>_mv[セグメント形式]&lt;/strong> の指定がない場合は、&lt;strong>mvtime&lt;/strong> が既定値となります。&lt;/p>
&lt;/blockquote>
&lt;h2 id="mpeg-dash-セグメントの長さについて">MPEG-DASH セグメントの長さについて&lt;/h2>
&lt;p>Wowza Streaming Engine では、MPEG-DASH ストリーミングを行うためにビデオファイルをセグメントに分割してプレイヤーに提供します。&lt;/p>
&lt;p>分割するセグメントの長さは、既定では 10 秒 (10000 ミリ秒) となっていますが、
以下のアプリケーション プロパティを変更することでセグメントの長さをカスタマイズすることができます。&lt;/p>
&lt;blockquote>
&lt;p>注意&lt;/p>
&lt;p>MPEG-DASH アダプティブストリーミングが正しく動作するには、ビデオセグメントの始まりは必ずキーフレーム (I-フレーム) で開始する必要があり、
ビデオセグメントの境界は キーフレームの間隔と整合性がとれている必要があります。
例えば、10秒のビデオセグメントの場合、2秒、2.5秒、5秒、10秒などのキーフレーム間隔でエンコードされたビデオを入力する必要があります。
これにより、再生中に異なるビットレートや解像度のビデオストリーム間で再生の切り替えを正しく行うことができます。&lt;/p>
&lt;p>このため、Wowza Streaming Engine に入力するビデオ (VOD ファイルやライブストリーム) は、指定するセグメントの長さに気を付けて入力する必要があります。&lt;/p>
&lt;/blockquote>
&lt;h3 id="vod-ストリーミングのセグメントの長さの設定パラメーター">VOD ストリーミングのセグメントの長さの設定パラメーター&lt;/h3>
&lt;p>VOD アプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、MPEG-DASH VOD ストリーミングのセグメントの長さを変更することができます。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/HTTPStreamer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>mpegdashSegmentDurationTarget (バージョン 4.7.8 以降)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>セグメントの長さ (ミリ秒) を指定する (既定値: 10000)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="ライブストリーミングのセグメントの長さの設定パラメーター">ライブストリーミングのセグメントの長さの設定パラメーター&lt;/h3>
&lt;p>ライブ入力デバイス等からのオーディオ・ビデオ パケットは、 Wowza Streaming Engine で時刻に基づいてセグメントに分割されます。
各セグメントの長さは、&lt;code>mpegdashSegmentDurationTarget&lt;/code> プロパティによって制御されます。
セグメントは、作成時にアクセス可能なセグメント リストに追加されます。
リストに格納される項目の最大数は、&lt;code>mpegdashMaxSegmentCount&lt;/code> プロパティによって制御されます。
MPEG-DASH クライアント (プレイヤー) がストリームを要求すると、Wowza Streaming Engine は最近追加された n 個のセグメントを含むマニフェストを提供します。
マニフェストで返されるアイテムの数 (n) は、&lt;code>mpegdashPlaylistSegmentCount&lt;/code> プロパティによって制御されます。&lt;/p>
&lt;p>また、ライブストリーム リピーター システムは、オリジン/エッジの構成で単一のライブストリームを複数のエッジ サーバーに配信するために使用されます。
エッジ サーバーは、ライブストリームを最初に要求するときに、オリジンへセグメント化されたライブストリームのリクエストを行って、クライアントに配信します。
&lt;code>mpegdashRepeaterSegmentCount&lt;/code> プロパティは、最初の接続後すぐにオリジンからエッジに送信されるセグメントの数を制御します。
&lt;code>mpegdashRepeaterSegmentCount&lt;/code> は &lt;code>mpegdashPlaylistSegmentCount&lt;/code> 以上で &lt;code>mpegdashMaxSegmentCount&lt;/code> 未満であることが最適です。
この設定パラメーターは、&lt;strong>Live Edge&lt;/strong> タイプのアプリケーションでリピーター構成となっている場合に利用します。&lt;/p>
&lt;p>ライブアプリケーションの &lt;code>Application.xml&lt;/code> (&lt;code>/usr/local/WowzaStreamingEngine/conf/[アプリ名]/Application.xml&lt;/code>) の
以下の項目を設定することで、MPEG-DASH ライブストリーミングのセグメントの長さを変更することができます。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>mpegdashSegmentDurationTarget (バージョン 4.7.8 以降)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>セグメントの長さ (ミリ秒) を指定する (既定値: 10000)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>mpegdashMaxChunkCount (バージョン 4.7.8 以降)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>WSE 内部で格納する有効なライブストリームのセグメント数を指定する (既定値: 10)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>mpegdashPlaylistChunkCount (バージョン 4.7.8 以降)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>プレイリストで提供するライブストリームのセグメント数を指定する (既定値: 5)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>項目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>XML パス&lt;/td>
&lt;td>/Root/Application/LiveStreamPacketizer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティ名 (Name)&lt;/td>
&lt;td>mpegdashRepeaterSegmentCount (バージョン 4.7.8 以降)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティのタイプ (Type)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>プロパティの値 (Value) の説明&lt;/td>
&lt;td>エッジからオリジンへの最初の接続後、オリジンからエッジにすぐに送信されるセグメント数を指定する (既定値: 5)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="mpd-リダイレクト">MPD リダイレクト&lt;/h2>
&lt;p>サーバーの使用状況の分析や監視を行うための統計情報を提供するために、
Wowza Streaming Engine はそれぞれのストリーミング再生セッションについて HTTP セッション コンテキストを保存します。&lt;/p>
&lt;p>通常の HTTP ストリーミング技術では、プレーヤーがマニフェストを要求したときにセッションが作成されるようになっていて、サーバーはプレイヤーが同じ再生セッションで同じマニフェストに対して追加のリクエストを行うことを期待していません。もし同じマニフェストに対してリクエストがあると新しいセッションが作成されますが、これは別の再生セッションとなります。&lt;/p>
&lt;p>しかし、MPEG-DASH ライブストリーミングの場合は、プレーヤーが (MPEG-DASH の設計上の理由により) 定期的にDASH MPD マニフェストを再リクエストして、新しいセグメントの発行や古いセグメントの有効期限を識別する必要があります。すると、プレーヤーが DASH MPD マニフェストを再リクエストするたびに新しい HTTP セッションが誤って作成されてしまいます。&lt;/p>
&lt;p>Wowza Streaming Engine では、&lt;strong>MPD.Location リダイレクト機能&lt;/strong> (MPD マニフェスト内部のリダイレクトのメカニズム) か &lt;strong>HTTP リダイレクト機能&lt;/strong>を使用することによりこの問題に対処することができます。&lt;/p>
&lt;h3 id="mpdlocation-リダイレクト機能">MPD.Location リダイレクト機能&lt;/h3>
&lt;p>MPD.Location リダイレクト機能は、HTTP リダイレクトと同様の機能を提供する MPEG-DASH MPD マニフェストの &lt;code>MPD.Location&lt;/code> 要素のサポートにより、
以下のように実現されています。&lt;/p>
&lt;ul>
&lt;li>&lt;code>MPD.Location&lt;/code> 要素は、オリジナルの MPD URL のファイル名に Wowza セッション ID を埋め込んだ 更新された MPD URL を提供します&lt;/li>
&lt;li>プレーヤーは、そのセッション中の以降のすべての MPD リクエストに対して、更新された MPD URL を使用するようになります&lt;/li>
&lt;li>&lt;code>MPD.Location&lt;/code> 要素は、最初の MPD だけでなく、以降のすべての MPD の中で提供されます&lt;/li>
&lt;li>新しいセッションは、リクエストされた MPD URL に Wowza セッション ID が含まれない MPD URL へのリクエストに対してのみ作成されます
&lt;ul>
&lt;li>それ以外の場合、サーバーはリクエストに含まれる Wowza セッション ID を使用し、同じ HTTP セッション内で続行します&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>例えば、元の MPD URL が以下の場合は、&lt;/p>
&lt;p>http://[アドレス]:1935/[アプリケーション名]/mp4:sample.mp4/manifest_mpm4sav_mvlist.mpd&lt;/p>
&lt;p>新しい URL は次のようになります。&lt;/p>
&lt;p>http://[アドレス]:1935/[アプリケーション名]/mp4:sample.mp4/manifest_mpm4sav_mvlist_w1499067310.mpd&lt;/p>
&lt;p>w1499067310 は埋め込まれた Wowza セッション ID となります。&lt;/p>
&lt;/blockquote>
&lt;h3 id="mpd-http-リダイレクト機能">MPD HTTP リダイレクト機能&lt;/h3>
&lt;p>MPEG-DASH MPD HTTP リダイレクト機能を使用すると、Wowza Streaming Engine はプレーヤーからの最初の DASH MPD リクエスト
に HTTP リダイレクト ステータス コード (302, 307 等) で応答するように構成されます。&lt;/p>
&lt;ul>
&lt;li>HTTP リダイレクトのレスポンスに含まれる Location ヘッダーは、MPD URL のファイル名に Wowza セッションID が埋め込まれた、更新された MPD URL を提供します&lt;/li>
&lt;li>プレーヤーは、そのセッション中の以降のすべての MPD リクエストに新しい URL を使用するようになります&lt;/li>
&lt;li>正しいサーバーが HTTP セッションを作成/管理 (その後、必要に応じてサーバーが MPD URL リダイレクトを実行) するよう、サーバー側の API 呼び出し (&lt;code>httpSession.redirectSession()&lt;/code>) を介して実装されたリダイレクト機能は、MPEG-DASH ストリーミングのセッションに関連するリダイレクトの前に実行されます&lt;/li>
&lt;li>このリダイレクトの仕組みが期待する効果を発揮するためには、リダイレクト後の MPD URL がプレーヤーで保存されて、その再生セッション中の以降のすべての MPD リクエストにその URL が使用される必要があります
&lt;blockquote>
&lt;p>Wowza セッションID の情報を持たない元の MPD URL をセッションで再度使用してはいけません&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;li>新しいセッションは、リクエストさえれた MPD URL に Wowza セッション ID の情報が含まれない MPD URL に対してのみ作成され、それ以外の場合、サーバーは提供されたセッション ID を使用して、同じ HTTP セッション内で続行します&lt;/li>
&lt;li>既定では、HTTP リダイレクトは 307 (一時リダイレクト) ステータスコードを使用します
&lt;ul>
&lt;li>HTTP 1.0 リクエストの場合、サーバーは 302 リダイレクト ステータスコードで上書きします&lt;/li>
&lt;li>&lt;code>mpegdashHttpRedirectDisableStatusCode302Override&lt;/code>, &lt;code>mpegdashHttpRedirectDefaultStatusCode&lt;/code> プロパティを使って、既定の動作を変更できます&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>DASH MPD HTTP リダイレクト機能を有効にするには、&lt;code>mpegdashHttpRedirectEnabled&lt;/code> プロパティを使って構成します。&lt;/p>
&lt;p>以下、HTTPリダイレクト機能のパラメーターに関する情報です。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>プロパティ名 (Name)&lt;/th>
&lt;th>プロパティのタイプ (Type)&lt;/th>
&lt;th>プロパティの値 (Value) の説明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>mpegdashHttpRedirectEnabled&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;td>&lt;strong>true&lt;/strong> に設定すると MPEG-DASH MPD ファイルの HTTP リダイレクトが有効になります: 既定値は &lt;strong>false&lt;/strong> です&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashHttpRedirectDefaultStatusCode&lt;/td>
&lt;td>Integer&lt;/td>
&lt;td>MPEG-DASH MPD ファイルの HTTP リダイレクト応答で使用されるデフォルトのリダイレクト ステータス コードを指定します: 既定値は &lt;strong>307&lt;/strong> (一時的なリダイレクト) です&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashHttpRedirectDisableStatusCode302Override&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;td>&amp;ldquo;HTTP 1.0&amp;rdquo; プロトコルの DASH MPD の HTTP 要求は、通常、上記のリダイレクト ステータス コードではなく、302 リダイレクト ステータス コードで応答します。このプロパティを &lt;strong>true&lt;/strong> に設定すると、そのオーバーライドを無効にして、通常のステータス コードを使用することができます: 既定値は &lt;strong>false&lt;/strong> です&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="その他の設定パラーメーターについて">その他の設定パラーメーターについて&lt;/h2>
&lt;p>以下のパラメーターが Wowza Streaming Engine でのMPEG-DASH ストリーミングのカスタマイズのために用意されています。&lt;/p>
&lt;h3 id="xml-パスが-rootapplicationhttpstreamer-のパラメーター">XML パスが &lt;code>/Root/Application/HTTPStreamer&lt;/code> のパラメーター&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>プロパティ名 (Name)&lt;/th>
&lt;th>プロパティのタイプ (Type)&lt;/th>
&lt;th>プロパティの値 (Value) の説明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>mpegdashAdjustCTTSForFirstKeyFrameToZero (バージョン 4.5.0 以降)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;td>&lt;strong>true&lt;/strong> に設定すると、VODファイル内のすべてのエンコードされたフレームの CompositionTimeToSample (CTTS) を調整して、MPEG-DASH プレーヤーでの再生を有効にします。このプロパティが設定されていない場合、または、設定されていても値が &lt;strong>false&lt;/strong> に設定されている場合、ビデオの最初のフレームに CTTS 値があると、Wowza Streaming Engine は次のメッセージを &lt;code>[install-dir]/logs/wowzastreamingengine_access.log&lt;/code> ファイルに記録します : &lt;code>MediaReaderH264MPEGDash.indexFile[vod/definst/earnings_release_1q16.mp4]: First frame of video has a non-zero CTTS value [200], playback may not work on all browsers, try setting HTTPStreamer/Properties boolean property mpegdashAdjustCTTSForFirstKeyFrameToZero to true&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashEnableUTCTimingElements&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;td>&lt;strong>false&lt;/strong> に設定すると、ライブストリーミングの MPEG-DASH MPD マニフェストファイルの UTCTiming 要素を削除します: 既定値は &lt;strong>true&lt;/strong> です (MPD マニフェストファイルに UTCTiming 要素が含まれます)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashUTCTimingSchemeOrder (バージョン 4.7.0 以降)&lt;/td>
&lt;td>String&lt;/td>
&lt;td>UTCTiming スキームを順序付けで有効にするための、優先順位が付けられたコンマ区切りのリストを指定します (リストの最初のものが最も優先されます)。有効な値は、&lt;code>direct&lt;/code>, &lt;code>http-head&lt;/code>、&lt;code>http-xsdate&lt;/code>、&lt;code>http-iso&lt;/code>、&lt;code>http-ntp&lt;/code>、&lt;code>ntp&lt;/code>、&lt;code>sntp&lt;/code> です。既定値は &lt;code>direct&lt;/code> です (ほとんどの場合この値で問題ありません)。&lt;br/>注意: &lt;code>direct&lt;/code> または &lt;code>http-head&lt;/code> 以外の値を指定する場合、対応する mpegdashUTCTiming&lt;code>[スキーム名]&lt;/code> プロパティを構成する必要があります。例えば、&lt;code>http-xsdate&lt;/code> を指定する場合は、&lt;code>mpegdashUTCTimingHttpXsDateList&lt;/code> プロパティを構成する必要があります。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashUTCTimingHttpHeadList (バージョン 4.7.0 以降)&lt;/td>
&lt;td>String&lt;/td>
&lt;td>HTTP ヘッダー内の日付情報を取得するために HTTP HEAD 要求を行うことができる HTTP URL の優先順のコンマ区切りリストを指定します (リストの最初のものが最も優先されます)。任意の有効な HTTP/HTTPS サーバー URL を指定します: 既定値は ローカルの Wowza Streaming Engine サーバー (&lt;code>${com.wowza.wms.context.ApplicationInstance.MPEGDash.domain}/dashtime.txt&lt;/code>) を指す URLです&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashUTCTimingHttpXsDateList (バージョン 4.7.0 以降)&lt;/td>
&lt;td>String&lt;/td>
&lt;td>適切な時間を取得するためにリクエストを送信できる HTTP URL の優先順のコンマ区切りリストを指定します。時刻は &lt;code>xs:dateTime&lt;/code> 形式で返されます。任意の有効な HTTP/HTTPS サーバー URL を指定します。例えば、http://myPublicServer.com/xsdate、https://mySecureServer.com/xsdate です: 既定値は &lt;code>null&lt;/code> です&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashUTCTimingHttpISOList (バージョン 4.7.0 以降)&lt;/td>
&lt;td>String&lt;/td>
&lt;td>適切な時間を取得するためにリクエストを送信できる HTTP URL の優先順のコンマ区切りリストを指定します。時刻は ISO タイム コード形式で返されます。任意の有効な HTTP/HTTPS サーバー URL を指定します。例えば、http://myPublicServer.com/xsdate、https://mySecureServer.com/xsdate です: 既定値は &lt;code>null&lt;/code> です&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashUTCTimingHttpNTPList (バージョン 4.7.0 以降)&lt;/td>
&lt;td>String&lt;/td>
&lt;td>適切な時間を取得するためにリクエストを送信できる HTTP URL の優先順のコンマ区切りリストを指定します。時刻は NTP タイムスタンプ形式で返されます。任意の有効な HTTP/HTTPS サーバー URL を指定します。例えば、http://myPublicServer.com/ntptime、https://mySecureServer.com/ntptime です: 既定値は &lt;code>null&lt;/code> です&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashUTCTimingNTPList (バージョン 4.7.0 以降)&lt;/td>
&lt;td>String&lt;/td>
&lt;td>適切な時刻を取得するために NTP プロトコル (IETF RFC 5905 で定義) が利用可能な優先順位が付けられたコンマ区切りのサーバーのリストを指定します。有効な NTP サーバー名または IP アドレスを指定します。例えば、time-a.nist.gov、time-b.nist.gov、129.6.15.29 です: 既定値は &lt;code>null&lt;/code> です&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashUTCTimingSNTPList (バージョン 4.7.0 以降)&lt;/td>
&lt;td>String&lt;/td>
&lt;td>適切な時刻を取得するために SNTP プロトコル (IETF RFC 5905 で定義) が利用可能な優先順位が付けられたコンマ区切りのサーバーのリストを指定します。有効な SNTP サーバー名または IP アドレスを指定します。例えば、time-a.nist.gov、time-b.nist.gov、129.6.15.29 です: 既定値は &lt;code>null&lt;/code> です&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="xml-パスが-rootapplication-のパラメーター">XML パスが &lt;code>/Root/Application&lt;/code> のパラメーター&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>プロパティ名 (Name)&lt;/th>
&lt;th>プロパティのタイプ (Type)&lt;/th>
&lt;th>プロパティの値 (Value) の説明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>mpegdashMinBufferTime (バージョン 4.5.0 以降)&lt;/td>
&lt;td>Integer&lt;/td>
&lt;td>MPEG-DASH MPD の minBufferTime 属性を変更します: 既定値は &lt;strong>6000&lt;/strong> (ライブ ストリームの場合) または &lt;strong>1500&lt;/strong> (VODストリームの場合) です&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>mpegdashAddMPDSegmentBaseURL (バージョン 4.6.0 以降)&lt;/td>
&lt;td>Boolean&lt;/td>
&lt;td>&lt;code>&amp;lt;BaseURL&amp;gt;&lt;/code> タグを MPD に含めるかどうかを制御します。 &lt;code>&amp;lt;BaseURL&amp;gt;&lt;/code> の挿入を有効にするには値を &lt;strong>true&lt;/strong> に設定します: 既定値 false です&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Resources: Wowza Streaming Engine を使ったライブストリーミング (3)</title><link>https://www.liveinstantly.com/ja/resources/blog/stream-live-with-wse-3/</link><pubDate>Fri, 20 Nov 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/stream-live-with-wse-3/</guid><description>&lt;h2 id="はじめに">はじめに&lt;/h2>
&lt;p>&lt;a href="../stream-live-with-wse-2/">前回の記事&lt;/a>
では FFmpeg で生成したマルチビットレートの RTMP ライブストリーム (マルチストリーム) をアップロードして、
Wowza Streaming Engine 経由でストリーミング配信を行うための設定を紹介しました。&lt;/p>
&lt;p>この記事では、RTMP のシングルビットレートのライブソースを Wowza Streaming Engine に入力し、
Wowza Streaming Engine のトランスコーディング機能を使ってマルチビットレートのライブストリームを生成して、
アダプティブストリーミングのライブストリーミング配信を行うための方法を紹介します。&lt;/p>
&lt;p>ライブソースのオリジンからマルチビットレートのストリームを Wowza Streaming Engine へ入力する際に十分なネットワーク帯域が確保できない場合、
一番画質のよいライブソースのみを Wowza Streaming Engine へ入力し、Wowza Streaming Engine でマルチビットレートの生成を行って、
アダプティブストリーミングのライブストリーミング配信を実現することができます。&lt;/p>
&lt;p>作業の手順は、以下の通りです。&lt;/p>
&lt;ol>
&lt;li>ライブソースストリームの入力セキュリティの設定 (省略)&lt;/li>
&lt;li>FFmpeg によるビデオファイルを使った RTMP ライブソースの入力 (省略)&lt;/li>
&lt;li>ライブトランスコーダーの設定&lt;/li>
&lt;li>ライブストリーミング再生のテスト&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://peach.blender.org/download/" target="_blank">Big Buck Bunny サイト&lt;/a>
のビデオコンテンツをサンプルとして使うストリーミングコンテンツとします。&lt;/p>
&lt;blockquote>
&lt;p>配信で利用する &lt;a href="https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4" target="_blank">ビデオファイル&lt;/a>
はこちらを利用しました。&lt;/p>
&lt;/blockquote>
&lt;h2 id="手順1-ライブソースの入力セキュリティの設定-省略">手順1: ライブソースの入力セキュリティの設定 (省略)&lt;/h2>
&lt;p>&lt;a href="../stream-live-with-wse/">前回の記事&lt;/a>
で作成した設定を利用するため、ここでは省略します。&lt;/p>
&lt;p>手順の詳細は、&lt;a href="../stream-live-with-wse/">前回の記事&lt;/a>
を参照します。&lt;/p>
&lt;h1 id="手順2-ライブトランスコーダーの設定">手順2: ライブトランスコーダーの設定&lt;/h1>
&lt;p>Wowza Streaming Engine のライブトランスコーダーを設定すると、入力したライブソースのトランスコードを行うことができます。&lt;/p>
&lt;p>ライブトランスコーダーを設定するには、以下の手順で行います。&lt;/p>
&lt;blockquote>
&lt;p>ここでは既存のトランスコーダーテンプレートを利用します。&lt;/p>
&lt;/blockquote>
&lt;ol>
&lt;li>
&lt;p>Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [&lt;strong>Application&lt;/strong>] をクリックします。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>左のメニューから [&lt;strong>live&lt;/strong>] アプリケーションをクリックし、[&lt;strong>Transcoder&lt;/strong>] をクリックします。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>[Edit]&lt;/strong> ボタンを押します。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>以下のパラメーター情報を入力して、&lt;strong>[Save]&lt;/strong> ボタンをクリックします。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>パラメーター&lt;/th>
&lt;th>値&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Template Directory&lt;/td>
&lt;td>既定のテンプレートを利用するため、既定値のままとします&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Transcoder Options&lt;/td>
&lt;td>チェックボックスを有効にしたままにします (&lt;strong>Match source stream name to template name&lt;/strong>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fallback Template&lt;/td>
&lt;td>&amp;ldquo;&lt;strong>Transrate (Default)&lt;/strong>&amp;rdquo; (既定値) を選択します&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>トランスコーダーの &amp;ldquo;&lt;strong>Status&lt;/strong>&amp;rdquo; が &amp;ldquo;&lt;strong>Not Enabled&lt;/strong>&amp;rdquo; の場合、&lt;strong>[Enable Transcoder]&lt;/strong> をクリックします。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>画面上部の情報バーの &lt;strong>[Restart Now]&lt;/strong> ボタンをクリックします。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>アプリケーションの再起動が完了したら、準備完了です。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>また、[&lt;strong>Transcoder&lt;/strong>] 画面では、トランスコーダーのテンプレートをクリックすると、
トランスコーダーで生成するストリームの詳細を表示することができます。&lt;/p>
&lt;p>トランスコーダーの生成するストリームごとに有効・無効の設定が異なる場合がありますが、
トランスコーダーのテンプレートの詳細画面から、プリセット名 (Preset) をクリックすると、そのストリームを有効・無効を変更することができます。&lt;/p>
&lt;p>ここでは、以下の通り、160p, 360p, source を有効にします (既定値のとおり)。&lt;/p>
&lt;blockquote>
&lt;p>注意: トランスコーダーを動作させる際には、Wowza Streaming Engine が動作している環境の CPU スペックが
トランスコード処理の合計に対して十分なキャパシティがあるかを確認してください。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="./wowza-streaming-engine-live-transcoder-encoding-preset.jpg" alt="Live Transcoder Encoding Presets">&lt;/p>
&lt;h2 id="手順3-ffmpeg-によるビデオファイルを使ったライブソースの入力">手順3: FFmpeg によるビデオファイルを使ったライブソースの入力&lt;/h2>
&lt;p>&lt;a href="../stream-live-with-wse/">前回の記事&lt;/a>
と同様に以下の FFmpeg コマンドで、ビデオファイルから生成したライブソースを Wowza Streaming Engine に入力します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ffmpeg -threads &lt;span class="m">4&lt;/span> -re -stream_loop -1 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -i ~/videos/bbb_sunflower_1080p_30fps_normal.mp4 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -rtmp_live live -pix_fmt yuv420p -r &lt;span class="m">30&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -map 0✌️0 -c:v libx264 -preset veryfast -tune animation &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -b:v 1500k -profile:v high -s:v 1280x720 -minrate:v 1500k -maxrate:v 1500k -bufsize:v 3000k &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -flags:v +cgop -g &lt;span class="m">60&lt;/span> -x264opts &lt;span class="nv">keyint&lt;/span>&lt;span class="o">=&lt;/span>60:keyint_min&lt;span class="o">=&lt;/span>60:no-scenecut &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -sc_threshold &lt;span class="m">0&lt;/span> -crf &lt;span class="m">23&lt;/span> -vsync &lt;span class="m">1&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -map 0:1 -c:a aac -b:a 64k -ac &lt;span class="m">2&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -af:a &lt;span class="nv">aresample&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">async&lt;/span>&lt;span class="o">=&lt;/span>1:min_hard_comp&lt;span class="o">=&lt;/span>0.100000:first_pts&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -f flv rtmp://&lt;span class="o">[&lt;/span>username&lt;span class="o">]&lt;/span>:&lt;span class="o">[&lt;/span>password&lt;span class="o">]&lt;/span>@&lt;span class="o">[&lt;/span>wowza_hostname&lt;span class="o">]&lt;/span>:1935/live/livestream1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>この FFmpeg コマンドでは前回利用したビデオフィルターによるビットレートや時刻情報の埋め込みは行いません&lt;/p>
&lt;/blockquote>
&lt;p>ライブソースストリームの入力が開始したら、上部メニューバーの [&lt;strong>Applications&lt;/strong>] をクリックし、
左のメニューから既定のライブアプリケーション (&lt;strong>live&lt;/strong>) をクリックします。
次に、左のメニューから [&lt;strong>Incoming Streams&lt;/strong>] をクリックすると、&lt;code>livestream1&lt;/code> という名前の入力ストリームと
トランスコーダーで生成したライブストリームが入力ストリームとして表示されていることが確認できます。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-live-transcoder-incoming-streams.jpg" alt="Live Transcoder Incoming Streams">&lt;/p>
&lt;p>&lt;strong>[View by Group]&lt;/strong> をクリックすると、複数のストリームをまとめたストリームグループが表示されます。&lt;/p>
&lt;p>これらのグループは、トランスコーダーテンプレートで定義されたグループで、以下の例では、&lt;code>livestream1_all&lt;/code> と &lt;code>livestream1_mobile&lt;/code> の 2 つのグループが表示されています。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-live-transcoder-incoming-streams.jpg" alt="Live Transcoder Incoming Streams (NGRP)">&lt;/p>
&lt;blockquote>
&lt;p>ストリームグループは、トランスコーダーテンプレートで自由にグループを定義できるため、必要に応じて、トランスコーダーのテンプレートを新しく作成したり、既存のテンプレートを変更したりします。&lt;/p>
&lt;/blockquote>
&lt;h2 id="手順4-ライブストリーミング再生のテスト">手順4: ライブストリーミング再生のテスト&lt;/h2>
&lt;p>手順3でライブストリームの入力が完了したら、ライブストリームの配信ができる状態になります。&lt;/p>
&lt;p>ライブストリームの再生 URL は以下のように構成されます。&lt;/p>
&lt;p>&lt;code>ngrp&lt;/code> というプレフィックス名を使うことでストリームグループにアクセスすることができます。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ストリーミング形式&lt;/th>
&lt;th>URL&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>HLS&lt;/td>
&lt;td>https://&lt;strong>[WowzaStreamingEngineのドメイン名]&lt;/strong>/&lt;strong>[アプリケーション名]&lt;/strong>/ngrp:&lt;strong>[入力ストリーム名]&lt;/strong>/playlist.m3u8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DASH&lt;/td>
&lt;td>https://&lt;strong>[WowzaStreamingEngineのドメイン名]&lt;/strong>/&lt;strong>[アプリケーション名]&lt;/strong>/ngrp:&lt;strong>[入力ストリーム名]&lt;/strong>/manifest.mpd&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>[&lt;strong>アプリケーション名&lt;/strong>] は、この例では &lt;strong>live&lt;/strong> となります。&lt;/p>
&lt;p>[&lt;strong>入力ストリーム名&lt;/strong>] は、この例では &lt;strong>livestream1_all&lt;/strong> または &lt;strong>livestream1_mobile&lt;/strong> となります。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;a href="https://testplayer.demo.liveinstantly.cloud/" target="_blank">Web プレイヤー&lt;/a>
を使って、再生のテストを行います。&lt;/p>
&lt;h2 id="まとめ">まとめ&lt;/h2>
&lt;p>この記事では、FFmpeg で生成したシングルビットレートの RTMP ライブストリームをアップロードし、
Wowza Streaming Engine 経由でマルチビットレートのトランスコードを行って、
アダプティブストリーミング配信を行うための設定を紹介しました。&lt;/p>
&lt;p>ライブソースのオリジンからマルチビットレートのストリームを Wowza Streaming Engine へ入力する際に十分なネットワーク帯域が確保できない場合、
一番画質のよいライブソースのみを Wowza Streaming Engine へ入力し、Wowza Streaming Engine でマルチビットレートの生成を行って、
アダプティブストリーミングのライブストリーミング配信を実現することができます。&lt;/p>
&lt;p>Wowza Streaming Engine を利用することで、RTMP, RTSP, SRT 等のライブストリームを Apple HLS, MPEG-DASH などの
ストリーミング形式に変換することができるようになります。
また、CDN と組み合わせを行うことで大規模なアダプティブストリーミング配信を実現することも可能となります。&lt;/p></description></item><item><title>Resources: Wowza Streaming Engine を使ったライブストリーミング (2)</title><link>https://www.liveinstantly.com/ja/resources/blog/stream-live-with-wse-2/</link><pubDate>Tue, 10 Nov 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/stream-live-with-wse-2/</guid><description>&lt;h2 id="はじめに">はじめに&lt;/h2>
&lt;p>&lt;a href="../stream-live-with-wse/">前回の記事&lt;/a>
では FFmpeg で生成した RTMP ライブストリーム (シングルストリーム) をアップロードして、
Wowza Streaming Engine 経由でストリーミング配信を行うための設定を紹介しました。&lt;/p>
&lt;p>この記事では、アダプティブストリーミングのライブストリーミング配信を行うための方法を紹介します。&lt;/p>
&lt;p>作業の手順は、以下の通りです。&lt;/p>
&lt;ol>
&lt;li>ライブソースストリームの入力セキュリティの設定 (省略)&lt;/li>
&lt;li>FFmpeg によるビデオファイルを使った RTMP ライブソースの入力&lt;/li>
&lt;li>SMIL ファイルの作成&lt;/li>
&lt;li>ライブストリーミング再生のテスト&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://peach.blender.org/download/" target="_blank">Big Buck Bunny サイト&lt;/a>
のビデオコンテンツをサンプルとして使うストリーミングコンテンツとします。&lt;/p>
&lt;blockquote>
&lt;p>配信で利用する &lt;a href="https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4" target="_blank">ビデオファイル&lt;/a>
はこちらを利用しました。&lt;/p>
&lt;/blockquote>
&lt;h2 id="手順1-ライブソースの入力セキュリティの設定-省略">手順1: ライブソースの入力セキュリティの設定 (省略)&lt;/h2>
&lt;p>&lt;a href="../stream-live-with-wse/">前回の記事&lt;/a>
で作成した設定を利用するため、ここでは省略します。&lt;/p>
&lt;p>手順の詳細は、&lt;a href="../stream-live-with-wse/">前回の記事&lt;/a>
を参照します。&lt;/p>
&lt;h2 id="手順2-ffmpeg-によるビデオファイルを使ったライブソースの入力">手順2: FFmpeg によるビデオファイルを使ったライブソースの入力&lt;/h2>
&lt;p>以下のコマンドを実行し、ビデオファイルとスクリプトファイルをダウンロードします。
スクリプトファイルは &lt;a href="https://gist.github.com/liveinstantly/7969cc44d14e96c98434cf4e8744a15f" target="_blank">Gist で公開しているシェルスクリプト&lt;/a>
を利用します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir videos
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> videos
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -O https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -LO https://gist.github.com/liveinstantly/7969cc44d14e96c98434cf4e8744a15f/raw/88d2a83c77e01ff32262db04f739e5755efbd6a5/ffmpeg_filelive_abr_transcode.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +x ffmpeg_filelive_abr_transcode.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -O https://wowzademostorage1.blob.core.windows.net/transcoding/liveencode_spec_sample.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下のコマンドを実行して、ビデオのトランスコードとライブソースの入力を行います。&lt;/p>
&lt;p>このスクリプトでは、ビデオファイルから複数のビットレートのライブストリームを生成し、Wowza Streaming Engine に入力します。
生成する複数のライブストリームの詳細は &lt;code>liveencode_spec_sample.txt&lt;/code> ファイルで定義します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./ffmpeg_filelive_abr_transcode.sh -f ~/videos/bbb_sunflower_1080p_30fps_normal.mp4 -s ./liveencode_spec_sample.txt -h **&lt;span class="o">[&lt;/span>WowzaStreamingEngineのドメイン名&lt;span class="o">]&lt;/span>** -a **live** -u **&lt;span class="o">[&lt;/span>username&lt;span class="o">]&lt;/span>** -p &lt;span class="s2">&amp;#34;**[password]**&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>liveencode_spec_sample.txt&lt;/code> ファイルは、コンマ区切りのファイルになっていて、以下の情報が含まれています。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ストリーム名&lt;/th>
&lt;th>解像度(幅)&lt;/th>
&lt;th>解像度(高さ)&lt;/th>
&lt;th>ビットレート&lt;/th>
&lt;th>プロファイル&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>livestream1&lt;/td>
&lt;td>1280&lt;/td>
&lt;td>720&lt;/td>
&lt;td>1500&lt;/td>
&lt;td>high&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>livestream2&lt;/td>
&lt;td>960&lt;/td>
&lt;td>540&lt;/td>
&lt;td>800&lt;/td>
&lt;td>baseline&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>livestream3&lt;/td>
&lt;td>640&lt;/td>
&lt;td>360&lt;/td>
&lt;td>500&lt;/td>
&lt;td>baseline&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>ライブソースストリームの入力が開始したら、上部メニューバーの [&lt;strong>Applications&lt;/strong>] をクリックし、
左のメニューから既定のライブアプリケーション (&lt;strong>live&lt;/strong>) をクリックします。
次に、左のメニューから [&lt;strong>Incoming Streams&lt;/strong>] をクリックすると、
&lt;code>livestream1&lt;/code>, &lt;code>livestream2&lt;/code>, &lt;code>livestream3&lt;/code> という名前のストリームが入力されていることが確認できます。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-incoming-stream-2.jpg" alt="Live Incoming Stream">&lt;/p>
&lt;h2 id="手順3-smil-ファイルの作成">手順3: SMIL ファイルの作成&lt;/h2>
&lt;p>アダプティブストリーミング配信のために SMIL ファイルを作成します。&lt;/p>
&lt;p>以下の SMIL ファイル (XML ファイル) を作成し &lt;code>/usr/local/WowzaStreamingEngine/content&lt;/code> ディレクトリに追加します。&lt;/p>
&lt;p>&lt;code>liveencode_spec_sample.txt&lt;/code> ファイルの詳細情報に従って、以下のように SMIL ファイルを定義します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;smil&lt;/span> &lt;span class="na">title=&lt;/span>&lt;span class="s">&amp;#34;Sample SMIL file for Live Adaptive Streaming&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;body&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;switch&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;720&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;livestream1&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;1280&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;1500000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;128000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;540&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;livestream2&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;960&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;800000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;64000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;360&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;livestream3&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;640&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;500000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;64000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/switch&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/body&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/smil&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="手順4-ライブストリーミング再生のテスト">手順4: ライブストリーミング再生のテスト&lt;/h2>
&lt;p>手順2でライブストリームの入力が完了したら、ライブストリームの配信ができる状態になります。&lt;/p>
&lt;p>ライブストリームの再生 URL は以下のように構成されます。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ストリーミング形式&lt;/th>
&lt;th>URL&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>HLS&lt;/td>
&lt;td>https://&lt;strong>[WowzaStreamingEngineのドメイン名]&lt;/strong>/&lt;strong>[アプリケーション名]&lt;/strong>/smil:&lt;strong>[SMILファイル名]&lt;/strong>/playlist.m3u8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DASH&lt;/td>
&lt;td>https://&lt;strong>[WowzaStreamingEngineのドメイン名]&lt;/strong>/&lt;strong>[アプリケーション名]&lt;/strong>/smil:&lt;strong>[SMILファイル名]&lt;/strong>/manifest.mpd&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>[&lt;strong>アプリケーション名&lt;/strong>] は、この例では &lt;strong>live&lt;/strong> となります。&lt;/p>
&lt;p>[&lt;strong>SMILファイル名&lt;/strong>] は、この例では &lt;strong>adaptivelivestream&lt;/strong> となります。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;a href="https://testplayer.demo.liveinstantly.cloud/" target="_blank">Web プレイヤー&lt;/a>
を使って、再生のテストを行います。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-live-play-test-2.jpg" alt="ライブストリーム再生テスト">&lt;/p>
&lt;h2 id="まとめ">まとめ&lt;/h2>
&lt;p>この記事では、FFmpeg で生成したマルチビットレートの RTMP ライブストリームをアップロードして、
Wowza Streaming Engine 経由でストリーミング配信を行うための設定を紹介しました。&lt;/p>
&lt;p>Wowza Streaming Engine を利用することで、RTMP, RTSP, SRT 等のライブストリームを Apple HLS, MPEG-DASH などの
ストリーミング形式に変換することができるようになります。また、CDN と組み合わせを行うことで大規模な HTTP ベースの
アダプティブストリーミング配信を実現することも可能となります。&lt;/p></description></item><item><title>Resources: Wowza Streaming Engine を使ったライブストリーミング (1)</title><link>https://www.liveinstantly.com/ja/resources/blog/stream-live-with-wse/</link><pubDate>Fri, 30 Oct 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/stream-live-with-wse/</guid><description>&lt;h2 id="はじめに">はじめに&lt;/h2>
&lt;p>この記事では、Wowza Streaming Engine でライブストリーミング配信を行うためのセットアップを行います。&lt;/p>
&lt;p>ライブ配信は、Wowza Streaming Engine にライブソースストリームを入力し、そのライブストリームをストリーミング方式に変換して、ライブストリーミング配信を行います。&lt;/p>
&lt;p>作業の手順は、以下の通りです。&lt;/p>
&lt;ol>
&lt;li>ライブソースストリームの入力セキュリティの設定&lt;/li>
&lt;li>FFmpeg によるビデオファイルを使った RTMP ライブソースの入力&lt;/li>
&lt;li>ライブストリーミング再生のテスト&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://peach.blender.org/download/" target="_blank">Big Buck Bunny サイト&lt;/a>
のビデオコンテンツをサンプルとして使うストリーミングコンテンツとします。&lt;/p>
&lt;blockquote>
&lt;p>配信で利用する &lt;a href="https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4" target="_blank">ビデオファイル&lt;/a>
はこちらを利用しました。&lt;/p>
&lt;/blockquote>
&lt;h2 id="手順1-ライブソースの入力セキュリティの設定">手順1: ライブソースの入力セキュリティの設定&lt;/h2>
&lt;p>Wowza Streaming Engine にライブソースストリームを入力する際にパスワードで認証を行うことにより、
ライブソースの入力セキュリティを確保することができます。&lt;/p>
&lt;p>ライブソースの入力セキュリティを設定にするには、以下の手順で行います。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [&lt;strong>Server&lt;/strong>] をクリックします。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>左のメニューから [&lt;strong>Source Authentication&lt;/strong>] をクリックします。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>[+Add Source]&lt;/strong> ボタンを押します。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>以下のパラメーター情報を入力して、&lt;strong>[+Add]&lt;/strong> ボタンをクリックします。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>パラメーター&lt;/th>
&lt;th>値&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Source User Name&lt;/td>
&lt;td>ソース認証のユーザー名: 例: &lt;code>livestream1&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Source Password (Confirm Password)&lt;/td>
&lt;td>ソース認証のパスワード&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>注意: ユーザー名とパスワードの値は、大文字と小文字が区別され、英数字、ピリオド (.)、アンダースコア (_)、およびハイフン (-) 文字のみを含めることができます。&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>上部メニューバーの [&lt;strong>Applications&lt;/strong>] をクリックし、左のメニューから既定のライブアプリケーション (&lt;strong>live&lt;/strong>) をクリックします。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>左のメニューから [&lt;strong>Source Security&lt;/strong>] をクリックし、ソースセキュリティの設定を確認します。&lt;/p>
&lt;ul>
&lt;li>[&lt;strong>RTMP Sources&lt;/strong>] が [&lt;strong>Require password authentication&lt;/strong>] (パスワード認証を必要とする) となっているかを確認する。&lt;/li>
&lt;li>もし設定が異なる場合は、&lt;strong>[Edit]&lt;/strong> ボタンをクリックし、設定変更を行う。&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="./wowza-streaming-engine-live-source-security.jpg" alt="WSE Live Source Security 設定">&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="手順2-ffmpeg-によるビデオファイルを使ったライブソースの入力">手順2: FFmpeg によるビデオファイルを使ったライブソースの入力&lt;/h2>
&lt;p>以下のコマンドを実行し、ビデオファイルをダウンロードします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir videos
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> videos
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -O https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ビデオのダウンロードが完了したら、&lt;a href="https://ffmpeg.org/" target="_blank">FFmpeg ツール&lt;/a>
を使ってダウンロードしたビデオファイルから、
次の FFmpeg コマンドを使って、RTMP ライブソースストリームを生成し、Wowza Streaming Engine の &lt;code>live&lt;/code> アプリケーションに入力します。&lt;/p>
&lt;blockquote>
&lt;p>ライブソースストリームの入力 URL には、手順1で設定したソース認証のユーザー名 (&lt;code>[username]&lt;/code>) と
ソース認証のパスワード (&lt;code>[password]&lt;/code>) を正しく指定します。&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ffmpeg -threads &lt;span class="m">4&lt;/span> -re -stream_loop -1 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -i ~/videos/bbb_sunflower_1080p_30fps_normal.mp4 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -rtmp_live live -pix_fmt yuv420p -r &lt;span class="m">30&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -map 0✌️0 -c:v libx264 -preset veryfast -tune animation &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -b:v 1500k -profile:v high -s:v 1280x720 -minrate:v 1500k -maxrate:v 1500k -bufsize:v 3000k &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -flags:v +cgop -g &lt;span class="m">60&lt;/span> -x264opts &lt;span class="nv">keyint&lt;/span>&lt;span class="o">=&lt;/span>60:keyint_min&lt;span class="o">=&lt;/span>60:no-scenecut &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -sc_threshold &lt;span class="m">0&lt;/span> -crf &lt;span class="m">23&lt;/span> -vsync &lt;span class="m">1&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -filter:v &lt;span class="nv">drawtext&lt;/span>&lt;span class="o">=&lt;/span>:text&lt;span class="o">=(&lt;/span>&lt;span class="nv">bitrate&lt;/span>&lt;span class="o">=&lt;/span>1500K&lt;span class="o">)&lt;/span>:fontsize&lt;span class="o">=&lt;/span>32:x&lt;span class="o">=&lt;/span>32:y&lt;span class="o">=&lt;/span>32:box&lt;span class="o">=&lt;/span>1:boxcolor&lt;span class="o">=&lt;/span>white:fontcolor&lt;span class="o">=&lt;/span>black,drawtext&lt;span class="o">=&lt;/span>:text&lt;span class="o">=&lt;/span>%&lt;span class="o">{&lt;/span>localtime&lt;span class="o">}&lt;/span>:x&lt;span class="o">=&lt;/span>32:y&lt;span class="o">=&lt;/span>64:fontsize&lt;span class="o">=&lt;/span>32:box&lt;span class="o">=&lt;/span>1:boxcolor&lt;span class="o">=&lt;/span>white:fontcolor&lt;span class="o">=&lt;/span>black,drawtext&lt;span class="o">=&lt;/span>:text&lt;span class="o">=&lt;/span>%&lt;span class="o">{&lt;/span>pts&lt;span class="se">\\&lt;/span>:hms&lt;span class="o">}&lt;/span>:x&lt;span class="o">=&lt;/span>32:y&lt;span class="o">=&lt;/span>96:fontsize&lt;span class="o">=&lt;/span>32:box&lt;span class="o">=&lt;/span>1:boxcolor&lt;span class="o">=&lt;/span>white:fontcolor&lt;span class="o">=&lt;/span>black &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -map 0:1 -c:a aac -b:a 64k -ac &lt;span class="m">2&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -af:a &lt;span class="nv">aresample&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">async&lt;/span>&lt;span class="o">=&lt;/span>1:min_hard_comp&lt;span class="o">=&lt;/span>0.100000:first_pts&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -f flv rtmp://&lt;span class="o">[&lt;/span>username&lt;span class="o">]&lt;/span>:&lt;span class="o">[&lt;/span>password&lt;span class="o">]&lt;/span>@&lt;span class="o">[&lt;/span>wowza_hostname&lt;span class="o">]&lt;/span>:1935/live/livestream1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>この FFmpeg を使ったコマンドでは、ビデオファイルを 1280x720 の解像度でエンコードしたストリームで RTMP ストリームを生成しています。
エンコード時に、ビデオフィルター機能を使って、現在の日時・時刻の情報を映像に埋め込む処理をしています。&lt;/p>
&lt;/blockquote>
&lt;p>ライブソースストリームの入力が開始したら、上部メニューバーの [&lt;strong>Applications&lt;/strong>] をクリックし、
左のメニューから既定のライブアプリケーション (&lt;strong>live&lt;/strong>) をクリックします。
次に、左のメニューから [&lt;strong>Incoming Streams&lt;/strong>] をクリックすると、&lt;code>livestream1&lt;/code> という名前の
ストリームが入力されていることが確認できます。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-incoming-stream.jpg" alt="Live Incoming Stream">&lt;/p>
&lt;h2 id="手順3-ライブストリーミング再生のテスト">手順3: ライブストリーミング再生のテスト&lt;/h2>
&lt;p>手順2でライブストリームの入力が完了したら、ライブストリームの配信ができる状態になります。&lt;/p>
&lt;p>ライブストリームの再生 URL は以下のように構成されます。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ストリーミング形式&lt;/th>
&lt;th>URL&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>HLS&lt;/td>
&lt;td>https://&lt;strong>[WowzaStreamingEngineのドメイン名]&lt;/strong>/&lt;strong>[アプリケーション名]&lt;/strong>/&lt;strong>[入力ストリーム名]&lt;/strong>/playlist.m3u8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DASH&lt;/td>
&lt;td>https://&lt;strong>[WowzaStreamingEngineのドメイン名]&lt;/strong>/&lt;strong>[アプリケーション名]&lt;/strong>/&lt;strong>[入力ストリーム名]&lt;/strong>/manifest.mpd&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>[&lt;strong>アプリケーション名&lt;/strong>] は、この例では &lt;strong>live&lt;/strong> となります。&lt;/p>
&lt;p>[&lt;strong>入力ストリーム名&lt;/strong>] は、この例では &lt;strong>livestream1&lt;/strong> となります。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;a href="https://testplayer.demo.liveinstantly.cloud/" target="_blank">Web プレイヤー&lt;/a>
を使って、再生のテストを行います。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-live-play-test.jpg" alt="ライブストリーム再生テスト">&lt;/p>
&lt;h2 id="まとめ">まとめ&lt;/h2>
&lt;p>この記事では、FFmpeg で生成した RTMP ライブストリームをアップロードして、Wowza Streaming Engine 経由で
ストリーミング配信を行うための設定を紹介しました。&lt;/p>
&lt;p>Wowza Streaming Engine を利用することで、RTMP, RTSP, SRT 等のライブストリームを Apple HLS, MPEG-DASH などの
ストリーミング形式に変換することができるようになります。また、CDN と組み合わせを行うことで大規模な HTTP ベースの
アダプティブストリーミング配信を実現することも可能となります。&lt;/p></description></item><item><title>Resources: Wowza Streaming Engine を使った VOD ストリーミングのセットアップ</title><link>https://www.liveinstantly.com/ja/resources/blog/stream-vod-contents-with-wse/</link><pubDate>Tue, 20 Oct 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/stream-vod-contents-with-wse/</guid><description>&lt;h2 id="はじめに">はじめに&lt;/h2>
&lt;p>この記事では、Wowza Streaming Engine で VOD (ビデオ・オンデマンド) でストリーミング コンテンツの配信を行うためのセットアップを行います。&lt;/p>
&lt;p>作業の手順は、以下の通りです。&lt;/p>
&lt;ol>
&lt;li>アダプティブストリーミング用の VOD ファイルの作成&lt;/li>
&lt;li>SMIL ファイルの作成&lt;/li>
&lt;li>ビデオファイルのアップロード&lt;/li>
&lt;li>Wowza Streaming Engine のセットアップ&lt;/li>
&lt;li>アダプティブストリーミング再生のテスト&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://peach.blender.org/download/" target="_blank">Big Buck Bunny サイト&lt;/a>
のビデオコンテンツをサンプルとして使うストリーミングコンテンツとします。&lt;/p>
&lt;blockquote>
&lt;p>配信で利用する &lt;a href="https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4" target="_blank">ビデオファイル&lt;/a>
はこちらを利用しました。&lt;/p>
&lt;/blockquote>
&lt;h2 id="手順1-アダプティブストリーミング用の-vod-ファイルの作成">手順1: アダプティブストリーミング用の VOD ファイルの作成&lt;/h2>
&lt;p>アダプティブストリーミング方式でのストリーミング再生では、プレイヤーのネットワーク接続の帯域幅に合わせて複数のビットレートと解像度のビデオを切り替えながら、ストリーミングビデオを再生します。まず、&lt;a href="https://ffmpeg.org/" target="_blank">FFmpeg ツール&lt;/a>
を使って、オリジナルのビデオファイルから、複数のビットレートの MP4 ファイルを作成します。&lt;/p>
&lt;p>Ubuntu Linux への FFmpeg のインストールは以下のコマンドを実行します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install ffmpeg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>参考までに、利用した FFmpeg のバージョンは以下になります。&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ ffmpeg -version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright &lt;span class="o">(&lt;/span>c&lt;span class="o">)&lt;/span> 2000-2021 the FFmpeg developers
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>FFmpeg を使った複数ビットレートの MP4 のトランスコードにあたり、&lt;a href="https://gist.github.com/liveinstantly/adfdcdeb8ab2a4ecb7fe2b3844ef5cac" target="_blank">Gist で公開しているシェルスクリプト&lt;/a>
を利用します。以下のコマンドを実行して、ビデオのダウンロード、トランスコードを行います。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir videos
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> videos
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -O https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -LO https://gist.github.com/liveinstantly/adfdcdeb8ab2a4ecb7fe2b3844ef5cac/raw/a2b0272dd06f9676a02cc6f0ff812123e0490742/ffmpeg_abr_transcode.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -O https://wowzademostorage1.blob.core.windows.net/transcoding/encode_spec_sample.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chmod +x ffmpeg_abr_transcode.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./ffmpeg_abr_transcode.sh bbb_sunflower_1080p_30fps_normal.mp4 BigBuckBunny-h264-1080p-30fps encode_spec_sample.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir bigbuckbunny-1080p-30fps-h264
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv BigBuckBunny-h264-1080p-30fps*.mp4 bigbuckbunny-1080p-30fps-h264/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>生成された MP4 ビデオファイルは以下の通りです。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_0400_320x180.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_0650_640x360.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_1000_640x360.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_1500_960x540.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_2250_960x540.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_3400_1280x720.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_4700_1920x1080.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BigBuckBunny-h264-1080p-30fps_6000_1920x1080.mp4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="手順2-smil-ファイルの作成">手順2: SMIL ファイルの作成&lt;/h2>
&lt;p>アダプティブストリーミング方式での配信用に SMIL ファイルを作成します。&lt;/p>
&lt;p>下記の XML (SMIL) ファイルを &lt;code>~/videos/bbb_h264_1080p_30fps.smil&lt;/code> に保存します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;smil&lt;/span> &lt;span class="na">title=&lt;/span>&lt;span class="s">&amp;#34;Big Buck Bunny H264 1080p 30fps Adaptive Bitrate sample content&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;body&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;switch&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_0400_320x180.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;320&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;180&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_0400_320x180.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;400000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;64000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_0650_640x360.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;640&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;360&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_0650_640x360.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;650000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;64000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_1000_640x360.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;640&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;360&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_1000_640x360.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;1000000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;64000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_1500_960x540.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;960&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;540&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_1500_960x540.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;1500000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;64000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_2250_960x540.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;960&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;540&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_2250_960x540.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;2250000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;64000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_3400_1280x720.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;1280&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;720&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_3400_1280x720.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;3400000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;128000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_4700_1920x1080.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;1920&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;1080&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_4700_1920x1080.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;4700000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;128000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- BigBuckBunny-h264-1080p-30fps_6000_1920x1080.mp4 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;video&lt;/span> &lt;span class="na">width=&lt;/span>&lt;span class="s">&amp;#34;1920&amp;#34;&lt;/span> &lt;span class="na">height=&lt;/span>&lt;span class="s">&amp;#34;1080&amp;#34;&lt;/span> &lt;span class="na">src=&lt;/span>&lt;span class="s">&amp;#34;bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_6000_1920x1080.mp4&amp;#34;&lt;/span> &lt;span class="na">systemLanguage=&lt;/span>&lt;span class="s">&amp;#34;eng&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;videoBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;6000000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;param&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;audioBitrate&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;128000&amp;#34;&lt;/span> &lt;span class="na">valuetype=&lt;/span>&lt;span class="s">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&amp;lt;/param&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/video&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/switch&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/body&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/smil&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>注意: SMIL ファイルは階層化されたディレクトリには配置できないため、ソースファイルを階層化する場合は &lt;code>src&lt;/code> 属性を相対パスで記載します。&lt;/p>
&lt;/blockquote>
&lt;h2 id="手順3-ビデオファイルのアップロード">手順3: ビデオファイルのアップロード&lt;/h2>
&lt;p>Wowza Streaming Engine では VOD 配信用に以下の3つのアプリケーションのタイプがあります。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>タイプ&lt;/th>
&lt;th>説明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>VOD&lt;/strong>&lt;/td>
&lt;td>単一サーバー向けのアプリケーション (VOD ファイルを読み込み、プレーヤーにストリーミングするために使用します)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>VOD Edge&lt;/strong>&lt;/td>
&lt;td>メディア キャッシュ ソースから VOD ファイルを取り込み、VOD ファイルをプレーヤーにストリーミングするために使用します&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>VOD HTTP Origin&lt;/strong>&lt;/td>
&lt;td>ビデオ・オンデマンド ファイルのオリジンとして動作し、HTTP ストリーミング プロトコル (MPEG-DASH および Apple HLS) を使用して HTTP キャッシング インフラストラクチャに配信するために使用します&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Wowza Streaming Engine のインストール後の既定のセットアップでは、&amp;quot;&lt;strong>VOD&lt;/strong>&amp;quot; タイプのアプリケーションが自動的にセットアップされていて、既定では &lt;code>[インストール先のディレクトリ]\content&lt;/code> フォルダから VOD ファイルを読み込みます。&lt;/p>
&lt;p>手順1と手順2で作成したファイルを &lt;code>content&lt;/code> フォルダにコピーしても構いません。&lt;/p>
&lt;p>この記事では、メディアキャッシュ機能を使って外部のクラウドストレージにアップロードした VOD ファイルを配信するよう設定します。&lt;/p>
&lt;p>外部のクラウドストレージとして、Azure Storage を使ってみます。Azure CLI の手順を以下に説明しますので、「&lt;a href="https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli" target="_blank">Azure CLI をインストールする方法&lt;/a>
」を参考に Azure CLI をインストールしてください。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">AZ_LOCATION&lt;/span>&lt;span class="o">=&lt;/span>japanwest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">AZ_RESOURCE_GROUP&lt;/span>&lt;span class="o">=&lt;/span>YourResourceGroup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">AZ_STORAGE_ACCOUNT&lt;/span>&lt;span class="o">=&lt;/span>wowzavodstorage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">az group create --resource-group &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_RESOURCE_GROUP&lt;/span>&lt;span class="si">}&lt;/span> --location &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_LOCATION&lt;/span>&lt;span class="si">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">az storage account create --name &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_STORAGE_ACCOUNT&lt;/span>&lt;span class="si">}&lt;/span> --resource-group &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_RESOURCE_GROUP&lt;/span>&lt;span class="si">}&lt;/span> --location &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_LOCATION&lt;/span>&lt;span class="si">}&lt;/span> --sku Standard_LRS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">AZ_STORAGE_KEY&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>az storage account keys list --account-name &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_STORAGE_ACCOUNT&lt;/span>&lt;span class="si">}&lt;/span> --resource-group &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_RESOURCE_GROUP&lt;/span>&lt;span class="si">}&lt;/span> &lt;span class="p">|&lt;/span> jq -r .&lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>.value&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">az storage container create --name vod --account-name &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_STORAGE_ACCOUNT&lt;/span>&lt;span class="si">}&lt;/span> --account-key &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_STORAGE_KEY&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/videos/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">az storage copy -s bigbuckbunny-1080p-30fps-h264 --destination-container vod --account-name &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_STORAGE_ACCOUNT&lt;/span>&lt;span class="si">}&lt;/span> --account-key &lt;span class="si">${&lt;/span>&lt;span class="nv">AZ_STORAGE_KEY&lt;/span>&lt;span class="si">}&lt;/span> --recursive
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="手順4-wowza-streaming-engine-のセットアップ">手順4: Wowza Streaming Engine のセットアップ&lt;/h2>
&lt;p>コンテンツのアップロードが完了したら、以下の手順で Wowza Streaming Engine のセットアップを行います。&lt;/p>
&lt;h3 id="メディアキャッシュの有効化">メディアキャッシュの有効化&lt;/h3>
&lt;p>メディアキャッシュ機能を有効にするには、以下の手順で行います。&lt;/p>
&lt;ol>
&lt;li>Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [&lt;strong>Server&lt;/strong>] をクリックします。&lt;/li>
&lt;li>左のメニューから [&lt;strong>Media Cache&lt;/strong>] をクリックします。&lt;/li>
&lt;li>&amp;ldquo;&lt;strong>Status: Enabled&lt;/strong>&amp;rdquo; と表示されている場合は、すでに有効になっているため、以降のステップは必要はありません。&lt;/li>
&lt;li>&lt;strong>[Enable Media Cache]&lt;/strong> ボタンを押します。&lt;/li>
&lt;li>画面上部に [&lt;strong>Media Cache enabled. You must restart the server for changes to take effect.&lt;/strong>] と表示されたら、&lt;strong>[Restart Now]&lt;/strong> ボタンをクリックします。&lt;/li>
&lt;/ol>
&lt;h3 id="メディアキャッシュ-ソースの追加">メディアキャッシュ ソースの追加&lt;/h3>
&lt;p>メディアキャッシュソースとして、Azure Blob Storage を追加するには、以下の手順で行います。&lt;/p>
&lt;ol>
&lt;li>Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [&lt;strong>Server&lt;/strong>] をクリックします。&lt;/li>
&lt;li>左のメニューから [&lt;strong>Media Cache&lt;/strong>] をクリックします。&lt;/li>
&lt;li>[&lt;strong>Source&lt;/strong>] タブをクリックし、&lt;strong>[+Add Media Cache Source]&lt;/strong> ボタンを押します。&lt;/li>
&lt;li>以下のパラメーター情報を入力して、&lt;strong>[+Add]&lt;/strong> ボタンをクリックします。
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>パラメーター&lt;/th>
&lt;th>値&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Source Name&lt;/td>
&lt;td>Azure Blob Storage のメディアソースキャッシュの任意の名前: 例: &lt;code>Azure:wowzavodstorage&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Description&lt;/td>
&lt;td>Azure Blob Storage のメディアソースキャッシュの説明 (任意)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Source Type&lt;/td>
&lt;td>メディアキャッシュソースのタイプ: &lt;code>Azure&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prefix&lt;/td>
&lt;td>メディアキャッシュソースのプレフィックス: &lt;code>azblob/&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Blob Storage Account Name&lt;/td>
&lt;td>Azure Blob Storage アカウントの名前: &lt;code>wowzavodstorage&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Blob Storage Account Access Key&lt;/td>
&lt;td>Azure Blob Storage アカウント鍵: &lt;code>${AZ_STORAGE_KEY}&lt;/code> の値&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;/ol>
&lt;h2 id="vod-edge-アプリケーションの作成">VOD Edge アプリケーションの作成&lt;/h2>
&lt;p>VOD Edge アプリケーションの作成は、以下の手順で行います。&lt;/p>
&lt;ol>
&lt;li>Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [&lt;strong>Applications&lt;/strong>] の ▼ をクリックし、[&lt;strong>Add Application&lt;/strong>] をクリックします。&lt;/li>
&lt;li>VOD Edge のボタンをクリックし、[&lt;strong>Enter a name for your new application&lt;/strong>] のテキストボックスに &amp;ldquo;&lt;strong>vodedge&lt;/strong>&amp;rdquo; と入力し、&lt;strong>[+Add]&lt;/strong> ボタンをクリックします。&lt;/li>
&lt;li>[&lt;strong>Playback Types&lt;/strong>] では、配信に必要となる方式の項目をチェックします (ここではすべての項目をチェックします)。&lt;/li>
&lt;li>[&lt;strong>Media Cache Source&lt;/strong>] では、[&lt;strong>All Media Cache Sources are available&lt;/strong>] を選択します。&lt;/li>
&lt;li>[&lt;strong>Closed Caption Sources&lt;/strong>] では、配信に必要となる字幕形式の項目をチェックします (ここではすべての項目をチェックします)。&lt;/li>
&lt;li>&lt;strong>[Save]&lt;/strong> ボタンをクリックし、VOD Edge アプリケーション設定を保存します。&lt;/li>
&lt;/ol>
&lt;h2 id="手順5-アダプティブストリーミング再生のテスト">手順5: アダプティブストリーミング再生のテスト&lt;/h2>
&lt;p>手順3でコンテンツのアップロードと手順4が完了したら、VOD ファイルの配信ができる状態になります。&lt;/p>
&lt;p>SMIL ファイルのメディアキャッシュソースの再生 URL は以下のように構成されます。&lt;/p>
&lt;blockquote>
&lt;p>http(s)://&lt;strong>[Wowza Streaming Engine のドメイン名]&lt;/strong>/&lt;strong>[VOD Edgeアプリケーション名]&lt;/strong>/_definst_/smil:&lt;strong>[Media Cache Source Prefix][Media Source の Path]&lt;/strong>/&lt;strong>[Manifest]&lt;/strong>&lt;/p>
&lt;p>&lt;strong>[Manifest]&lt;/strong> は playlist.m3u8 または manifest.mpd&lt;/p>
&lt;/blockquote>
&lt;p>VOD コンテンツの再生 URL は、以下の通りです。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ストリーミング形式&lt;/th>
&lt;th>URL&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>HLS&lt;/td>
&lt;td>https://&lt;em>[WowzaStreamingEngineのドメイン名]&lt;/em>/vodedge/_definst_/smil:azblob/bbb_h264_1080p_30fps.smil/playlist.m3u8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DASH&lt;/td>
&lt;td>https://&lt;em>[WowzaStreamingEngineのドメイン名]&lt;/em>/vodedge/_definst_/smil:azblob/bbb_h264_1080p_30fps.smil/manifest.mpd&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;a href="https://testplayer.demo.liveinstantly.cloud/" target="_blank">Web プレイヤー&lt;/a>
を使って、再生のテストを行います。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-vod-play-test.jpg" alt="VOD再生テスト">&lt;/p>
&lt;blockquote>
&lt;p>メディアキャッシュ ソース上の MP4 ファイルに対して、RTMP や RTSP での配信も可能です。&lt;/p>
&lt;p>再生 URL の中の &amp;ldquo;smil:&amp;rdquo; の代わりに &amp;ldquo;mp4:&amp;rdquo; を使います。&lt;/p>
&lt;/blockquote>
&lt;h2 id="まとめ">まとめ&lt;/h2>
&lt;p>この記事では、VOD ファイルをクラウドストレージにアップロードして、Wowza Streaming Engine 経由で
ストリーミング配信を行うための設定を紹介しました。&lt;/p>
&lt;p>Wowza Streaming Engine を利用することで、マルチビットレートの MP4 ファイルを Apple HLS, MPEG-DASH などの
ストリーミング形式に変換することができるようになります。&lt;/p>
&lt;p>複数の Wowza Streaming Engine サーバーを導入することでスケーラビリティ高い配信を実現することもできます。
また、さらに CDN と組み合わせを行うことで大規模な HTTP ベースのアダプティブストリーミング配信を実現することも可能となります。&lt;/p></description></item><item><title>Resources: シンプルな Web プレイヤーの開発と展開</title><link>https://www.liveinstantly.com/ja/resources/blog/build-simple-web-player/</link><pubDate>Thu, 15 Oct 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/build-simple-web-player/</guid><description>&lt;img src="https://www.liveinstantly.com/ja/resources/blog/build-simple-web-player/featured-screenshot_hu3a278b01d81d369de8c102c773db7fa8_104534_640x0_resize_q75_catmullrom.jpg" width="640" height="427"/>&lt;h2 id="ストリーミング-プレイヤーの開発">ストリーミング プレイヤーの開発&lt;/h2>
&lt;p>&lt;a href="../video-streaming-introduction/">ビデオストリーミング技術の紹介&lt;/a>
でも触れたように、
現在、ビデオストリーミングは Web 技術との親和性が高く、ストリーミングビデオは Web ブラウザー上で、
JavaScript を使って開発されたプレイヤーで再生することができるようになっています。&lt;/p>
&lt;p>普及している2つのストリーミングプロトコル (HLS, MPEG-DASH) のビデオストリームを再生することができる、
実績のあるオープンソースのプレイヤーがあります。以下のプレイヤーです。&lt;/p>
&lt;ul>
&lt;li>HLS の再生: &lt;a href="https://hls-js-dev.netlify.app/demo" target="_blank">hls.js&lt;/a>
| &lt;a href="https://github.com/video-dev/hls.js/" target="_blank">Github&lt;/a>
&lt;/li>
&lt;li>MPEG-DASH の再生: &lt;a href="https://dashif.org/tools/dashjs/" target="_blank">dash.js&lt;/a>
| &lt;a href="https://github.com/Dash-Industry-Forum/dash.js" target="_blank">GitHub&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>この記事では、これらを使って、Web プレイヤーをホストするページを開発します。&lt;/p>
&lt;h3 id="hlsjs-プレイヤーシンプルなコード">hls.js プレイヤー：シンプルなコード&lt;/h3>
&lt;p>もっともシンプルな hls.js の再生プレイヤーのページのコードは以下の通りです。
hls.js が提供する Hls クラスを使ってビデオプレイヤーを初期化し、再生したい HLS ストリームの URL を
プレイヤーにロードすることでビデオストリームの再生をトリガーすることができます。&lt;/p>
&lt;p>ビデオプレイヤーを表示するためには、プレイヤーを表示するための HTML 要素をアタッチします。&lt;/p>
&lt;p>以下のコード例では、&lt;code>&amp;lt;video&amp;gt;&lt;/code> タグで HLS の再生をネイティブサポートしているプレイヤー (Safari など) も
対応できるようにしてあります。その場合は、HLS ストリームの再生に hls.js を使いません。&lt;/p>
&lt;p>より細かなコントロールを行うためのアプリケーションの開発を行うには、Hls クラスの API の詳細を確認します。
&lt;a href="https://hls-js-dev.netlify.app/api-docs/hls.js.hls.html" target="_blank">hls.js API ドキュメント&lt;/a>
を参照します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- プレイヤーのコンテナ要素 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;hls-js-container&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">video&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;hls-js-player&amp;#34;&lt;/span> &lt;span class="na">controls&lt;/span> &lt;span class="na">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;640px&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">video&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- hls.js 本体のロード --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://cdn.jsdelivr.net/npm/hls.js@1&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- hls.js プレイヤー制御のアプリケーションコード --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">video&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;hls-js-player&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">videoSrc&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">Hls&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">isSupported&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// HTML Media Source Extension (MSE) をサポートするブラウザー向け (hls.js を利用する)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">hls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Hls&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">hls&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">loadSource&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">videoSrc&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">hls&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">attachMedia&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">video&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">video&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">canPlayType&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;application/vnd.apple.mpegurl&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ブラウザーの &amp;lt;video&amp;gt; タグがネイティブで HLS をサポートするブラウザー向け
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">video&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">videoSrc&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="dashjs-プレイヤーシンプルなコード">dash.js プレイヤー：シンプルなコード&lt;/h3>
&lt;p>もっともシンプルな dash.js の再生プレイヤーのページのコードは以下の通りです。
dash.js が提供する MediaPlayer クラスを使ってビデオプレイヤーを初期化し、
再生したい MPEG-DASH ストリームの URL をプレイヤーにロードすることで
ビデオストリームの再生をトリガーすることができます。&lt;/p>
&lt;p>ビデオプレイヤーを表示するためには、プレイヤーを表示するための HTML 要素をアタッチします。&lt;/p>
&lt;p>より細かなコントロールを行うためのアプリケーションの開発を行うには、MediaPlayer クラスや他のクラスの API の詳細を確認します。
&lt;a href="http://cdn.dashjs.org/latest/jsdoc/index.html" target="_blank">dash.js API ドキュメント&lt;/a>
を参照します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- プレイヤーのコンテナ要素 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;dash-js-container&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">video&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;dash-js-player&amp;#34;&lt;/span> &lt;span class="na">controls&lt;/span> &lt;span class="na">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;640px&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">video&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- dash.js 本体のロード --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;//cdn.dashjs.org/v4.6.0/dash.all.min.js&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- dash.js プレイヤー制御のアプリケーションコード --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://dash.akamaized.net/envivio/EnvivioDash3/manifest.mpd&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">player&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">dashjs&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">MediaPlayer&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">create&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">player&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">initialize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;#dash-js-player&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nx">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="ビデオストリームの再生テスト">ビデオストリームの再生テスト&lt;/h3>
&lt;p>プレイヤーを実装した HTML ページ (index.html などのコンテンツ) を用意した後は、
NGINX で HTML コンテンツをホストすることでローカル環境でも簡単に開発・テストが行えます。&lt;/p>
&lt;p>HTML コンテンツがカレントディレクトリにある状態で、以下のコマンドを実行します。
このコマンド実行では、Docker を使って NGINX をコンテナーでホストします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker image pull nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run --name docker-nginx -p 80:80 -d -v .:/usr/share/nginx/html nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>開発・テストが終わったら、以下のコマンドで実行しているコンテナーを停止・削除することができます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker stop docker-nginx &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> docker rm docker-nginx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="実践的な再生テスト用のプレイヤーアプリケーション">実践的な再生テスト用のプレイヤーアプリケーション&lt;/h3>
&lt;p>以下の要件を満たすアプリケーションを開発しました。
開発したプレイヤーのソースコードは &lt;a href="https://github.com/liveinstantly/simple-test-streaming-player" target="_blank">GitHub リポジトリ&lt;/a>
を参照してください。&lt;/p>
&lt;ul>
&lt;li>ユーザーが入力ボックスに指定したストリームを再生できること&lt;/li>
&lt;li>hls.js と dash.js を手動で切り替えて再生できること&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="./simple-test-player-screenshot.jpg" alt="テスト用のプレイヤーアプリケーション">&lt;/p>
&lt;h2 id="テスト用のストリーミング-プレイヤーの展開-ホスティング">テスト用のストリーミング プレイヤーの展開 (ホスティング)&lt;/h2>
&lt;p>「&lt;a href="../get-started-wowza-streaming-engine/">Wowza Streaming Engine のインストールとセットアップ&lt;/a>
」でも
触れた通り、最新のブラウザーでは、ほぼすべてのブラウザーが HTTP/HTTPS 混在ウェブコンテンツのブラウジングを許可しません。&lt;/p>
&lt;p>今回は、テスト用のプレイヤーを開発したいので、ストリーミングサーバーが HTTPS (TLS) をサポートしない場合でも
ストリーム再生のテストが実行できるように、HTTP/HTTPS の両方でアクセスできるページを簡単に用意します。&lt;/p>
&lt;blockquote>
&lt;p>つまり、HTTP ストリームは HTTP でアクセスしたホストで再生し、HTTPS ストリームは HTTPS でアクセスしたホストで再生します&lt;/p>
&lt;/blockquote>
&lt;h3 id="展開先のサービスの選択">展開先のサービスの選択&lt;/h3>
&lt;p>自宅環境などにサーバーを用意してホストする場合を除いては、一般的にホスティングサービスを利用します。
&lt;a href="https://www.netlify.com/" target="_blank">Netlify&lt;/a>
, &lt;a href="https://vercel.com/" target="_blank">Vercel&lt;/a>
, &lt;a href="https://jp.heroku.com/" target="_blank">Heroku&lt;/a>
などの
よく利用されているホスティングサービスには、無料のプランがあり、これらを使うことが可能です。&lt;/p>
&lt;p>ただし、ここ数年で HTTP サポートを停止し、強制的に HTTPS を利用するように構成されるサービスがほとんどです。&lt;/p>
&lt;p>HTTP/HTTPS の両方でホストが可能で、可能な限り安価で展開をするための方法として、Microsoft Azure Cloud を利用する方法をここでは紹介します。&lt;/p>
&lt;ul>
&lt;li>Azure Storage を 静的 Web サイトをホストする
&lt;ul>
&lt;li>Azure Storage は HTTP/HTTPS の両方のプロトコルでのアクセスをサポートします&lt;/li>
&lt;li>Azure Web App サービスは、Web ホストの動作時間に対して課金されますので割高となりますが、Azure Storage はコンテンツの容量だけしか課金されません&lt;/li>
&lt;li>Azure Static Web App サービスは、HTTPS のみサポートし、HTTP はサポートされません&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Azure CDN を使って Azure Storage にホストした静的 Web サイトを公開する (独自のカスタムドメインを利用する場合のみ)
&lt;ul>
&lt;li>Azure Storage ではカスタムドメインの HTTPS 証明書のサポートをしていないため、独自のカスタムドメインを利用して HTTPS を利用する場合は Azure CDN を利用する必要があります&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="azure-storage-アカウントの作成と静的-web-ホストの設定">Azure Storage アカウントの作成と静的 Web ホストの設定&lt;/h3>
&lt;p>下記の 3 つの作業ステップを Azure ドキュメントの記事を参考に実施します。&lt;/p>
&lt;ul>
&lt;li>Azure Storage アカウントを作成します
&lt;ul>
&lt;li>参照記事: &lt;a href="https://learn.microsoft.com/ja-jp/azure/storage/common/storage-account-create?tabs=azure-portal" target="_blank">ストレージ アカウントを作成する&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>静的 Web サイトをホストするよう構成します
&lt;ul>
&lt;li>参照記事: &lt;a href="https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-static-website-how-to?tabs=azure-portal" target="_blank">Azure Storage で静的 Web サイトをホストする&lt;/a>
&lt;/li>
&lt;li>参考: &lt;a href="https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-static-website" target="_blank">概念: 静的な Web サイト&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>アプリケーションの Web コンテンツを Azure Storage にアップロードします
&lt;ul>
&lt;li>参照記事: &lt;a href="https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-static-website-how-to?tabs=azure-portal#upload-files" target="_blank">ファイルをアップロードします&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>静的 Web サイトを HTTP/HTTPS の両方でアクセスできるようにするためには、以下の設定を行います。&lt;/p>
&lt;ul>
&lt;li>[設定] -&amp;gt; [構成] -&amp;gt; [安全な転送が必須] = &amp;ldquo;&lt;strong>無効&lt;/strong>&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="./azure-storage-settings-unsecure.jpg" alt="Azure Storage 設定">&lt;/p>
&lt;p>設定が完了すると、以下の URL でアクセスすることができるようになります。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://storageaccountname.zXX.web.core.windows.net/" target="_blank">http://[ストレージアカウント名].z[XX].web.core.windows.net/&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://storageaccountname.zXX.web.core.windows.net/" target="_blank">https://[ストレージアカウント名].z[XX].web.core.windows.net/&lt;/a>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>[ストレージアカウント名] および [XX] は作成したアカウントに合わせて置き換えてください。&lt;/p>
&lt;/blockquote>
&lt;h3 id="azure-cdn-の設定-オプション">Azure CDN の設定 (オプション)&lt;/h3>
&lt;p>今回は、独自のドメインを使ってホストを HTTP/HTTPS で公開したいので以下のような構成の作業を行います。&lt;/p>
&lt;p>下記の 3 つの作業ステップを Azure ドキュメントの記事を参考に実施します。&lt;/p>
&lt;ul>
&lt;li>静的な Web サイトを Azure CDN と統合し、CDN エンドポイントで公開します
&lt;ul>
&lt;li>Azure CDN の種類を選び、CDN プロファイルを作成します&lt;/li>
&lt;li>CDN のプロファイルが作成できたら、静的 Web サイトを公開するエンドポイントを作成します&lt;/li>
&lt;li>参照記事: &lt;a href="https://learn.microsoft.com/ja-jp/azure/storage/blobs/static-website-content-delivery-network" target="_blank">静的な Web サイトを Azure CDN と統合する&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>独自のカスタムドメインを CDN エンドポイントに追加します
&lt;ul>
&lt;li>参照記事: &lt;a href="https://learn.microsoft.com/ja-jp/azure/cdn/cdn-map-content-to-custom-domain?tabs=azure-dns%2Cazure-portal%2Cazure-portal-cleanup" target="_blank">カスタム ドメインをエンドポイントに追加する&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>CDN エンドポイントに追加した カスタムドメインで HTTPS が有効となるよう構成します
&lt;ul>
&lt;li>有効となるよう構成すると、バックグラウンドで自動的に、ドメインの所有を検証し、カスタムドメインのたｍの HTTPS 証明書を発行します&lt;/li>
&lt;li>10~30 分ほど時間がかかります&lt;/li>
&lt;li>参照記事: &lt;a href="https://learn.microsoft.com/ja-jp/azure/cdn/cdn-custom-ssl?tabs=option-1-default-enable-https-with-a-cdn-managed-certificate" target="_blank">Azure CDN カスタム ドメインで HTTPS を構成する&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="まとめ-ホストされたテスト用プレイヤーアプリケーションのサイト">まとめ: ホストされたテスト用プレイヤーアプリケーションのサイト&lt;/h2>
&lt;p>今回は、HLS と MPEG-DASH ストリームの再生のためのシンプルなテスト用プレイヤーアプリケーションを作成し、
HTTP/HTTPS の両方でアクセスできるホスト上に独自ドメインを使って展開しました。&lt;/p>
&lt;p>以下のサイトで展開しています。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>HTTP&lt;/strong>: &lt;a href="http://testplayer.demo.liveinstantly.cloud/" target="_blank">http://testplayer.demo.liveinstantly.cloud/&lt;/a>
&lt;/li>
&lt;li>&lt;strong>HTTPS&lt;/strong>: &lt;a href="https://testplayer.demo.liveinstantly.cloud/" target="_blank">https://testplayer.demo.liveinstantly.cloud/&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>また、開発したプレイヤーのソースコードは &lt;a href="https://github.com/liveinstantly/simple-test-streaming-player" target="_blank">GitHub リポジトリ&lt;/a>
を参照してください。&lt;/p>
&lt;p>今後は、様々なコンテンツの再生のためのプレイヤーのオプションなど設定項目なども入力できるように、
プレイヤーのアプリケーションの拡張を行う予定です。また、フィードバックがありましたら、
&lt;a href="https://github.com/liveinstantly/simple-test-streaming-player/issues" target="_blank">GitHub Issues&lt;/a>
までご連絡ください。&lt;/p></description></item><item><title>Resources: Let's Encrypt を使った Wowza Streaming Engine の HTTPS 証明書のセットアップ</title><link>https://www.liveinstantly.com/ja/resources/blog/setup-wse-https-with-letsencrypt/</link><pubDate>Sat, 10 Oct 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/setup-wse-https-with-letsencrypt/</guid><description>&lt;h2 id="はじめに">はじめに&lt;/h2>
&lt;p>&lt;a href="../get-started-wowza-streaming-engine/">前回の記事&lt;/a>
では Wowza Streaming Engine のセットアップを行いました。
セットアップされたストリーミングサーバーは HTTPS サーバー証明書が設定されていないため、ストリーミングコンテンツや管理 UI は HTTP を使ってアクセスしました。&lt;/p>
&lt;p>実際のサービスを公開する場合、HTTPS によるサービス提供が必要となります。
これは、サーバーサービス群の通信路のセキュリティ確保だけではありません。
ほとんどのウェブホスティングサービスの HTTPS 強制に伴って、Web ベースのプレイヤーをホストするサーバー (HTTPS) とコンテンツ (HTTP) の組み合わせは、既定で混在コンテンツを許可しないブラウザーポリシーのため、再生ができなくなる、という問題があります (&lt;a href="../get-started-wowza-streaming-engine/">前回の記事&lt;/a>
を参照)。&lt;/p>
&lt;p>今回、Wowza Streaming Engine サーバーの以下のサービスに対して、HTTPS サーバー証明書の設定を行います。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>サービス&lt;/th>
&lt;th>ポート番号&lt;/th>
&lt;th>説明&lt;/th>
&lt;th>設定箇所&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>HTTPS ストリーミング&lt;/td>
&lt;td>443&lt;/td>
&lt;td>既定の HTTPS を使ったコンテンツストリーミング&lt;/td>
&lt;td>conf/VHost.xml&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>REST API インターフェース&lt;/td>
&lt;td>8087&lt;/td>
&lt;td>既定の REST API インターフェースを HTTPS に変更&lt;/td>
&lt;td>conf/Server.xml&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wowza Streaming Engine Manager 管理サービス&lt;/td>
&lt;td>8090&lt;/td>
&lt;td>管理画面へのアクセスを HTTPS 経由で行う&lt;/td>
&lt;td>manager/conf/tomcat.properties&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>この記事では、&lt;a href="../get-started-wowza-streaming-engine/">前回の記事&lt;/a>
に引き続き、Ubuntu Linux 上にインストールされた Wowza Streaming Engine を対象とします。&lt;/p>
&lt;h2 id="https-サーバー証明書の発行のまえに">HTTPS サーバー証明書の発行のまえに&lt;/h2>
&lt;p>HTTPS サーバー証明書を発行するにあたって、いくつかのケースがあります。&lt;/p>
&lt;p>HTTPS サーバー証明書とは、サーバーのドメイン名に対して権威のある証明書発行機関 (証明書の認証局) により証明された証明書ですので、セットアップしたサーバーの外部公開 IP アドレスに対して、ドメイン名が割り当てられていることが必須となります。&lt;/p>
&lt;p>一般的に、サービス公開を行うにあたって独自ドメイン名をお持ちの場合が多いため、その場合は、独自ドメインに対する HTTPS サーバー証明書の発行となります。
証明書の発行の依頼側がドメインの所有や指定したドメイン名のサーバーの所有を証明することにより、権威のある証明書発行機関は、依頼した者が正当なドメイン名の所有者であることを認め、証明書を発行します。&lt;/p>
&lt;p>クラウドベンダーが提供する環境に展開する場合、そのクラウドベンダーの提供するドメイン名を使うことができる場合があります。
その場合は、クラウドベンダーのドメインに対する HTTPS サーバー証明書の発行となります。
このケースでは、クラウドの利用者はクラウドベンダーのドメインの所有者ではありません。
証明書の発行の依頼側がドメイン名のサーバーの所有を証明することにより、権威のある証明書発行機関は、依頼した者が正当なドメイン名の所有者であることを認め、証明書を発行します。&lt;/p>
&lt;p>独自ドメインを所有しておらず、セットアップしたサーバーにドメイン名が割り当てられていない場合、それでも HTTPS サーバー証明書が必要な場合は、
Wowza Media Systems から提供されている StreamLock というマネージド サービスを利用することができます。
このサービスでは、サーバーの外部公開 IP アドレスを登録すると、&lt;strong>[ランダムなホスト名].streamlock.net&lt;/strong> というドメイン名で HTTPS サーバー証明書を発行することができます。
サービスに登録した IP アドレスに対して &lt;strong>[ランダムなホスト名].streamlock.net&lt;/strong> のドメイン名を独自の DNS で管理し、証明書発行機関に発行を依頼します。
これにより、発行された HTTPS サーバー証明書を提供することができるという仕組みとなっています。
このため、外部公開 IP アドレスが動的に変更されるホストでは利用することができません。固定の外部公開 IP アドレスを利用するようにしてください。&lt;/p>
&lt;p>ケース別のまとめとしては、以下の通りです。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ケース&lt;/th>
&lt;th>発行方法&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>独自ドメイン名が割り当てられたサーバー&lt;/td>
&lt;td>証明書発行機関に発行を依頼する&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>クラウドベンダーのドメイン名が割り当てられたサーバー&lt;/td>
&lt;td>証明書発行機関に発行を依頼する&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>独自ドメイン名を所有しておらず、ドメイン名の割り当てがないサーバー&lt;/td>
&lt;td>Wowza Media Systems の StreamLock サービスを利用する&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>この記事では、Let&amp;rsquo;s Encrypt と呼ばれている、フリーで自動化された証明書の発行を行う証明書発行機関を使った証明書の発行を紹介します。
Let&amp;rsquo;s Encrypt は、「世界中の HTTPS Web サイトの普及」というミッションのもと、様々なスポンサーの支援を受けて、HTTPS 証明書を無料で提供してくれています。&lt;/p>
&lt;p>Wowza Media Systems の StreamLock サービスについては、Wowza のドキュメント記事: &lt;a href="https://www.wowza.com/docs/how-to-get-ssl-certificates-from-the-streamlock-service" target="_blank">Get SSL/TLS certificates from the Wowza Streaming Engine StreamLock service&lt;/a>
を参照ください。&lt;/p>
&lt;h2 id="https-サーバー証明書の発行">HTTPS サーバー証明書の発行&lt;/h2>
&lt;p>この記事では、HTTPS サーバー証明書を発行に &lt;a href="https://certbot.eff.org/" target="_blank">Certbot&lt;/a>
ツールを利用します。
&lt;a href="https://certbot.eff.org/" target="_blank">Certbot&lt;/a>
ツールは、Let&amp;rsquo;s Encrypt 証明書発行機関に対して証明書の発行処理を、コマンドラインで利用することができるツールです。&lt;/p>
&lt;h3 id="certbot-ツールのインストール">Certbot ツールのインストール&lt;/h3>
&lt;p>以下のコマンドを実行して &lt;a href="https://certbot.eff.org/" target="_blank">Certbot&lt;/a>
ツールをインストールします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install certbot -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://certbot.eff.org/" target="_blank">Certbot&lt;/a>
ツールには、証明書の発行と設置 (&lt;code>run&lt;/code>)、証明書の発行のみ (&lt;code>certonly&lt;/code>)、証明書の更新 (&lt;code>renew&lt;/code>) などの
作業に合わせたサブコマンドが用意されています。
Apache や NGINX などの HTTP サーバーとも統合されており、証明書の発行と設置 (&lt;code>run&lt;/code>) のサブコマンドを利用することで、証明書発行の自動化が行えるようになっています。
また、証明書発行機関がドメイン名所有の検証を行うためのオプションとして、以下のオプションが用意されています。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>オプション&lt;/th>
&lt;th>説明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>standalone&lt;/td>
&lt;td>シンプルなスタンドアロンの Web サーバーを起動し、ドメイン名の所有を検証する (HTTPによる検証)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>webroot&lt;/td>
&lt;td>既に起動している Web サーバーの webroot ディレクトリに検証のためのファイルを配置して検証する (HTTPによる検証)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>manual&lt;/td>
&lt;td>手動で検証のための手続きを行う (DNS による検証、および、HTTPによる検証)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>DNS による検証
&lt;ul>
&lt;li>ドメイン名の所有者は、所有している DNS の DNS レコードに指定されたランダムな値の TXT レコードを登録します&lt;/li>
&lt;li>証明書発行機関 (認証局) は、その DNS レコードに指定した値が正しく設定されているかを確認する、ことでドメイン名の所有を検証します&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>HTTP による検証
&lt;ul>
&lt;li>ドメイン名の所有者は、ドメイン名の Web サーバー上に、指定されたランダムな値を保持するテキストファイルを配置します&lt;/li>
&lt;li>証明書発行機関 (認証局) は、そのテキストファイルがHTTP経由で正しく取得でき、指定された値がファイルに含まれているかを確認する、ことでドメイン名の所有を検証します&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>以下のコマンドで certbot コマンドのオプションの詳細を確認することができます。
また、Certbot のドキュメントは&lt;a href="https://eff-certbot.readthedocs.io/en/stable/" target="_blank">こちら&lt;/a>
から確認することができます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">certbot --help
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>注意: Certbot ツールの既定の設定では、/etc フォルダなど管理者権限が必要なディレクトリへの書き込みが必要なため、sudo コマンドを使って実行するようにします&lt;/p>
&lt;/blockquote>
&lt;h3 id="ケース別のドメイン名所有の検証方法について">ケース別のドメイン名所有の検証方法について&lt;/h3>
&lt;p>HTTPS サーバー証明書を発行するにあたって、いくつかのケースがあり、上でその説明しました。
ここでは、それのケースのうち、ドメイン名の割り当てがある場合、証明書の発行のためのドメイン名所有の検証方法について説明します。&lt;/p>
&lt;h4 id="ケース1-独自ドメインを所有している">ケース1: 独自ドメインを所有している&lt;/h4>
&lt;p>独自ドメインを所有している場合、以下の2つの方法で、ドメイン名所有の検証が可能です。&lt;/p>
&lt;ul>
&lt;li>DNS による検証&lt;/li>
&lt;li>HTTP による検証&lt;/li>
&lt;/ul>
&lt;h4 id="ケース2-クラウドのドメインを利用したドメイン名をサーバーに割り当てている">ケース2: クラウドのドメインを利用したドメイン名をサーバーに割り当てている&lt;/h4>
&lt;p>クラウドベンダーのドメインを利用している場合、そのドメインの所有や管理はクラウドベンダーが行っているため、DNS による検証を利用することができません。
この場合は、HTTP によるドメイン名所有の検証のみが利用可能です。&lt;/p>
&lt;ul>
&lt;li>HTTP による検証&lt;/li>
&lt;/ul>
&lt;h3 id="dns-検証を使った発行">DNS 検証を使った発行&lt;/h3>
&lt;p>DNS 検証を使った証明書発行は、&lt;code>--manual&lt;/code> オプションを使って、以下のコマンドを実行します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo certbot certonly --manual --domain &lt;span class="o">[&lt;/span>ドメイン名&lt;span class="o">]&lt;/span> --email &lt;span class="o">[&lt;/span>Eメールアドレス&lt;span class="o">]&lt;/span> --agree-tos --preferred-challenges dns
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>出力結果:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Saving debug log to /var/log/letsencrypt/letsencrypt.log
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Requesting a certificate for wowza-01.stream.liveinstantly.cloud
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Please deploy a DNS TXT record under the name:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">_acme-challenge.[ドメイン名].
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">with the following value:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">KDXCIHSTiqQnl1J410aharFz7jz1-NZ8jha0ajajKjqePhhdc &amp;lt;== 検証用のランダムな文字列
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Before continuing, verify the TXT record has been deployed. Depending on the DNS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">provider, this may take some time, from a few seconds to multiple minutes. You can
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">check if it has finished deploying with aid of online tools, such as the Google
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.wowza-01.stream.liveinstantly.cloud.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Look for one or more bolded line(s) below the line &amp;#39;;ANSWER&amp;#39;. It should show the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">value(s) you&amp;#39;ve just added.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Press Enter to Continue
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ここでツールの実行が一旦停止し、ユーザーに DNS TXTレコードの追加を促します。
所有しているドメインの DNS に TXT レコードの検証用のランダムな文字列を追加したら、[Enter] キーを押して継続します。&lt;/p>
&lt;p>ドメイン名所有の検証が完了すると、以下のように出力され、&lt;code>/etc/letsencrypt/live/[ドメイン名]/&lt;/code> 以下のフォルダに発行された証明書が保存されます。&lt;/p>
&lt;blockquote>
&lt;p>Let&amp;rsquo;s Encrypt で発行された証明書の有効期間は 90 日間となります。&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Successfully received certificate.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Certificate is saved at: /etc/letsencrypt/live/[ドメイン名]/fullchain.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Key is saved at: /etc/letsencrypt/live/[ドメイン名]/privkey.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">This certificate expires on 2021-01-08.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">These files will be updated when the certificate renews.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NEXT STEPS:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate&amp;#39;s expiry date.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">If you like Certbot, please consider supporting our work by:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> * Donating to ISRG / Let&amp;#39;s Encrypt: https://letsencrypt.org/donate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> * Donating to EFF: https://eff.org/donate-le
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="http-検証を使った発行">HTTP 検証を使った発行&lt;/h3>
&lt;p>HTTP 検証を使った証明書発行は、Web サーバーを別途必要とします。
セットアップしたストリーミングサーバーには、Web サーバーをセットアップしていないため、&lt;code>--standalone&lt;/code> オプションを使うことにします。&lt;/p>
&lt;p>証明書の発行は、以下のコマンドを実行します。&lt;/p>
&lt;blockquote>
&lt;p>注意: 80番ポートを使ったサービスが起動していないことを事前に確認してください&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo certbot certonly --standalone --domain &lt;span class="o">[&lt;/span>ドメイン名&lt;span class="o">]&lt;/span> --email &lt;span class="o">[&lt;/span>Eメールアドレス&lt;span class="o">]&lt;/span> --agree-tos
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>HTTP によるドメイン所有の検証は、Certbot ツールが起動した Web サーバーにより自動化され、
証明書の発行が完了すると、以下のように出力さます。
発行された証明書は、同様に、&lt;code>/etc/letsencrypt/live/[ドメイン名]/&lt;/code> 以下のフォルダに保存されます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Saving debug log to /var/log/letsencrypt/letsencrypt.log
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Requesting a certificate for [ドメイン名]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Successfully received certificate.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Certificate is saved at: /etc/letsencrypt/live/[ドメイン名]/fullchain.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Key is saved at: /etc/letsencrypt/live/[ドメイン名]/privkey.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">This certificate expires on 2021-01-08.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">These files will be updated when the certificate renews.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Certbot has set up a scheduled task to automatically renew this certificate in the background.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">If you like Certbot, please consider supporting our work by:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> * Donating to ISRG / Let&amp;#39;s Encrypt: https://letsencrypt.org/donate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> * Donating to EFF: https://eff.org/donate-le
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="wowza-streaming-engine-への-https-サーバー証明書の設定">Wowza Streaming Engine への HTTPS サーバー証明書の設定&lt;/h2>
&lt;p>Certbot ツールを使って発行した HTTPS 証明書 (およびサーバー秘密鍵) は、以下のディレクトリに格納されています。&lt;/p>
&lt;ul>
&lt;li>HTTPS 証明書 (X.509 証明書): &lt;code>/etc/letsencrypt/live/[ドメイン名]/cert.pem&lt;/code>&lt;/li>
&lt;li>サーバー秘密鍵: &lt;code>/etc/letsencrypt/live/[ドメイン名]/privkey.pem&lt;/code>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;code>/etc/letsencrypt/live/&lt;/code> ディレクトリ以下に最新の HTTPS 証明書が保存され、
&lt;code>/etc/letsencrypt/archives&lt;/code> ディレクトリ以下に古い HTTPS 証明書も含めた過去に発行したすべての証明書が含まれます。&lt;/p>
&lt;/blockquote>
&lt;p>PEM 形式のファイルとして保存されており、証明書や鍵のバイナリデータが BASE64 方式でエンコードされたテキスト形式のファイルとなっています。&lt;/p>
&lt;p>HTTPS 証明書の内容を確認するには、OpenSSL コマンドを使って、以下のコマンドを実行します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo openssl x509 -text -in /etc/letsencrypt/live/&lt;span class="o">[&lt;/span>ドメイン名&lt;span class="o">]&lt;/span>/cert.pem
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>注意: 管理者権限のみアクセス可能となっているため、sudo コマンドを使って openssl コマンドを実行します&lt;/p>
&lt;/blockquote>
&lt;p>Wowza Streaming Engine で HTTPS 証明書を利用するためには、Java Key Store 形式 (&lt;code>.jks&lt;/code>) に変換する必要があります。&lt;/p>
&lt;h3 id="https-証明書とサーバー秘密鍵を-java-key-store-形式-jks-に変換する">HTTPS 証明書とサーバー秘密鍵を Java Key Store 形式 (.jks) に変換する&lt;/h3>
&lt;p>Java Key Store 形式 (.jks) は、X.509 証明書や対応する秘密鍵などをパスワードに基づく鍵で保護された1つのファイルに保管することが可能な鍵ストアファイル形式です。
Java SE ランタイムに含まれる keytool と呼ばれるツールを使って管理することができます。このツールでは、PKCS#12 形式から JKS 形式に変換することが可能なため、
まず、OpenSSL コマンドを使って PKCS#12 形式の鍵ストアを作成し、その後、JKS 形式の鍵ストアファイルを作成します。&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://www.rfc-editor.org/rfc/rfc7292" target="_blank">PKCS#12 形式 (.p12)&lt;/a>
は、IETF で既定されたフォーマット仕様で、JKS 形式と同様に、X.509 証明書や対応する秘密鍵などをパスワードに基づく鍵で保護された1つのファイルに保管することが可能な鍵ストアファイル形式です&lt;/p>
&lt;/blockquote>
&lt;p>以下のコマンドを実行して、PKCS#12 形式の鍵ストアファイルを作成し、作成した PKCS#12 形式の鍵ストアファイルを JKS 形式の鍵ストアファイルに変換します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">DOMAIN&lt;/span>&lt;span class="o">=[&lt;/span>ドメイン名&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo openssl pkcs12 -export -legacy &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -in /etc/letsencrypt/live/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>/fullchain.pem &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -inkey /etc/letsencrypt/live/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>/privkey.pem &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -out &lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.p12 -password pass:&lt;span class="o">[&lt;/span>パスワード文字列&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo /usr/local/WowzaStreamingEngine/java/bin/keytool -v -importkeystore &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -destkeystore &lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.jks -deststoretype jks -deststorepass &lt;span class="o">[&lt;/span>JKSパスワード文字列&lt;span class="o">]&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -srckeystore &lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.p12 -srcstoretype pkcs12 -srcstorepass &lt;span class="o">[&lt;/span>パスワード文字列&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="https-ストリーミングを設定する">HTTPS ストリーミングを設定する&lt;/h3>
&lt;p>既定の設定では、HTTPS (443番ポート) は有効になっていません。&lt;/p>
&lt;p>以下の手順で、Wowza Streaming Engine の Virtual Host 設定に HTTPS ポート設定を追加します。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;code>/usr/local/WowzaStreamingEngine/conf/VHost.xml&lt;/code> を編集し、以下の部分を有効にします (XMLのコメントアウト &lt;code>&amp;lt;!-- --&amp;gt;&lt;/code> を削除します)。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- 443 with SSL --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HostPort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Name&amp;gt;&lt;/span>Default SSL Streaming&lt;span class="nt">&amp;lt;/Name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Type&amp;gt;&lt;/span>Streaming&lt;span class="nt">&amp;lt;/Type&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;ProcessorCount&amp;gt;&lt;/span>${com.wowza.wms.TuningAuto}&lt;span class="nt">&amp;lt;/ProcessorCount&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;IpAddress&amp;gt;&lt;/span>*&lt;span class="nt">&amp;lt;/IpAddress&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Port&amp;gt;&lt;/span>443&lt;span class="nt">&amp;lt;/Port&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HTTPIdent2Response&amp;gt;&amp;lt;/HTTPIdent2Response&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;SSLConfig&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;KeyStorePath&amp;gt;&lt;/span>${com.wowza.wms.context.VHostConfigHome}/conf/keystore.jks&lt;span class="nt">&amp;lt;/KeyStorePath&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;KeyStorePassword&amp;gt;&lt;/span>[JKSパスワード文字列]&lt;span class="nt">&amp;lt;/KeyStorePassword&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;KeyStoreType&amp;gt;&lt;/span>JKS&lt;span class="nt">&amp;lt;/KeyStoreType&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;DomainToKeyStoreMapPath&amp;gt;&amp;lt;/DomainToKeyStoreMapPath&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;SSLProtocol&amp;gt;&lt;/span>TLS&lt;span class="nt">&amp;lt;/SSLProtocol&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Algorithm&amp;gt;&lt;/span>SunX509&lt;span class="nt">&amp;lt;/Algorithm&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;CipherSuites&amp;gt;&amp;lt;/CipherSuites&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Protocols&amp;gt;&amp;lt;/Protocols&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;AllowHttp2&amp;gt;&lt;/span>false&lt;span class="nt">&amp;lt;/AllowHttp2&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/SSLConfig&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;SocketConfiguration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;ReuseAddress&amp;gt;&lt;/span>true&lt;span class="nt">&amp;lt;/ReuseAddress&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;ReceiveBufferSize&amp;gt;&lt;/span>65000&lt;span class="nt">&amp;lt;/ReceiveBufferSize&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;ReadBufferSize&amp;gt;&lt;/span>65000&lt;span class="nt">&amp;lt;/ReadBufferSize&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;SendBufferSize&amp;gt;&lt;/span>65000&lt;span class="nt">&amp;lt;/SendBufferSize&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;KeepAlive&amp;gt;&lt;/span>true&lt;span class="nt">&amp;lt;/KeepAlive&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;AcceptorBackLog&amp;gt;&lt;/span>100&lt;span class="nt">&amp;lt;/AcceptorBackLog&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/SocketConfiguration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HTTPStreamerAdapterIDs&amp;gt;&lt;/span>cupertinostreaming,smoothstreaming,sanjosestreaming,dvrchunkstreaming,mpegdashstreaming&lt;span class="nt">&amp;lt;/HTTPStreamerAdapterIDs&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HTTPProviders&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;BaseClass&amp;gt;&lt;/span>com.wowza.wms.http.HTTPCrossdomain&lt;span class="nt">&amp;lt;/BaseClass&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;RequestFilters&amp;gt;&lt;/span>*crossdomain.xml&lt;span class="nt">&amp;lt;/RequestFilters&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;AuthenticationMethod&amp;gt;&lt;/span>none&lt;span class="nt">&amp;lt;/AuthenticationMethod&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;BaseClass&amp;gt;&lt;/span>com.wowza.wms.http.HTTPClientAccessPolicy&lt;span class="nt">&amp;lt;/BaseClass&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;RequestFilters&amp;gt;&lt;/span>*clientaccesspolicy.xml&lt;span class="nt">&amp;lt;/RequestFilters&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;AuthenticationMethod&amp;gt;&lt;/span>none&lt;span class="nt">&amp;lt;/AuthenticationMethod&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;BaseClass&amp;gt;&lt;/span>com.wowza.wms.http.HTTPProviderMediaList&lt;span class="nt">&amp;lt;/BaseClass&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;RequestFilters&amp;gt;&lt;/span>*jwplayer.rss|*jwplayer.smil|*medialist.smil|*manifest-rtmp.f4m&lt;span class="nt">&amp;lt;/RequestFilters&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;AuthenticationMethod&amp;gt;&lt;/span>none&lt;span class="nt">&amp;lt;/AuthenticationMethod&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;BaseClass&amp;gt;&lt;/span>com.wowza.wms.http.HTTPServerVersion&lt;span class="nt">&amp;lt;/BaseClass&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;RequestFilters&amp;gt;&lt;/span>*ServerVersion&lt;span class="nt">&amp;lt;/RequestFilters&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;AuthenticationMethod&amp;gt;&lt;/span>none&lt;span class="nt">&amp;lt;/AuthenticationMethod&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/HTTPProvider&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/HTTPProviders&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/HostPort&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>JKS鍵ストアファイルをコピーします&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo cp &lt;span class="si">${&lt;/span>&lt;span class="nv">PWD&lt;/span>&lt;span class="si">}&lt;/span>/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.jks /usr/local/WowzaStreamingEngine/conf/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ln -s /usr/local/WowzaStreamingEngine/conf/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.jks /usr/local/WowzaStreamingEngine/conf/keystore.jks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Wowza Streaming Engine を再起動する&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart WowzaStreamingEngine
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>HTTPS 証明書が正しくロードされ、443 ポート番号が正しくセットアップされたか、
Wowza Streaming Engine ログ (&lt;code>/usr/local/WowzaStreamingEngine/logs/wowzastreamingengine_access.log&lt;/code>) を確認します。&lt;/p>
&lt;p>以下の3行の出力がログに含まれていれば、正しくセットアップされています。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">_defaultVHost_ SSL ([any]:443): keyStorePath:/usr/local/WowzaStreamingEngine/conf/keystore.jks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">_defaultVHost_ Bind attempt ([any]:443:4)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">_defaultVHost_ Bind successful ([any]:443)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>また、以下のコマンドを実行し、443 ポートにアクセスできるかどうかも確認します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl https://&lt;span class="o">[&lt;/span>ドメイン名&lt;span class="o">]&lt;/span>/ServerVersion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wowza Streaming Engine のバージョン情報が表示されれば問題ありません。&lt;/p>
&lt;h3 id="rest-api-インターフェスで-https-を有効する">REST API インターフェスで HTTPS を有効する&lt;/h3>
&lt;p>既定では Wowza Streaming Engine の REST API インターフェースは HTTP/8087 となっています。&lt;/p>
&lt;p>以下の手順で、REST API インターフェースを HTTPS で公開するよう設定を変更します。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;code>/usr/local/WowzaStreamingEngine/conf/Server.xml&lt;/code> を編集し、以下のように設定します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;RESTInterface&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> :
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;SSLConfig&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Enable&amp;gt;&lt;/span>true&lt;span class="nt">&amp;lt;/Enable&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;KeyStorePath&amp;gt;&lt;/span>${com.wowza.wms.ConfigHome}/conf/keystore.jks&lt;span class="nt">&amp;lt;/KeyStorePath&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;KeyStorePassword&amp;gt;&lt;/span>[JKSパスワード文字列]&lt;span class="nt">&amp;lt;/KeyStorePassword&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;KeyStoreType&amp;gt;&lt;/span>JKS&lt;span class="nt">&amp;lt;/KeyStoreType&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;SSLProtocol&amp;gt;&lt;/span>TLS&lt;span class="nt">&amp;lt;/SSLProtocol&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Algorithm&amp;gt;&lt;/span>SunX509&lt;span class="nt">&amp;lt;/Algorithm&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;CipherSuites&amp;gt;&amp;lt;/CipherSuites&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Protocols&amp;gt;&amp;lt;/Protocols&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/SSLConfig&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;IPWhiteList&amp;gt;&lt;/span>*&lt;span class="nt">&amp;lt;/IPWhiteList&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> :
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/RESTInterface&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>または、以下のコマンドで Server.xml を変更することも可能です。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cat /usr/local/WowzaStreamingEngine/conf/Server.xml &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> xmlstarlet edit --update &lt;span class="s2">&amp;#34;/Root/Server/RESTInterface/SSLConfig/Enable&amp;#34;&lt;/span> --value &lt;span class="s2">&amp;#34;true&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> xmlstarlet edit --update &lt;span class="s2">&amp;#34;/Root/Server/RESTInterface/SSLConfig/KeyStorePath&amp;#34;&lt;/span> --value &lt;span class="s2">&amp;#34;\${com.wowza.wms.ConfigHome}/conf/keystore.jks&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> xmlstarlet edit --update &lt;span class="s2">&amp;#34;/Root/Server/RESTInterface/SSLConfig/KeyStorePassword&amp;#34;&lt;/span> --value &lt;span class="s2">&amp;#34;[JKSパスワード文字列]&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> xmlstarlet format -t &lt;span class="p">|&lt;/span> xmlstarlet c14n &amp;gt; /tmp/Server.xml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo cp /tmp/Server.xml /usr/local/WowzaStreamingEngine/conf/Server.xml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>JKS鍵ストアファイルをコピーします&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo cp &lt;span class="si">${&lt;/span>&lt;span class="nv">PWD&lt;/span>&lt;span class="si">}&lt;/span>/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.jks /usr/local/WowzaStreamingEngine/conf/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ln -s /usr/local/WowzaStreamingEngine/conf/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.jks /usr/local/WowzaStreamingEngine/conf/keystore.jks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Wowza Streaming Engine を再起動する&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart WowzaStreamingEngine
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>HTTPS 証明書が正しくロードされ、443 ポート番号が正しくセットアップされたか、
Wowza Streaming Engine ログ (&lt;code>/usr/local/WowzaStreamingEngine/logs/wowzastreamingengine_access.log&lt;/code>) を確認します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RESTServer: Bind attempt ([any]:8087)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RESTServer: Bind successful ([any]:8087)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Wowza REST API started
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RESTServer: SSL:Yes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>また、以下のコマンドを実行し、8087 ポートに　HTTPS でアクセスできるかどうかも確認します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl https://&lt;span class="o">[&lt;/span>ドメイン名&lt;span class="o">]&lt;/span>:8087/ -u &lt;span class="o">[&lt;/span>ユーザー名&lt;span class="o">]&lt;/span>:&lt;span class="o">[&lt;/span>パスワード&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wowza Streaming Engine のバージョン情報が表示されれば問題ありません。&lt;/p>
&lt;blockquote>
&lt;p>管理 UI からアクセスする場合は、Wowza Streaming Engine Manager 管理サービスの HTTPS を有効にする必要があります&lt;/p>
&lt;/blockquote>
&lt;h3 id="wowza-streaming-engine-manager-管理サービスの-https-を有効する">Wowza Streaming Engine Manager 管理サービスの HTTPS を有効する&lt;/h3>
&lt;p>既定では Wowza Streaming Engine Manager 管理サービスは、HTTP/8086 となっています。&lt;/p>
&lt;p>以下の手順で、管理サービスを HTTPS/8090 で公開するよう設定を変更します。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;code>/usr/local/WowzaStreamingEngine/manager/conf/tomcat.properties.xml&lt;/code> を編集し、以下のように設定します。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">httpsPort=8090
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">httpsKeyStore=conf/keystore.jks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">httpsKeyStorePassword=[JKSパスワード文字列]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>JKS鍵ストアファイルをコピーします&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo cp &lt;span class="si">${&lt;/span>&lt;span class="nv">PWD&lt;/span>&lt;span class="si">}&lt;/span>/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.jks /usr/local/WowzaStreamingEngine/manager/conf/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ln -s /usr/local/WowzaStreamingEngine/manager/conf/&lt;span class="si">${&lt;/span>&lt;span class="nv">DOMAIN&lt;/span>&lt;span class="si">}&lt;/span>.jks /usr/local/WowzaStreamingEngine/manager/conf/keystore.jks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Wowza Streaming Engine を再起動する&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart WowzaStreamingEngineManager
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>REST API インターフェースの HTTPS を有効にした場合は、管理 UI にアクセスし、&amp;quot;&lt;strong>[+] Server&lt;/strong>&amp;quot; をクリックし、REST API インターフェースのホスト名を &lt;code>https://[HTTPS 証明書のドメイン名]:8087&lt;/code> に設定し、[&lt;strong>Sign In&lt;/strong>] をクリックしてログインします。&lt;/p>
&lt;h2 id="まとめ">まとめ&lt;/h2>
&lt;p>この記事では、Let&amp;rsquo;s Encrypt で発行した証明書を使って、Wowza Streaming Engine の HTTPS 証明書のセットアップを行いました。&lt;/p>
&lt;p>Certbot ツールを利用すると、証明書の発行前後にカスタムのイベントフックスクリプトを動作させることができるため、DNS レコードの追加・更新の自動化が可能となったり、証明書の有効期限が切れに合わせて自動更新スクリプトを cron で動作させたり、などの運用も可能となります。&lt;/p>
&lt;p>Certbot で発行した証明書から JKS 形式のファイルを生成するスクリプトを &lt;a href="https://gist.github.com/liveinstantly/c10a780a302badb42b5e5cca7000f9b9" target="_blank">Gist&lt;/a>
で公開しています。&lt;/p></description></item><item><title>Resources: Wowza Streaming Engine のインストールとセットアップ</title><link>https://www.liveinstantly.com/ja/resources/blog/get-started-wowza-streaming-engine/</link><pubDate>Wed, 30 Sep 2020 09:00:00 +0000</pubDate><guid>https://www.liveinstantly.com/ja/resources/blog/get-started-wowza-streaming-engine/</guid><description>&lt;img src="https://www.liveinstantly.com/ja/resources/blog/get-started-wowza-streaming-engine/featured-screenshot_hu40e9c34e329d17e0ef84122482ba00db_170399_640x0_resize_q75_catmullrom.jpg" width="640" height="397"/>&lt;h2 id="wowza-streaming-engine-とは">Wowza Streaming Engine とは&lt;/h2>
&lt;p>Wowza Streaming Engine は Wowza Media Systems が開発しているストリーミングサーバーのソフトウェア製品です。
ビデオ・オンデマンドやライブのビデオストリーミングのためのプラットフォームの構築に利用することができます。
MPEG-DASH, Apple HTTP Live Streaming (HLS), Adobe RTMP など主要なストリーミング プロトコルに対応し、
同時に、ビデオチャットなどに用いられる遅延の少ない WebRTC のようなプロトコルにも対応します。&lt;/p>
&lt;p>Java VM 上で動作するプラットフォームで、Windows/macOS/Linux の各 OS で動作します。
オンプレミスのデータセンターだけでなく、各クラウド上の仮想マシンやコンテナーで動作させることもできます。&lt;/p>
&lt;p>この記事では、Ubuntu Linux にインストールし、ビデオ・オンデマンド ストリーミングの動作確認をします。&lt;/p>
&lt;h2 id="wowza-streaming-engine-のインストール">Wowza Streaming Engine のインストール&lt;/h2>
&lt;h3 id="wowza-streaming-engine-のトライアルライセンスの入手">Wowza Streaming Engine のトライアルライセンスの入手&lt;/h3>
&lt;p>Wowza Streaming Engine を動作させるにはライセンスキーが必要となりますが、
Wowza Media Systems ではトライアル用のライセンスを無料で提供しています。&lt;/p>
&lt;p>Wowza Streaming Engineのトライアルでは、以下を提供します。&lt;/p>
&lt;ul>
&lt;li>最も安定しスケーラービリティの高いビデオストリーミングのためのソフトウェアを提供&lt;/li>
&lt;li>ライブ、ビデオ・オンデマンドのための REST/Java API を提供&lt;/li>
&lt;li>フル機能を提供する30日間のトライアル&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://auth.wowza.com/register?type=engine&amp;amp;optin=0" target="_blank">こちら&lt;/a>
から Wowza アカウントを作成し、
トライアルに参加することができます。
登録が完了すると、メールが届き、ライセンスキーを入手することができます。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-trial.jpg" alt="Wowza Streaming Engine のトライアル登録">&lt;/p>
&lt;h3 id="wowza-streaming-engine-のダウンロード">Wowza Streaming Engine のダウンロード&lt;/h3>
&lt;p>次に Wowza Streaming Engine ソフトウェアをダウンロードします。
先ほど、登録した Wowza アカウントを使って、&lt;a href="https://auth.wowza.com/login" target="_blank">Wowza Portal&lt;/a>
にログインし、
&lt;strong>[Downloads]&lt;/strong> タブから Linux 用のインストーラーをダウンロードします。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-downloads.jpg" alt="Wowza Streaming Engine のダウンロード">&lt;/p>
&lt;p>ダウンロードした Linux 用インストーラーのファイル名は &lt;code>WowzaStreamingEngine-4.8.21+6-linux-x64-installer.run&lt;/code> です。&lt;/p>
&lt;h3 id="ubuntu-server-への-wowza-streaming-engine-のインストール">Ubuntu Server への Wowza Streaming Engine のインストール&lt;/h3>
&lt;p>&lt;a href="https://ubuntu.com/download/server" target="_blank">Ubuntu Server Linux&lt;/a>
がインストールされているコンピューターにインストールします。
この記事では、記事作成時の最新の LTS (Long-Term Support) 版の Ubuntu Server 22.04 LTS を使います。&lt;/p>
&lt;p>以下のコマンドを実行して、ダウンロードしたインストーラーを使ってインストールを行います。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>[WSE_USERNAME]&lt;/strong>: 管理 UI へのログインのユーザー名を指定します&lt;/li>
&lt;li>&lt;strong>[WSE_PASSWORD]&lt;/strong>: 管理 UI のログイン ユーザーのパスワードを指定します
&lt;ul>
&lt;li>パスワードに指定可能な文字は、英数字と4種類の記号 (@ . _ -) になります&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>[WSE_LICENSEKEY]&lt;/strong>: Wowza Streaming Engine のトライアル用ライセンスキーを入力します。&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">chmod +x WowzaStreamingEngine-4.8.21+6-linux-x64-installer.run
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./WowzaStreamingEngine-4.8.21+6-linux-x64-installer.run --prefix /usr/local &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --username &lt;span class="o">[&lt;/span>WSE_USERNAME&lt;span class="o">]&lt;/span> --password &lt;span class="o">[&lt;/span>WSE_PASSWORD&lt;span class="o">]&lt;/span> --licensekey &lt;span class="o">[&lt;/span>WSE_LICENSEKEY&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下のメッセージが表示されたら、セットアップウィザードに従ってインストールします。
インストールパラメーターはコマンドラインで指定しているため、[Enter] キーを押していけば進められます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">----------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Welcome to the Wowza Streaming Engine Setup Wizard.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Please read the following License Agreement. You must accept the terms of this
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">agreement before continuing with the installation.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Press [Enter] to continue:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下のメッセージに [Y] キーを入力してインストールします。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Start Wowza Streaming Engine automatically [Y/n]: Y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; 自動的に Wowza Streaming Engine を起動しますか？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Do you want to continue? [Y/n]: Y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; 入力した情報でインストールを継続しますか？ (インストール前の最終確認)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="wowza-streaming-engine-へのネットワーク接続確認">Wowza Streaming Engine へのネットワーク接続確認&lt;/h3>
&lt;p>Wowza Streaming Engine をインストールすると、以下の Java コンポーネントが動作します。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Wowza Streaming Engine&lt;/strong>: ストリーミングサーバー本体&lt;/li>
&lt;li>&lt;strong>Wowza Streaming Engine Manager&lt;/strong>: ストリーミングサーバーの管理のためのウェブサービス&lt;/li>
&lt;/ul>
&lt;p>Wowza Streaming Engine はインストール後の既定の構成では、それぞれのコンポーネントで以下のポート番号を利用します。
インストールした環境に合わせてファイアウォールの設定を行ってください。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ポート番号&lt;/th>
&lt;th>プロトコル&lt;/th>
&lt;th>コンポーネント&lt;/th>
&lt;th>概要&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1935&lt;/td>
&lt;td>TCP&lt;/td>
&lt;td>Wowza Streaming Engine&lt;/td>
&lt;td>ストリーミング用の既定のポート&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8086&lt;/td>
&lt;td>TCP&lt;/td>
&lt;td>Wowza Streaming Engine&lt;/td>
&lt;td>管理インターフェス用の既定のポート&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8087&lt;/td>
&lt;td>TCP&lt;/td>
&lt;td>Wowza Streaming Engine&lt;/td>
&lt;td>REST API 用の既定のポート&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8088&lt;/td>
&lt;td>TCP&lt;/td>
&lt;td>Wowza Streaming Engine Manager&lt;/td>
&lt;td>管理ウェブサービス用の既定のポート&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Wowza Streaming Engine に正しくアクセスできるかどうか、以下のコマンドを実行することで確認できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl http://&lt;span class="o">[&lt;/span>hostname or ip address&lt;span class="o">]&lt;/span>:1935/ServerVersion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl http://&lt;span class="o">[&lt;/span>hostname or ip address&lt;span class="o">]&lt;/span>:8086/ServerVersion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>正しくアクセスできた場合は、以下の出力が確認できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Wowza Streaming Engine 4 Trial Edition (Expires: Apr 15, 2023) 4.8.21+6 build20230125151621&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;Wowza Streaming Engine 4 Trial Edition (Expires: Apr 15, 2023) 4.8.21+6 build20230125151621&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wowza Streaming Engine をインストールすると、ビデオ・オンデマンド (&lt;code>vod&lt;/code>) とライブ (&lt;code>live&lt;/code>) のタイプの
単一サーバーアプリケーションがインストールされますので、これを利用します。&lt;/p>
&lt;p>その他のアプリケーションタイプが用意されており、スケーラービリティの高い構成を行うこともできます。&lt;/p>
&lt;h3 id="wowza-streaming-engine-の管理-ui-wowza-streaming-engine-manager-へのアクセス">Wowza Streaming Engine の管理 UI (Wowza Streaming Engine Manager) へのアクセス&lt;/h3>
&lt;p>Wowza Streaming Engine をインストールすると、管理のためのウェブサービス (管理 UI) もインストールされます。
ブラウザーで以下のURLにアクセスし、設定した管理 UI のユーザー名とパスワードでログインすると、管理画面が表示されます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">http://[hostname or ip address]:8088/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="./wowza-streaming-engine-manager-ui-top.jpg" alt="Wowza Streaming Engine Manger UI">&lt;/p>
&lt;h3 id="外部公開のホスト名ipアドレスの設定">外部公開のホスト名・IPアドレスの設定&lt;/h3>
&lt;p>インストールした環境がクラウド環境やコンテナ環境の場合、ホストのIPアドレスと外部に公開されているIPアドレスが異なる場合があります。
この場合、以下のコマンドを実行して VHost.xml を書き換ることで、管理 UI のトップ画面で &lt;strong>[Test Player]&lt;/strong> ボタンを押した際に、
外部公開のURLが正しく表示されるようになります。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mv /usr/local/WowzaStreamingEngine/conf/VHost.xml /usr/local/WowzaStreamingEngine/conf/VHost.xml.old
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo xmlstarlet edit --update &lt;span class="s2">&amp;#34;/Root/VHost/Manager/TestPlayer/IpAddress&amp;#34;&lt;/span> --value &lt;span class="s2">&amp;#34;[hostname or ip address]&amp;#34;&lt;/span> /usr/local/WowzaStreamingEngine/conf/VHost.xml &lt;span class="p">|&lt;/span> xmlstarlet format -t &amp;gt; /usr/local/WowzaStreamingEngine/conf/VHost.xml.new
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="ビデオオンデマンド-サンプルコンテンツの再生">ビデオ・オンデマンド サンプルコンテンツの再生&lt;/h3>
&lt;p>インストールした Wowza Streaming Engine には、&lt;code>&amp;lt;install-root&amp;gt;/content&lt;/code> フォルダにサンプルコンテンツが含まれています。
HTTP 経由でサンプルコンテンツの再生を行います。&lt;/p>
&lt;p>サンプルコンテンツの再生 URL は、管理 UI のトップ画面で &lt;strong>[Test Playback&amp;hellip;]&lt;/strong> ボタンを押すと表示されます。&lt;/p>
&lt;ul>
&lt;li>HLS: &amp;lt;http://[hostname or ip address]:1935/vod/mp4:sample.mp4/playlist.m3u8&amp;gt;&lt;/li>
&lt;li>MPEG-DASH: &amp;lt;http://[hostname or ip address]:1935/vod/mp4:sample.mp4/manifest.mpd&amp;gt;&lt;/li>
&lt;li>RTMP: rtmp://[hostname or ip address]:1935/vod/mp4:sample.mp4&lt;/li>
&lt;li>RTSP: rtsp://[hostname or ip address]:1935/vod/mp4:sample.mp4&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>: インストール直後の状態は、HTTPS (TLS) サーバー証明書の発行・設定を行っていないため、HTTPS 経由で再生することはできません。
別の記事で、TLS 証明書の設定方法を紹介します。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;a href="https://www.wowza.com/testplayers" target="_blank">Wowza Test Player&lt;/a>
で HTTP のサンプルコンテンツは再生できないため (以下の注意点を参照)、
この記事では、オープンソースの &lt;a href="http://testplayer.demo.liveinstantly.cloud/" target="_blank">Web プレイヤー (http://testplayer.demo.liveinstantly.cloud/)&lt;/a>
を
使って、HLS, MPEG-DASH のコンテンツの再生を確認します。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-playback-with-web.jpg" alt="Webプレイヤーでのストリームの再生">&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>: Wowza Test Player 以外にも様々な組織や企業が提供しているほとんどの Web ベースのテスト用ストリーミングプレイヤーは
HTTPS でホストされていますが、ほぼすべてのブラウザーが HTTP/HTTPS 混在のウェブコンテンツのブラウジングを許可しないため、
それらのプレイヤーでは HTTP コンテンツの再生ができません。&lt;/p>
&lt;/blockquote>
&lt;p>また、&lt;a href="https://www.videolan.org/vlc/index.ja.html" target="_blank">VLC メディアプレイヤー&lt;/a>
を使うと、HLS, MPEG-DASH 以外にも、RTMP/RTSP の
各ストリーミングプロトコルの再生確認ができますので、&lt;a href="https://www.videolan.org/vlc/index.ja.html" target="_blank">VLC メディアプレイヤー&lt;/a>
も
使って確認します。&lt;/p>
&lt;p>メニューバーから &lt;strong>[Media]&lt;/strong> -&amp;gt; &lt;strong>[Open Network Stream&amp;hellip;]&lt;/strong> を選択し、以下の URL を入力して再生することができます。&lt;/p>
&lt;p>&lt;img src="./wowza-streaming-engine-playback-with-vlc.jpg" alt="VLCでのストリームの再生">&lt;/p></description></item></channel><template>posts/list.rss.xml</template></rss>