PlayStation®TV ビデオ再生コントロールプロトコル対応 クライアントアプリケーション作成 ガイドライン Ver.1.10 © 2014 Sony Computer Entertainment Inc. All Rights Reserved. SCE Confidential 商標 “PlayStation”は、株式会社ソニー・コンピュータエンタテインメントの登録商標です。 Microsoft、Windows は米国 Microsoft Corporation の米国およびその他の国における登録商標または商標です。 Windows XP の正式名称は、Microsoft(R) Windows(R) XP Operating System です。 Windows 7 の正式名称は、Microsoft(R) Windows(R)7 Operating System です。 その他、本書に記載の製品名は、各社の商標または登録商標です。 使用条件 本ガイドラインに関する著作権を含む一切の権利は、当社が管理または保有しています。私的使用その他法律によっ て明示的に認められる範囲を超えて使用(複製、改変、ネットワーク上へのアップロード、掲示、送信、頒布、ライ センス、販売、出版などを含む)することは、事前に当社の文書による許諾がない限り、禁止します。 当社および当社の関連会社は、本ガイドラインの内容が正確であるかどうか、有用なものであるかどうか、確実なも のであるかどうか、皆様の使用目的に合うものであるかどうか、第三者の権利を侵害するものでないかどうか、安全 なものであるかどうかなどにつき、一切保証するものではありません。当社および当社の関連会社は、法令により免 責が認められない場合を除いて、皆様が本ガイドラインを使用されたこと、もしくはご使用になれなかったことに よって生じるいかなる損害について責任を負うものではなく、また、本ガイドラインの変更によって生じるいかなる 損害についても責任を負うものではありません。 本ドキュメントは、株式会社ソニー・コンピュータエンタテインメントの利用規約の制約を受けます。 詳しくは、http://www.playstation.com/devinfo/pstv/terms_jp.htmlをご覧ください。 ©SCEI -2- 目次 1 2 概要 .................................................................... 4 ビデオ再生コントロールプロトコルとは ..................................... 5 開発環境 ...................................................................................................................................................................... 5 ビデオストリーミングプレーヤー起動 ................................................................................................................... 6 3 再生コントロール ........................................................ 7 ソケット接続 .............................................................................................................................................................. 7 送信コマンド .............................................................................................................................................................. 8 再生 ............................................................................................................................................................. 8 一時停止 ..................................................................................................................................................... 8 シーク ......................................................................................................................................................... 9 受信コマンド .............................................................................................................................................................10 イベント受信............................................................................................................................................. 11 再生対象情報............................................................................................................................................. 11 再生進捗 ....................................................................................................................................................12 状態 ............................................................................................................................................................13 4 実装例:ローカルに保存された MP4 ファイルを再生する ...................... 14 基本構成 .....................................................................................................................................................................14 ©SCEI -3- 1 概要 “PS TV ビデオ再生コントロールプロトコル”を組み込んだアプリケーションから PS TV にビデオが転送、または ビデオの URL から直接参照され、PS TV に標準でインストールされている“ビデオストリーミングプレイヤー”ア プリケーションで表示されます。ビデオデータを PS TV にコピーする必要はありません。 このように、スマートフォンやタブレット、パソコンなどからは PS TV の“ビデオストリーミングプレイヤー”ア プリケーションをコントロールするための“PS TV ビデオ再生コントロールプロトコル”を公開します。 本書は、スマートフォンやタブレット、パソコンなどのアプリケーション開発者を対象に、“PlayStation®TV(PS TV) アプリケーション起動プロトコル”を利用した PS TV の“ビデオストリーミング”アプリケーションのコント ロール方法について解説します。 “PlayStation®TV アプリケーション起動プロトコル対応クライアントアプリケーション作成ガイドライン”と合 わせてお読みください。 ©SCEI -4- 2 ビデオ再生コントロールプロトコルとは ビデオ再生コントロールプロトコルとは、PS TV システムソフトウェアのビデオストリーミングプレーヤーにビデ オを転送し、一時停止やシークといった再生コントロールを、ソケット通信を用いて実現するためのプロトコルで す。 なお、本プロトコルを利用して、PS TV のビデオストリーミングプレーヤーで再生できるビデオファイル 12は以下 になります。 •MP4(MPEG-4) (システムソフトウェア 2.10 以降) •HTTP Live Streaming (Internet-Draft) Protocol Version 03(システムソフトウェア 3.00 以降) •H.264/MPEG-4 AVC Baseline/Main/High Profile Level3.1 最大 720p •AAC 開発環境 本プロトコルを利用するアプリケーションの実行環境は TCP/IP、UDP/IP をサポートする機器であれば、特に制限 はありません。開発に必要なプログラム言語も同様に、TCP/IP、UDP/IP をサポートしている必要があります。本ド キュメントでは、主に通信手順と送受信するデータを使用する基本的な API 操作の例を、 .NET Framework の C# で記述されたサンプルコードを使用して解説します。異なる開発環境で開発を行う場合は置き換えて読んでくださ い。 1 データの種類によっては、再生できなかったりすることがあります。 2 インターネットなどで配信されている動画ファイルには、再生方法が制限されているものがあります。詳しくは、ファイルの配 信元にお問い合わせください。 ©SCEI -5- ビデオストリーミングプレーヤー起動 ビデオストリーミングプレーヤーの起動に必要な URI は、“アプリケーション起動プロトコルの機器発見プロトコ ル”機器発見プロトコル [Device description response]”から得られます。[Device description response]の XML をパースし、/teleport/apps/app/uri/の値が”videostreaming:”となる項があることを確認してください。 この起動 URI に“play?”の文字列と必要なパラメータを追加します。以下の書式中の parameter は下記パラメー タのいずれか、value には必要な値を設定してください。パラメータを複数設定する場合は、“parameter=value” を“&”で連結してください。 URI 書式(XML コード変換前) videostreaming:play?parameter=’value’¶meter=’value’ URI 書式(XML コード変換後) videostreaming:play?parameter='value'&parameter='value' パラメータ url pos 説明 再生するビデオの URL [オプション] ビデオの初期再生位置。ミリ秒単位で指定してください。 アプリケーション起動プロトコルの“Applicaion 起動要求”で リクエストする XML データ/teleport/app/uri に “videostreaming:play?parameter='value'&parameter='value'”と 設定してください。 XML<?xml version=“1.0” encoding=“UTF-8”?> <teleport> <app> <uri> videostreaming:play?parameter='value'&parameter='value'</uri> </app> </teleport> “Application 起動要求レスポンス"から、フォトアプリケーションの起動に必要な情報が得られます。フォトア プリケーションの起動で接続する IP アドレスは、アプリケーション起動プロトコル対応サーバーの IP アドレスを 利用します。また、その際に使用するポート番号は"Application 起動要求レスポンス"によって取得した情報から 確認することができます。詳細は“PlayStation®TV アプリケーション起動プロトコル対応クライアントアプリ ケーション作成ガイドライン”をご覧ください。 ©SCEI -6- 3 再生コントロール PS TV のビデオコントロールアプリケーションを起動し、コントロールするための説明をします。 ソケット接続 “Application 起動要求レスポンス”によって取得したポート番号で PS TV のビデオコントロールアプリケーショ ンにソケット接続します。 送受信ソケットはモジュール内のスコープで生成します System.Net.Sockets.TcpClient tcpClientSocket = null; ビデオストリーミングプレーヤーアプリケーションとの接続を行う処理(予めIpAddress, Portを定義)は、下記 のように実装します。 try { tcpClientSocket = new System.Net.Sockets.TcpClient(IpAddress, Port); } catch (System.Net.Sockets.SocketException ex) { // エラー情報取得 } ビデオストリーミングプレーヤーアプリケーションとの接続を切る場合は、下記のように実装します。 try { if (tcpClientSocket != null) tcpClientSocket.Close(); } catch (System.Net.Sockets.SocketException ex) { MessageBox.Show(ex.Message); } ©SCEI -7- 送信コマンド 送信コマンドには、一時停止、再生、シークの3種類があります。 コマンドの基本構文は、 1 行目: コマンド番号(4 桁の 10 進 ASCII 文字列) 2 行目: 後続のサイズ(10 桁の 10 進 ASCII 文字列) 3 行目以降: コマンド独自定義 最終行: FF FF (バイナリ 2 バイト) 各行の終端である改行コードは全て LF(16 進数で 0a) です。 再生 コード:1001 内容は ASCII コードで格納するため 16 進数で記述してください。30 は文字の “0” 、31 は文字の “1” 0a は LF で区切りを表していて、終端は ff になります。 31 30 30 31 0a 30 30 30 30 30 30 30 30 30 32 0a ff ff テキスト表記 例 1001[LF] 0000000002 [LF] [FF][FF] 一時停止 コード:1002 内容は ASCII コードで格納するため 16 進数で記述してください。30 は文字の “0” 、31 は文字の “1” 0a は LF で区切りを表していて、終端は ff になります。 31 30 30 0a 30 30 30 ff 30 32 0a 30 30 30 30 30 32 ff テキスト表記 例 1002[LF] 0000000002 [LF] [FF][FF] ©SCEI -8- シーク コード:1004 内容は ASCII コードで格納するため 16 進数で記述してください。30 は文字の “0” 、31 は文字の “1” 0a は LF で区切りを表していて、終端は ff になります。 31 30 30 0a 30 30 30 30 30 30 30 30 30 30 30 0a 30 0a 34 30 31 30 30 ff テキスト表記 0a 30 34 30 30 ff 30:絶対値 31:前方相対 32:後方相対 ミリ秒単位での 10 進 ASCII 文字列 例 1004[LF] 0000000014 [LF] 0[LF] 000000000[LF] [FF][FF] シークを行う例 string seektime = "00000000" + [Seek時間]; seektime = seektime.Substring(seektime.Length - 9, 9); // 0埋め右側から固定サイズ9文字取 得 string sComd = "1004¥n0000000014¥n0¥n" + seektime + "¥n"; byte[] postDataBytes = new byte[sComd.Length + 2]; byte[] cmdDataBytes = System.Text.Encoding.ASCII.GetBytes(sComd); Buffer.BlockCopy(cmdDataBytes, 0, postDataBytes, 0, Math.Min(cmdDataBytes.Length, postDataBytes.Length) * 1); postDataBytes[sComd.Length] = 0xff; postDataBytes[sComd.Length + 1] = 0xff; System.Net.Sockets.NetworkStream ns = tcpClientSocket.GetStream(); ns.Write(postDataBytes, 0, postDataBytes.Length); 本来は可変長とすることもできますが実用範囲として 9 桁あれば十分なのでここでは 9 桁固定にしています。なお、 長さチェックと ASCII 文字チェックは必要に応じて行ってください。 ©SCEI -9- 受信コマンド 受信コマンドには、状態、イベント、再生対象情報、再生進捗があります。 受信コマンドの形式は送信コマンドと同じです。 受信コマンドの処理の例は下記を参照してください。 if (tcpClientSocket.Available > 0) { NetworkStream stream = tcpClientSocket.GetStream(); Byte[] data = new Byte[tcpClientSocket.Available * 2]; String responseData = String.Empty; Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); responseData = responseData.Replace("¥n", "¥r¥n"); //text を Line 単位に切り出す System.IO.StringReader rs = new System.IO.StringReader(responseData); //ストリームの末端まで繰り返す while (rs.Peek() > -1) { string rd_data = rs.ReadLine(); [行単位の処理をする (受信コマンドごとの解析処理)] ソケットにデータがあるときにバイトデータで取得します。改行単位で取得したいので LF を CRLF に置き換え、行単 位に取得して解析します。 ©SCEI - 10 - イベント受信 コード:1001 内容は ASCII コードで格納するため 16 進数で記述してください。30 は文字の “0” 、31 は文字の “1” 0a は LF で区切りを表していて、終端は ff になります。 31 30 30 0a 30 30 30 xx 30 30 30 0a 31 30 30 ff テキスト表記 0a 30 34 ff 30: シーク完了 例 1001[LF] 0000000004 [LF] x[LF] [FF][FF] 再生対象情報 コード:1002 内容は ASCII コードで格納するため 16 進数で記述してください。30 は文字の “0” 、31 は文字の “1” 0a は LF で区切りを表していて、終端は ff になります。 対象となるビデオの全長を返します。可変なので 0a(LF)を区切りとしてデータ長までを検索するようにします。 31 30 30 0a xx xx 0a 30 30 30 xx xx xx ff 30 30 30 xx xx xx ff テキスト表記 32 30 31 xx xx xx 0a 30 37 xx 0a xx バイト単位のビデオ サイズ(10 進 ASCII 文字列) ミリ秒単位のビデオ 長(10 進 ASCII 文字 列) 例 1002[LF] 0000000017 [LF] xxxxxxxx[LF] xxxxx[LF] [FF][FF] ©SCEI - 11 - 再生進捗 コード:1003 内容は ASCII コードで格納するため 16 進数で記述してください。30 は文字の “0” 、31 は文字の “1” 0a は LF で区切りを表していて、終端は ff になります。 動画再生の現在の位置を返します。プログレスバー表示などに使用します。 31 30 30 0a xx xx xx xx xx 30 30 30 xx xx xx xx xx xx 30 30 30 xx xx xx xx 0a 0a テキスト表記 33 30 32 xx 0a xx xx xx ff 0a 30 39 xx xx 0a xx xx ff バイト単位のダウンロード済みサイズ(10 進 ASCII 文字列 ミリ秒単位のダウンロード済みビデオ長(10 進 ASCII 文字列) bps 単位のダウンロードスループット(10 進 ASCII 文字列) ミリ秒単位の再生位置(10 進 ASCII 文字列) 例 1003[LF] 0000000029 [LF] xxxxxxx[LF] xxxxx[LF] xxxxxxx[LF] xxxx[LF] [FF][FF] ©SCEI - 12 - 状態 コード:1000 内容は ASCII コードで格納するため 16 進数で記述してください。30 は文字の “0” 、31 は文字の “1” 0a は LF で区切りを表していて、終端は ff になります。 再生中のステータスを返します。 31 30 30 xx 30 30 30 0a 30 30 30 ff 30 0a 30 30 30 34 ff 0: 停止中 1: 準備中 2: 再生中 3: 一時停止中 4: ビデオ終端 テキスト表記 例 1000[LF] 0000000004 [LF] xxxxxxxx[LF] x[LF] [FF][FF] ©SCEI - 13 - 4 実装例:ローカルに保存された MP4 ファイルを再生する アプリケーション起動プロトコルで、ストリーミングプレーヤーを起動してビデオ再生を行う場合、再生対象の MP4 ファイルの URI 指定をします。アプリケーション起動プロトコル対応サーバーは、指定された URI のファイルを直接 再生します。代理処理のように動作しますが、この場合 MP4 ファイルが保存されているストリーミングサーバー(こ こでのサーバーはプログレッシブダウンロード再生)を指定する必要があるため、ローカルディスクにある MP4 ファ イルを再生させることができません。 そこで本書ではローカルディスクや NAS にある MP4 ファイルを再生する例を記載します。 基本構成 パソコン内のローカルディスク(HDD、SD カード、USB メモリ等)に保存してあるストリーミングプレーヤーで対応 する MP4 ファイルや、NAS に保存してあるストリーミングプレーヤーで対応する MP4 ファイルを、アプリケーション 起動プロトコル対応サーバーのビデオストリーミンプレーヤーで再生させることが可能です。 そのために機能を限定した HTTP ストリーミングサーバーを実装します。小規模でかつビデオストリーミングプレー ヤーで再生させることができることに限定した使用を想定したサーバーを用意します。 本章では、.NET による実装を想定して解説します。なお Windows®7 以降での動作を想定しています。(Windows®XP などでの動作は対象外です) アプリケーション起動プロトコル対応サーバーからの HTTP リクエストの通常の動画再生と Range リクエストによる 部分再生に実装対応させます。 簡単な方法を説明するために NAS はネットワークドライブ割り得てしてある状態を想定します。また、USB メモリも SD カードなどもドライブ割り当て状態を想定しています。 ここでの転送するデータ対象は、MP4 ファイルで、それをブロックリードしたデータを転送する仕組みなので、実際 はファイルである必要もなく、メモリ上のデータでも転送可能です。 最も簡単に実装するには、通常のシングルスレッドでの実装を行い、それに対してマルチスレッド化をしま す。 .NET Framework には、簡単にスレッド処理を行わせる機構(backgroundWorker コントロール)があります。 ©SCEI - 14 - 実装例 backgroundWorker コントロールを用意しておきます。 イベントを作成します。デフォルトでは下記のようになります。 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) この中に記述したコードはスレッド動作します。このためここで Loop 処理やウェイト処理動作を行っても、画面や 応答が固まるようなことはありません。 BackgroundWorker worker = sender as BackgroundWorker; さらに、処理を行う上で必要な情報として HTTP サーバーとして認識するためのルートになる場所を定義します。 String rootDir = “C:¥¥wwwroot¥”; Prefix を指定します。 String prefix = “http://+:34567“; 上記例ではポート番号 34567 でアクセスが来た時に処理を行えることを指します。 HttpListener クラスを使用して実装します。 HttpListener hl = new HttpListener(); 次に下記のようにして接続開始の準備をします。 Prefix をセットして hl.Prefixes.Add(prefix); 開始します hl.Start(); Windows®7 以降では下記のように Windows®コマンドプロンプトで設定する必要があります。 コマンドラインで netsh http add urlacl url=http://+:34567/ user=Everyone を実行 (URL 名前空間の追加)し、また Firewall の許可が必要になる場合があります。 ©SCEI - 15 - Loop 処理では下記の様に実行します。 それぞれにアクセスするために下記のようにします。 コンテンツ読み書き準備 HttpListenerContext context = hl.GetContext(); リクエストヘッダーを定義準備 HttpListenerRequest req = context.Request; レスポンスヘッダーの読み出し準備 HttpListenerResponse res = context.Response; リクエストヘッダーすべてにアクセスするには下記のように foreach ですべて収集させます。 foreach (string key in req.Headers.AllKeys) KeyValue を取得するため、取得 Loop 上で下記のように取り出します。 string[] values = req.Headers.GetValues(key); if (key == "Range") であり、同時に if (values[0].Substring(0, 6) == "bytes=") 上記条件が満たされるときに部分リードとしてデータを処理させます。 定義される形態は Range: bytes=10-308 10Byte 目から 308 バイト目までを転送対象とする。Seek10 から Read(308byte) Range: bytes=-450 先頭から 450Byte 目までを転送対象とする。Seek0 から Read(450byte) Range: bytes=700- 700Byte 目から最後までを転送対象とする。Seek700 からファイル最後尾まで Read ©SCEI - 16 - なお複数のバイトレンジには対応させません。If ヘッダーにも非対応とします。 適当な長さ検査を行い超えた場合エラーを返すなどしてください。取りうる桁数の文字長から限度を決めるなどして ください。また、予定している文字以外がある場合もエラーとするなどしてください。 ヘッダーからこれらの3ケースを処理できるように情報を切り出します。 GET 以外に HEAD リクエストにも対応する必要があるため、リクエストを判定する必要があります。 if (req.HttpMethod == "GET") そして if (req.HttpMethod == "HEAD") の、ようにします。 マウントした媒体の場合、USB メモリでも、NAS でも、SD カードでも、HDD のファイルでも下記のように読み込み System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read); byte[] content = new byte[0x10000]; res.ContentType = "video/mp4"; res.ContentLength64 = [一度に転送するByte数]; res.AddHeader("Content-Range",[ Content-Rangeで返す形式 Seek させて転送準備を行います。 start-end/全体のサイズ]); res.ContentType = "video/mp4"; res.ContentLength64 = fs.Length; long dataSize = fs.Length; fs.Seek(stpos, SeekOrigin.Begin); 読み出すのは下記のようにして int readSize = fs.Read(content, 0, content.Length); 転送は res.OutputStream.Write(content, 0, readSize); Read 出来る間、これを繰り返し転送します。 上記は GET の場合であるので、HEAD リクエストの場合はサイズ 0 で書き込むようにします。 byte[] content = new byte[] { 0x00 }; res.OutputStream.Write(content, 0, block_len); スレッドの開始は下記のようにします。 backgroundWorker1.RunWorkerAsync(); ©SCEI - 17 - スレッドの終了は下記のようにします。 backgroundWorker1.Dispose(); これでこのソースを実行しているパソコン自身の IP アドレスを URL に指定して接続すれば、MP4 ファイルを再生する ことができます。 ©SCEI - 18 -
© Copyright 2024 Paperzz