Adobe HDS ( Http Dynamic Streaming ) は、Adobe社の提唱するストリーム配信用プロトコルです。配信に用いるコンテンツを複数の断片(フラグメント)に分割して、これをHTTPプロトコルに乗せて次から次へと配信していくものです。配信の仕組みは、ひとつ前の記事で紹介した Apple HLS ( Http Live Steaming )とよく似ていますが、プロトコルとしては全く別のものになります。

Adobe HDS Downloader は、その名の通り、Adobe HDS で配信されているコンテンツをローカル環境にダウンロード保存するアプリケーションです。作者は、KSV さんという方です。PHPスクリプトで書かれています。

フォーラム
Adobe HDS Downloader - Audio/video stream recording forums
http://stream-recorder.com/forum/adobe-hds-downloader-t12074.html

github
K-S-V/Scripts ・ GitHub
https://github.com/K-S-V/Scripts

以下、Adobe HDS Downloader を使えるようにするまで、の手順の覚え書きです。 (なお、上記フォーラムの一番最初に、作者さんご自身による Adobe HDS Downloader の導入方法・使い方の記述があります。簡潔にして十分な記述すので、そちらを読んでわかる方は、たぶん、以下の記事をお読みになる必要はないだろうと思います)。

Adobe HDS Downloader は、PHPスクリプトで書かれていますので、まず、ご自身の環境で PHP が使えるように環境を整えてやる必要があります。すでに、PHP を使える環境をお持ちの方は、この手順は、読み飛ばしてもらってかまいません。

手順1
PHP の導入


上記フォーラムより引用(一部リンクを修正)
(引用、ここから)
Installing PHP for dummies
  1. Download PHP 5.4 and extract it to C:\PHP folder.
  2. Download PHP.ini and copy it to the same folder.
  3. Right click on "My Computer" and go to Properties->Advanced->Environment Variables and add following string to the end of Path Variable.
    Code:
    ;C:\PHP
    
  4. Open cmd prompt and type php -v. if you have done above steps correctly then you will see something like following.
    Code:
    PHP 5.4.6 (cli) (built: Aug 15 2012 21:16:03)
    Copyright (c) 1997-2012 The PHP Group
    Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 
    
(引用、ここまで)

要約すると、
  1. PHP 5.4 をダウンロードして、C:\PHPフォルダに配し、
  2. PHP.ini をダウンロードして、C:\PHPフォルダへ放り込み、
  3. C:\PHPフォルダへパスを通し、
  4. コマンドプロンプトウィンドウから、
    php -v
    として、パスが通っていることを確認せよ。
ということです。

Windows向けPHP のダウンロードは、
PHP For Windows ( http://windows.php.net/ ) 内の
ダウンロードページ
http://windows.php.net/download/
から、
PHP 5.4(5.4.6)
VC9 x86 Thread Safe (2012-Aug-15 22:48:37)
Zip [14.74MB]
sha1: 2b528f073df5029132adc62d83d62dccd5c89b99
などでよいと思います。

PHP.ini は、KSVさんの示していらっしゃるリンク、
http://www.mediafire.com/file/yu86i2l12eae9m9/PHP.ini
から入手できます。

PHP の配置先、C:\PHPフォルダは、C:\PHP でなくてもよく、ご自分の好みの場所でかまいません。ただし、階層をあまり深くしたり、パス内に日本語名のフォルダがあったり、フォルダ名に空白が含まれる、ような場合、あとあと何かとトラブルの種になりますので、避けた方が良いと思います。

パスを通す手順は、お使いの OS によって異なります。検索などして調べてみてください。あるいは、あまり環境変数をいじりたくない、というような場合は、たとえば、こちらの記事の「パスを通す」に記したような方法もあります。

パスを通さない場合、PHP を呼び出すには、
C:\PHP\php -v
のようにします(C:\PHP に配した場合の絶対パス指定)。パスを通すと、赤字部分C:\PHP\の入力が省略できる、ということです。

たとえば、
PHPスクリプトファイル hoge.php を動作させる場合、hoge.php のあるフォルダをカレントにした後、PHPフォルダにパスが通っているならば、
php hoge.php
のようにします。
PHPフォルダにパスが通っていないと、
C:\PHP\php hoge.php
のように指定することになります。


手順2
AdobeHDS.php の入手


上記、KSV さんの github
https://github.com/K-S-V/Scripts
から入手できます。
  1. 上記、github ページを開き、ZIP と表示されているボタンをクリックすると、このリポジトリ全体のクローンの zip file がダウンロードできます。
  2. zip を解凍してどこか適当な場所に置いてください。
  3. 中に、AdobeHDS.php というのがあると思います。今回はこれを使います。
  4. AdobeHDS.php のあるフォルダをカレントにしてコマンドプロンプトウィンドウ(Dos窓)を開き、
    php AdobeHDS.php --help
    
    と入力して、Enterキーを押します。
    Adobe HDS Downloader のパラメータの使い方が表示されれば成功です。
    • PHPフォルダにパスを通していない場合は、
      C:\PHP\php AdobeHDS.php --help
      	
      みたいな指定になります。
    • AdobeHDS.php のあるフォルダがカレントではない場合は、
      C:\PHP\php AdobeHDS.phpへの相対ないし絶対パス
      	
      になります。

では早速試してみましょう。

Veevr というサイト( http://veevr.com/ 、以前書いた記事はこちら )は、今年の3月頃より、その大部分の動画が Adobe HDS による配信になっています。このサイトの HDS配信の動画を保存してみます。

用意するもの
  • veevr_f4m.js
    こちらに置いてあります。右クリックから保存してください。
    (Windows の WSH上で動作します。URLの入力ボックスの表示に Script Control を使っています。Script Control は 32bit環境のWSHでしか動作しないので、64bit環境でお使いになる場合は、32bit用の WScript から起動してください。あるいは、ご自分で使いやすいように書き換えてください。)

手順3
HDS manifest file の URL を取得
  1. Veevr( http://veevr.com/ ) へ行って、適当な動画のページURLを採ってきてください。
    • Veevr の一般の動画は、おそらく、HDSによる配信だと思います。Channel に属する動画は、RTMPプロトコルによる配信だと思います。RTMP配信の動画を採ってきてしまった場合は、別のサンプルを採ってきてください。HDS か RTMP かは、veevr_f4m.js が教えてくれます。
    • サンプルですので、比較的再生時間の短いものを選んでください。
    • これから動画の保存を行いますので、保存しても法に抵触することのない動画を選んでください。
  2. veevr_f4m.js を起動します。
    • Windows の WSH上で動作します。
    • ファイル上でダブルクリック、あるいは、
    • ファイル上で右クリック、開く、あるいは、
    • コマンドプロンプト(Dos窓)から、wscript の引数に veevr_f4m.js を指定して開く、など。
    • 64bit環境の場合は、32bit用の wscript を使ってください。
  3. インプットボックスが開くので、入力ボックスに 1 で取得したページのURLを入力します。OKをクリック。
  4. メッセージウィンドウが表示され、f4murl というのが表示されれば成功です。
    • 失敗の場合は、エラーメッセージなどが表示されるかもしれません。
    • あるいは、その動画が HDSによる配信ではない場合は、いろいろ別 の表示が出るかもしれません。これは無視してください。f4murl と間違わないようにしてください。
  5. f4murl を後で使いますので、メモしておいてください。
    • メッセージウィンドウがアクティブの状態で、Ctrl + C で、メッセージ内容がクリップボードへコピーされます。(XP以降)
    • あるいは、メッセージウィンドウ内の文字列を取得できるアプリケーションなどご利用ください。

取得した URL は、HDS のマニフェストファイルURLです(拡張子 .f4m)。興味のある方は、ファイルを保存して中を覗いてみてください。テキストファイルですので、メモ帳などのテキストエディタで開くことができます。

手順4
Adobe HDS Downloader を使って保存
  1. AdobeHDS.php のあるフォルダをカレントにして、コマンドプロンプトウィンドウ(Dos窓)を開きます。
  2. 次のように入力します。
    php AdobeHDS.php --manifest "f4murl"
    
    緑字部分、f4murlには、手順3で取得した f4murl を記します。
  3. よければ、コマンドライン文字列末尾で Enterキーを押下。
  4. フラグメントされたファイルが次から次へとダウンロードされれば成功です。
  5. フラグメントされたファイルのダウンロードがすべて終了すると、各フラグメントファイルを処理・繋ぎ合わせて、一つのファイルにしたものが作成されます。

フラグメントファイルは、AdobeHDS.php 同一フォルダ内(カレントフォルダ内)に保存されています。みてみるとわかると思いますが、たいていの場合、連番になっています。たとえば、ファイル名が
hoge_fuga_seg1_flag[連番]
だとしたら、
php AdobeHDS.php --fragments hoge_fug_seg1_flag
のように、連番部分を外して --fragments パラメータに渡してやれば、フラグメントの処理・連結作業を、別途行ってくれます(手順4では、この作業が既に終了しています)。
フラグメントファイルのURLがわかっていれば、連番展開機能のあるダウンロードマネージャなどを用いて、別途、フラグメントファイルのダウンロードを行っておき、これを AdobeHDS.php で処理する、というような使い方ができます。
手順4では、ダウンロー終了後に、自動的に、フラグメント処理・連結作業へと移行しているわけです。

フラグメントファイルが処理後も残って鬱陶しい、という場合は、--delete オプションを指定しておけば、すべての処理終了後、フラグメントファイルを削除してくれます。

複数の品質のファイルが用意されている場合は、デフォルトでは、最も高品質のものを採るようになっているようです。これを明示的に指定したい場合は、--quality オプションを用います。

--outdir オプションで、結合後のファイルの出力フォルダを指定できます。--outfile オプションで、結合後のファイルの出力ファイル名を指定できます。

--proxy オプションの指定で、proxy の指定ができます。--fproxy オプションで、fragment file のダウンロードにも proxy を使用します。

--play オプションを用いると、パイプ機能を使って、flv dump data を他のアプリケーションなどに渡すことができるそうです。データをファイルに出力するのではなく、たとえば、VLC Media Player のようなストリーム再生に対応したプレイヤーへ出力して、ストリーム再生できる、ということなのだと思います。試した感じでは、うまくいかないようでした。KSV さんによれば、MPlaye2 を用いるとうまくできるそうです。

その他、いくつかのパラメータが用意されています。--help から参照してください。

Adobe HDS Downloader は、KSV さんによって精力的に更新が続けられています。上記、記した内容が、新しいバージョンでは使えなくなっていることもあるかもしれません。あらかじめ、ご理解ください。フォーラムなどへ行って最新の情報を入手するようにしてください。

この記事の内容を実行するに際しては、すべて、ご自身の判断と責任において行うようにしてください。



(追記)

以下の記述は、技術的な興味から記すもので、ファイルの保存等を目的としたものではありません。
以下の記述は、予告なく削除することがあります。

BBC のオリンピック放送

BBC ( http://www.bbc.co.uk/ ) は、英国の公共放送局。BBC は、先のロンドンオリンピックの中継を、インターネットを通して配信していました。今でも録画を、おそらくほぼノーカットで視聴可能です。ただし、視聴は、英国国内からのみに限定されていて、国外からの視聴はできなくなってます。

米国などでは、今回のオリンピックがリアルタイムで中継されなかったために、VPN などを用いて、なんとか、BBC の中継を視聴しようとした方々もおられたそうですね。

Adobe HDS Downloader を用いて、BBC のオリンピック動画を「なんとかしてみよう」という「試み」です。

用意するもの
  • bbcOlym_f4m.js
    BBC Olympic動画の HDS マニフェストファイルURLを取得するためのスクリプトです。 こちらに置いてあります。 95-96行目あたり、_BBCOlym.useProxy を true にし、_BBCOlym.Proxy に UK proxy を記してください。いわゆる、漏れ串でも大丈夫だと思います。proxy の安全性など、ここでは触れません。proxy についてよくわからない方は、使わないでください。

手順
  1. BBC Sport - London 2012 Olympics - Full Schedule : Grid View
    http://www.bbc.co.uk/sport/olympics/2012/schedule-results
    からたどって、動画ページのリンクURLを取得してください。おそらく、英国国外からのアクセスだと、リンクそのものが表示されないと思います。このあたり、詳しく説明しません。
  2. bbcOlym_f4m.js を起動します。インプットボックスに、1で取得した URL を入力します。OKをクリック。
  3. メッセージボックスが表示されて、f4murl が表示されれば成功です。

これまでと同じように、 マニフェストファイルの取得、フラグメントファイルの取得、ともに、英国国外からのアクセスは規制されています。Adobe HDS Downloader は、Proxy の設定も可能ですが、ここでは、漏れ串は使えません。今まで使えた漏れ串が、なぜここでは使えないのか。おそらく、この部分に限って「漏れ」をチェックしている、ということなのだろうと思います。

AdobeHDS.php のコードを眺めてみます。126行目あたり、
$this->headers[]   = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
$this->headers[]   = 'Connection: Keep-Alive';
$this->headers[]   = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
このあたりに、
$this->headers[]   = 'X-Forwarded-For: 212.58.244.68';
を挿入してやります。こうしてやると、Proxy を使わなくても、アクセス可能になるようでした。
(追記、終わり)