HTTP Live Streaming覚え書き

以前、Darwin Streaming Serverを使って動画ファイルをソーシャルビューイングする話を書きましたが、この方式(RTSP)だとiOS端末から視聴できないので、HTTP Live Streamingに挑戦してみました。

HTTP Live StreamingはAppleが推進しているストリーミング配信方式で、近年デ・ファクトになりつつあるようです。主立った特徴として、

  • Apacheなど通常のWebサーバーにファイルを置けば配信できる
  • クライアントの通信帯域に合わせて、複数用意したビットレートのファイルを自動的に使い分けてくれる
  • HTML5のvideoタグを使ってHTMLページ内でインライン再生できる(iPhoneは全画面強制)

等があります。いつもソーシャルビューイングする面子にiPadしか通信端末がない人がいて動画視聴とチャットが同時にできなくて困ってたんですが、HTMLページに動画に加えインラインフレームでチャットサイトを呼び出すことで、1画面内で再生とチャットが同時に実現しました。更にAppleTV等AirPlayクライアントがある環境なら動画再生をそちらに飛ばし、iPad側はチャットに徹するという、疑似バックグラウンド再生までできてしまいます。画面写真を貼りたいところですが諸般の事情により自重。ベランダの植木鉢の成長動画をみんなで愛でている様でもご想像下さいw。

■動画の下ごしらえにはApple製のCUIツールを使用

iOS端末で視聴する場合、動画のコーデックはH.264を使います。ただしコンテナはmp4ではなく.ts(MPEG2 トランスポートストリーム)になります。更にDarwinで使う時のヒントトラックのようなインデックス情報をテキストファイルで用意する必要があります。これを簡単にしてくれるCUIツールがAppleから配布されています。Developer登録してないとダウンロードできないかもなので、未登録な人はFFMPEG等を使う方法をググったりしてみて下さい。今回は、streamingtools_beta157_signed.dmgを入手しインストールしてある状態で操作しています。

目標として、720p、600p、480pという三段階の画質/ビットレートの同内容の動画を用意し、クライアント側の帯域にあわせて自動選択をすることにします。H.264/AACなmp4ファイルを用意し、下記のフォルダ階層下に配置します。

src/
    lo/
        hoge.mp4
    mid/
        hoge.mp4
    hi/
        hoge.mp4

srcフォルダの下に、lo/mid/hiというビットレート別のサブフォルダを作り、それぞれの中にレート違いの動画hoge.mp4を置いてます。CUIツールでパス指定とオプションを駆使すればこの配置である必要もないですが、とりあえずAppleのドキュメントに倣っています。動画ファイルを取り違えないよう注意しましょう。

次に、各動画のコンテナ変換とセグメンティングを行います。

cd src/lo
mediafilesegmenter -s –I hoge.mp4

loの部分をmid、hiに置き換え計3回実行します。-sオプションは.tsファイルを単一ファイルで出力する指定。以前はセグメンテーション毎に通し番号の付いた無数の.tsファイルを生成されてたんですが、これをつければ出力される.tsファイルは1つだけになります。-I(大文字のi)はIフレーム単位のシークが行えるようにするインデックスも合わせて出力します。どちらもiOS端末がiOS5以降でないと対応できないようです。ここまででファイル構成は以下のようになると思います。hoge.mp4は不要になるので消しても構いません。

src/
    lo/
        hoge.mp4
        hoge.plist
        iframe_index.m3u8
        main.ts
        prog_index.m3u8
    mid/
        hoge.mp4
        hoge.plist
        iframe_index.m3u8
        main.ts
        prog_index.m3u8
    hi/
        hoge.mp4
        hoge.plist
        iframe_index.m3u8
        main.ts
        prog_index.m3u8

main.tsがtsコンテナにパッケージングし直された動画ファイルです。エンコードする訳ではないので数秒で終わります。prog_index.m3u8ファイルがHTML5のvideoタグで動画ファイルの代わりに指定するプレイリスト定義ファイルです。

次に、この3パッケージの動画をクライアントが動的に切り替えて使用できる統括プレイリストを作成します。srcフォルダ直下に移動し、

variantplaylistcreator -o all.m3u8 lo/prog_index.m3u8 lo/hoge.plist -iframe-url lo/iframe_index.m3u8 mid/prog_index.m3u8 mid/hoge.plist -iframe-url mid/iframe_index.m3u8 hi/prog_index.m3u8 hi/hoge.plist -iframe-url hi/iframe_index.m3u8

ちと見辛いのでビットレート毎に色分けしてみます。最初に出力ファイル-o all.m3u8を指定した後、prog_index.m3u8と(動画名).plistを指定し、-iframe-urlオプションでiframe_index.m3u8を指定。これをビットレート種類の数繰り返すわけです。Iフレームシークが不要な場合は3つ目は省略できます。これでsrcフォルダの下にall.m3u8が生成されます。

一式をWebサーバーに置き、QuickTime Player等のHTTP Live Streaming対応ソフトでall.m3u8ファイル(ビットレート固定したい場合は各サブフォルダのprog_index.m3u8)を開けば(QuickTime Playerの場合は「ファイル」->「場所を開く…」から)再生できるはずです。ただ、手持ちの環境では、なぜかWindows版のQuickTime PlayerやVLCでは再生できませんでした。せっかくiOSで再生できるようになったのにWindowsな人が排斥されては困ります。ここはまだ調査中です。

■HTMLページに埋め込む

HTMLファイルにこんな感じで書くだけでOKです。

<video src="all.m3u8" controls preload=”auto” width="100%"></video>

controlsは操作UIを表示する(なくても表示される?)、preloadはページを開くと同時に動画を先読みする指定です。その他、autoplayを指定すると自動で再生が始まるはずですがiOS(Safari)の場合は無視されるようです。JavaScriptからの再生制御もiOSでは効きませんでした。これができるとAjaxや時刻指定で一斉に再生開始して同期視聴できたり面白い
んですが…

実際に再生してみると、まずは480pの動画から再生され(多分variantplaylistcreatorで指定した順?)、帯域に余裕があると見るや600pや720pに途切れることなくスイッチしていきます。(事前のエンコは手間ですが)最低通信速度の面子に合わせて全員が画質を落とさなくても済むのは大きいです。

画質落ちてもいいからパケット量を減らしたい、という場合は、all.m3u8の代わりにlo/prog_index.m3u8を指定したHTMLを用意してやればOKです。我が家ではURIのGETパラメーターで指定できるように工夫したりしてます。

また、これもウチではMac/iOSのSafariからしか再生に成功していません。videoタグは使えるはずのChromeやFireFox、果てはWindows版のSafariでNG。.m3u8形式のファイルを動画として認識してくれないってことなんでしょうかね?WindowsやAndroidでもHTTP Live Streaming自体はできそうな記事がちらほら見付かるので、もう少しリサーチしてみたいと思います。

 

複数ビットレートを使い分けようとしない限り、事前の準備はDarwinを使ったRTSP配信とそう手間はかわらず、相手がMacかiOSなら別途ソフトのインストールもいらないで視聴できることがわかりました。難点は同期再生できないこととWindowsからの再生が(今のところ)できない点。このあたりはリサーチ次第で改善できる余地がありそうなので、もう少し研究してみたいと思います。

FLET’S ミルエネ利用開始

IMG_3068

フレッツ光ネクスト化が完了したので、Bフレッツの時には利用できなかった「FLET’S ミルエネ(以下ミルエネ)」も申し込みました。ミルエネは家庭の分電盤やコンセントに計測機器を取り付け、消費電力量をクラウドにアップして電力消費量をグラフ表示するサービスです。

コンセント用の計測機を含まない、基本セット(親機+分電盤用計測機)が、補助金使って買い取りなら無料、レンタルなら月210円。プラスサービス利用料が月210円です。補助金は手続きが面倒くさそうだったし利用期間などの縛りもあったので月210ならいいやとレンタルをチョイス。ちなみにコンセント用のタップ型計測機は買い取りのみで4,200円です。

写真の左が親機。ブロードバンドルーターにLANケーブルで接続して使います。右が分電盤用の計測機。二本のケーブルの先にクランプ(洗濯ばさみのようなクリップ)をとりつけ、分電盤のメインブレーカーから出ている赤と黒の線を挟む形で取り付けます。取り付けの解説動画はこちら。親機と計測機の通信はZigBeeという幻の(笑)短距離無線通信規格を使っているっぽいです(名前は何年も前から知ってたけど、実際に使ってるデバイスに触れるの初めて)。最初に2つの機器間のペアリング設定が必要でした。手順としてはBluetooth機器でやってればそう難しくはないでしょう。

その後でflets-eco.jpにログインしてアカウント設定を行うと、Javaアプレットが起動して、IDとパスワードをLAN内の親機に自動書き込みしてくれるんですが、何故かウチでは上手くいきませんでした(親機が見付からないと言われる)。仕方ないので、親機のIPアドレスを直接叩き、管理画面からログインして手動でID/PWを設定。「認証」ランプが点灯すればOKです。ウチはMACアドレスをDHCPサーバーに登録して固定IPアドレスを振っているので特定余裕でしたが、WindowsならNetBIOS名でもアクセスできるようです。上記設定が上手くいかずなおかつMacしかない環境だったらちと大変かもですね。

■実際のグラフ表示の様子

image

基本画面はこんな感じ。右サイドバーは電力会社側の発電量に関するものなのでスルーしてOKです。我が家はひとり暮らしなのに夏場など1万数千円にもなってしまう電力食い世帯でお恥ずかしい限りですが、こんな感じで時間別のグラフ(オレンジ棒)、累計(赤折れ線)が出ます。青い横棒は目標値として1万円を指定したら出てきたものです。CO2を毎日数kg(気体でkgといったら体積は相当なものでしょう)排出してるよ、と言われると凹みますね。まさに「見える化」の効能でしょう。

 

image

こちらが時間別、1分単位のグラフ。これだけきめ細かに計測できるなら、コンセント別計測しなくても、マネにスイッチ操作しながら眺めれば、なにが瞬間的にどれだけ食ってるかだいたいの見当はつけられそうです。タップ型はその機器が毎月どれくらい使われてるかという統計値まで必要な時に使うって感じですね。というか、サーバーや冷蔵庫などはスイッチをOFFにとか試しづらいので、やっぱりタップ型も欲しいなぁ。

 

その他、地域、間取り、家族構成別の平均値と比較したり、自分のランキングがわかる画面などがあります。ちなみに3月のひとり暮らし世帯での暫定ランキングは651世帯中580位。ギャフン!地域別で1500世帯くらい、間取り別で500世帯位しか登録がないようなので、全国で利用してる数はせいぜい1万世帯がいいとこでしょうか(てか西日本でもやってるんだっけ?)。

■どう活かすかが問題

さてせっかく月420円(+電気代)払うのだから、オモスレー!で終わらせず、それ以上の電力消費に結びつけたいものです。我が家では冬場はエアコンは基本的に使わないものの、常時稼働のサーバー類が、ML115(+UPS)、Mac miniサーバー(+UPS)、録画用Windows機(+UPS)、NASが2台、WiFiアクセスポイントが2台、BD/DVDレコーダー、nasne、AirMac Expressなど。あとは冷蔵庫ですかね。白熱電球は全廃済み。消費電力が大きく瞬発的なものとしては、プロジェクター、AVアンプ、生ゴミ処理機、そして洗濯機、電子レンジ、電気ケトルなど。今までどちらかといえば後者の群が元凶なイメージがありましたが、就寝中や外出中の待機(?)状態であるはずの消費量が金額で16円/時前後あることがわかりました。これが1日384円、月にすると1万円以上と大半を占める計算になります。つまり目に見える「照明やテレビを豆に消す」とかいう節電ではなく、常時稼働機器を減らすというところがキモになってくるわけですねぇ。

まぁわかってましたけどねっ!

ML115で動いているサービス群をはやくMac miniサーバーに移行させて退役させないとなんだけど、色々苦戦しててもう1年以上併用状態なんですよねー。あと、広域イーサネクストで実家と高速でやりとりができるようになってれば、帰省用LinkStationをやめてDS1511+に一本化できたんだけどなぁ。

結局我が家の変態デュアルスタック構成はこんな感じ

自宅のサブISPとしてIPoEのIIJmio/NFを申し込んでIPv6ネイティブにした頃から、たびたびネットがつながらなくなる現象が発生しました。NVR500を再起動すると治るもののまた数時間すると不通に。ちなみに我が家のネットワーク構成は以前の記事に貼ったこの図の通り。ひかり電話ルーターであるRT-400KIをパススルーさせずNVR500をブロードバンドルーターとして使う為の変態構成です。400KIにはPPPoE設定はしてません。

二日ほど悩んだ後、ふと思い立ってRT-400KIを再起動(というかWAN側のDHCPv6再取得)してみたら即座に不通状態再現。ビンゴ。ハブを経由して2つのルーターがNGN側からIPv6のプレフィクスを取り合っていたんじゃないかと。LAN内の設定的には、IPv4もv6もNVR500がゲイトウェイになってるのに、400KIが定期的に「オレがゲイトウェイだ(キリッ」っとNGN側にレジストしにいって、結果NVR500側で通信ができなくなってたんじゃないかと。また双方がRAやDHCPv6でLAN内の各端末にIPv6アドレスやゲイトウェイ情報を配布してたのもダメっぽい。

結局NVR500からIPoE設定(実際にどこかにコネクションをつないだりはしないものの、ルーティングやRA/DHCPv6動作に関わっていたと思われる)を削除し、RA動作もCUIから停止させました。そうすることでv4はNVR500経由、v6は400KI経由というダブルルーター状態に。NVR500の方が性能良さそうだしフィルターなども片方で一元管理したいんですが、400KI側のRA等を止める設定はナサゲだし、Asteriskでひかり電話を使う以上、400KI自体を撤去してしまうわけにもいかなかったので、こういう形に落ち着きました。NVR500にSIPサーバー機能さえあれば完全に一台で済ませられるんですけどね…

ちなみにこの構成にした後、しばらく外からIPv6で各PCに到達できずに悩んだんですが、昨日偶然ブレーカーが落ちて全て再起動した辺りからまたつながるようになりましたw。両ルーターは何度も再起動したりフィルター設定なども散々チェックしたんですけどね。ONUが再起動したのが良かったのかしら?

IPoE環境だとフレッツ網内用とインターネット用とで共通のIPv6アドレスなはずなので、もしかしたら400KIをNVR500配下においてIPv6パススルーでもいけるんじゃね?という気がしますが未検証。なんかもうめんどくさくなってw。どのみち400KIのRAを止められない限りややこしいことになりそうだし。

まぁ、こんなマニアックな構成やりたがる人が果たしてどれだけいるのかわかりませんが、一応参考までに。

 

あと、400KIにしたせいか、もともと計測にバラツキがあったのか不明ですが、前回IPv6アドレスで西日本からアクセスしたらv4より速かった、的なこと書いたんですが、その後試した感じでは逆にIPv4の方が速くなる場合もあり単純にIPv6スゲー!ってことにはどうもならなそうです。

■オマケ

上記と関係ないですが、PPTPサーバー役をIPマスカレイドしたOSX ServerからNVR500に変更しました。これだとなにがいいかというと、PPTPクライアント側からWOLが直接LAN内のマシンに届く点です。iPhoneからiNetというアプリで直接スリープしてるPCを起こせます。今まではLinuxマシンにログインしてsuしてコマンド叩いてたんですがだいぶ楽になりました。

一旦UT-VPNでお茶を濁してみるなど

広域イーサネクストが期待通りの速度が出ない上に、DHCPパケットが双方のネットワークにカオスを招くということで、一旦利用を断念し、PacketiXのオープンソース版であるUT-VPNを導入しました。PacketiXは2.0までは買ってたんですが、3.0で拠点間接続ができる企業向けバージョンは手の届かない値段だし、リモートアクセスならPPTPやL2TPなど手軽な方法が充実してきて、すこし必要性が下がってきた感じでスルーしていました。しかしオープンソース版であるUT-VPNでも拠点間接続ができるし、広域イーサネクストと違ってDHCPv4/v6/RAパケットの遮断機能がついているのでむしろ当面はこっちの方が有用なんじゃないかと。もちろん仮想L2スイッチエミュレーションであることは同じなので、Bonjour系サービスも利用できます。広域イーサネクストのようにフレッツ網内折り返し通信に特化はしてないですが、どのみちNTT東西をまたぐ場合はインターネットを経由するっぽいし、IPoE同士の環境ではIPv6アドレスで接続できています。

■セットアップメモ

OSX版は機能制限が多かったのでWindows版をチョイス。自宅のWindows7機には簡単に入りましたが、実家のWindows8機だと仮想NICの作成ができませんでした。Windows8はPacketiX4.0から正式対応ということなので仕方ないいのかも。てことで、rsyncによるバックアックサーバー兼PPTPサーバーとなっているCentOS仮想機にLinux版をインストール。バイナリ配布はされてませんが、必要なパッケージさえ揃っていれば、configure & makeであっさりビルドできました。ひっかかったのは、UT-VPNの場合、Bridge用バージョンが用意されておらず、双方Server版をインストールし、クライアント側から仮想Hubをカスケード接続する形で接続する方式になる点。つまり、双方で仮想Hubと物理NICをローカルブリッジ設定した上で、双方の仮想Hub同士をつなぐって感じですね。

■それでもやっぱり出ない速度orz

一旦つながってしまえばちゃんとBonjourもWindowsファイル共有もできてます。自宅iTunesの共有ライブラリを実家のiTunesから開いて、自宅のAirMac ExpressにAirPlay再生とか余裕です。Windowsの「ネットワーク」に反対側の共有マシンもちゃんと出てきます。広域イーサネクストのようにちょくちょく切断したりもしません(もしくはしらない内に自動再接続してるか)。ただ、速度は広域イーサネクストと似たり寄ったり。Windows8のExplorerコピーでもFTPで、せいぜい1MB/s前後。UT-VPNに添付されているスループット測定ツールでも2.5Mbps~8Mbps位(方向で差がある)なので、プロトコルのロスというよりはどこかに回線速度的なボトルネックがありそうな感じ。仮想機のホストが非力なAtom 330ですが、タスクマネージャーで見る限りCPUが100%に張り付いてるようなことはないんですけどねぇ。

 

結局、この速度だとファイル移動やTimeMachineバックアップには実用に耐えない感じ。自宅のiTunesライブラリから直接再生できるぜー位の満足度しかありません。そろそろ自宅からリモートで実験できる手は品切れになりつつあるので、来月また時間が出来たら帰省してあれこれ試そうかと思っています。

自宅もIPoEでIPv6ネイティブ接続にして実験

思ったよりスピードが出なかったのが悔しくて、自宅もIPoE接続できるIIJmio/NFに追加で申し込んで実験してみました。IPv4がIIJmio/SFでPPPoE、IPv6がIIJmio/NFでIPoEという変則的な利用スタイルです。プロバイダ代だけで1万超えますorz。まぁ効果がなかったら解約すりゃいいや、と。

■あまりかわらなかった広域イーサネクスト

結論からいくとたいしてかわりませんでした。SMBでもFTPでも数百kbps程度です。こりゃぁどこか別のところにボトルネックがありそうですね。色々あって次回帰省時に実家側もNVR500にする予定なので、そこでまた再挑戦します。

今は実家側ルーターにPPTPサーバーがなくなってしまい、広域イーサネクスト仮想サーバーが稼働してるのと同じATOM/Windows8サーバー上で稼働しているCentOS仮想サーバーがPPTP機になっているので、やたらOS再起動が必要になるホストのIPv6設定をいじれないので(万一PPTPサーバーが復旧しなかったら以降なにもできなくなる)。ルーター設定してWindows8機のIPv6アドレスで直接リモートデスクトップできるようにすればいいかもですが、それもちょっと不安なので。

また感覚的に接続が切れやすくなったり、IPv6オプションが有効化されてなくね?エラーの頻度があがった気がします。直観的には、IPv4での二重DHCP問題と同じで、IPv6アドレスを割り振るRAなどのパケットも互いに行き来していまい、意図しないアドレスが双方のネットワークに割り振られまくってトラブルになってる気がします。これも今実家側のホストPCの設定をいじるのは再起動が発生してリスキーなので検証は保留。

また自宅側のMac Mini Serverに公式推奨のUSB-LANアダプタのLUA3-U2-ATXをつなぎ、直接広域イーサネクストサーバー仮想マシンに認識させてみましたがこれもあまり効果無し。

■効果があったIPv6ネイティブ接続

とまぁ、双方IPoEを推奨する広域イーサネクストの東西間接続ではあまり変化はなかったんですが、IPoE、つまりIPv6ネイティブ接続になったことで、外からIPv6アドレスで直接通信ができるようになります。この場合、NTT東日本の200Mbps制限がかかったPPPoEを経由しないので、理論的には下り1Gbps通信ができてしまうことに(ちなみに上りは多分100Mbpsのまま)。

設定はわりと簡単でした。NTTから割り当てられた半固定のIPv6プリフィクスを使って、サーバー機に固定のIPv6アドレスを設定し、ルーターで必要なポート開放をするのみ。

・HTTP

自宅のWebサーバーにspeedtest.net miniをインストールして、実家のAtom機から測りました。PPTP接続やリモートデスクトップ接続が負荷になってるかも知れませんが条件は同じってことで。予想に反して上り(東日本の下り)で差があまり出ませんでしたが、下りで結構差が大きくなりました。pingが速いのもポイント高いです。

下り(自宅->実家) 上り(実家->自宅) ping
IPv4 76Mbps 31Mbps 35ms
IPv6 106Mbps 36Mbps 25ms
・FTP

自宅のSynology DS1511+(HDD5台のRAID5)のFTPサーバーを有効にし、実家Atom機(SDD)からFileZillaにて100MB程度のファイルを送受信しました。FileZillaは転送完了後に所要時間や速度を表示してくれないので、転送中後半の数値が安定した頃をエイヤで捉えた数字になります。やはり自宅側で下りにあたるPUTが爆速ですね。bpsになおすとざっくり80Mbpsということになります。速すぎて数字読みのエイヤ度も高いですw。

GET(自宅->実家) PUT(実家->自宅)
IPv4 1.4Mib/s 3.0MiB/s
IPv6 2.7MiB/s 10MiB/s

 

ただまぁ、広域イーサネクストのセッテイング上に何かしらボトルネックがあってそれが解消したとしても、これくらいが上限ということになるのかも知れません。

2013.03.06追記:

フレッツ西日本のフレッツ光ネクスト隼が激遅になる時間帯(午後9時)に改めて比較計測してみました。対自宅のpingはWindowsのコマンドラインを使った値です。

下り 上り
speedtest 20Mbps 18Mbps
対自宅IPv4 5Mbps 11Mbps
対自宅IPv6 75Mbps 33Mbps

IPv6なら隼->鷺(詐欺)タイムでもさほど速度が落ちないですね。speedtestも遅くなってるので、自宅のせいではなく、隼側のPPPoEのISP側出口が混んでるってことですか
ねぇ。せっかくIPoEプロバイダを使ってるんだし、もっとIPv6対応サイトが増えるといいんですけどね。