Bon.StreamService Help
Bon.StreamServiceは、ストリームサービスを司るプログラムです。Windowsサービスとして動作し、バックグラウンドで以下の処理を実行します。
-
このプログラムが動作しているマシンのチューナー群を管理します。チューナー群は、選局出来るチャンネルの定義、
現在選局中のチャンネルの変更、CASカードのEMMプロセス(トランスポートストリームに含まれる情報をCASカードに書き込む)
の設定やアンテナのLNB電源の制御を行っています。
リモート参照によって、異なるマシンからこれらの設定を参照したり変更したりすることが出来ます。
-
チューナーが受信したMPEGトランスポートストリームを、HTTPで配信可能にします。
上記のチューナー管理と連動して、現在選局されているチャンネルのトランスポートストリームを、
クライアントからのHTTP接続要求によって送信します。
-
トランスポートストリームの録画機能を、レコーダー機能として公開します。
同一のストリームサービスが提供するチューナーのストリームは勿論、異なるマシンのストリームサービスに対しても
接続して録画する事が出来ます。
また、録画は日時と間隔を指定することで、いわゆる予約録画を実行する事も出来ます。
-
上記の機能は、全て同時に処理したり、あるいは単一で動作させることが出来ます。
チューナーが存在しない場合でも、レコーダー機能だけを動作させることも可能です。
また、レコーダー機能を使わない場合は、無効化することも出来ます。
Bon.StreamServiceは、Windows XP SP2かそれ以降のバージョンのWindowsでのみ動作します。
これは、Windows XP SP2で提供されたHTTP Server APIを使用するためです。
まず、チューナーと同じマシン上でBon.RemoteControllerを起動して、"localhost"に対して接続して下さい。
ツリーにチューナーが表示されていれば、とりあえずはOKです。
あらかじめ、
The VideoLAN Projectの
VLC Media playerをインストールしておき、
リモートコントローラのチューナーノードを右クリックして、プレイヤーを表示させてみて下さい。
このように、Bon.StreamServiceはインストール直後の状態でも動作しますが、
設定ダイアログから、プロパティの値を変更することをお勧めします。
-
StoragePaths: レコーダーの録画ファイル保存先を変更したり、複数のディスクに振り分けたい場合などに、この設定を修正して下さい。
追加したストレージIDは、録画するときに保存先として選択出来るようになります。
また、ファイル名の命名規則も変更する事が出来ます。
-
ExtraTimeSpan: レコーダーがファイルを保存するディスクが省電力設定になっている場合など、
録画開始がジャストタイミングで行われない可能性があります。
この値を大きくすると、予約時の日時から遡って予約を開始するため、ファイル先端の録画漏れを防ぐことが出来ます。
-
DefaultPlayers: 普段使用しているプレイヤーソフトウェアがトランスポートストリームをHTTP経由で扱うことが出来るのであれば、
この設定にプレイヤーへのパスを定義することが出来ます。
この設定をクライアントではなくサービスに行うことが奇妙に思えるかもしれませんが、Bon.RemoteControllerを使用し、
各マシンで同じパスにプレイヤーソフトウェアをインストールしているのであれば、設定が一元化出来るので便利です。
-
TVTestなどの、BonDriver互換クライアントから使用する場合は、BonDriver互換クライアントを使用出来ます。
このファイルはインストール先のwwwrootフォルダに一緒にコピーされているので、ストリームサービスステータスページからダウンロード出来ます。
設定ダイアログは、Bon.StreamService.exeを単独起動した場合に表示されるダイアログで、ストリームサービスに関する各種設定を行う事が出来ます。
設定ダイアログには、各種プロパティの編集が可能な
設定タブ、
ストリームサービスに関係する
イベントログの表示タブ、プログラムの情報を表示するタブが存在します。

プロパティを編集した場合、ストリームサービスを再起動する必要があります。
ツールバーに、サービスの起動・停止・再起動ボタンがあるため、このボタンを使用して下さい。
(もちろん、WindowsサービスMMCスナップインからでも操作出来ます)
プロパティの編集項目は以下の通りです。
-
AutoStart: ストリームサービスをブート時に自動で起動するかどうかを設定します(Trueで自動起動)。
デフォルトはTrueです。
-
EnableAutoFirewallManagement: Windowsファイアーウォールを自動で構成するかどうかを設定します(Trueで自動構成)。
デフォルトはFalseです。
有効にすると、ストリームサービスが起動する時点で、Windowsファイアーウォールに"Bon.StreamService (Stream)"と"Bon.StreamService (Remote)"
のエントリが自動的に追加されます。また、ストリームサービスが停止する時に削除されます。
無効にする場合、以下の解説で示されるポート番号は、あらかじめブロックしないように手動で設定しておく必要があります。
この時、例外ルールの追加は「プログラムの追加」ではなく「ポートの追加」で定義する必要があります。
これは、HTTP Server APIでHTTP受信待ちを行う場合は、Bon.StreamServiceとは異なるプロセスでの待ちとして扱われるためです。
-
FirewallScopeIsFree: Windowsファイアーウォールを自動で構成する場合に、スコープを解放するかどうかを設定します。
Trueに設定すると、全てのクライアントから要求を受け付けます。Falseに設定すると、ネットワークインターフェイスが属するIPサブネットからの要求のみを受け付けます。
デフォルトはFalseです。
-
EnableLocalWebServer: ローカルWebサーバー機能を有効化するかどうかを設定します(Trueで有効)。
デフォルトはTrueです。
-
LocalWebServerRootPath: ローカルWebサーバー機能が配信するファイル群が保存されているフォルダへのパスを設定します。
デフォルトはBon.StreamServiceのインストールフォルダ直下にある"wwwroot"フォルダです。
-
DefaultPlayers: デフォルトプレーヤーのパス群を設定します。
-
BufferSize: レコーダーが録画を行うときに、ファイルへの転送バッファのサイズを設定します(デフォルトは4MB)。
-
DatabasePath: レコーダーの予約情報を保存するデータベースファイルへのパスを設定します。
デフォルトはアプリケーション共通フォルダ内の"Recorder.db"です。
-
EnableRecorder: レコーダーを有効化するかどうかを設定します(Trueで有効化)。
-
ExtraTimeSpan: レコーダーが予約録画を行う場合に、予約時間と終了時間の前後に追加の録画間隔時間を設定出来ます(デフォルトは5秒)。
これは、録画を確実に行うための保険として使用出来ます。
-
MinimumSpaceRequirements: レコーダーが録画する場合に、ファイルを配置するディスクの空き容量をチェックする事が出来ます(デフォルトは100MB)。
ディスクの空き容量がこの値を下回っている場合は、録画を行いません。その場合、録画はAborted状態となります。
-
StoragePaths: レコーダーが録画する際に、クライアントに提示するファイルの保存先を定義します。
保存先には任意の名前を適用する事が出来ます。また、複数の保存先を定義して、クライアント側でどこに保存するのかを
選択させることが可能です。
-
RemoteBasePath: クライアントが、チューナーとレコーダーの制御を行うために接続を行う、
HTTPリモーティング参照のベースURIパスを設定します(デフォルトは"/remote")。
-
RemotePort: クライアントが、チューナーとレコーダーの制御を行うために接続を行う、
HTTPリモーティング参照のポート番号を設定します(デフォルトは26111)。
このポート番号は、StreamPortのポート番号や他のアプリケーションと競合する番号には設定出来ません。
-
StreamBasePath: クライアントが、トランスポートストリームの配信を受ける場合に接続する、
HTTP接続の要求URLベースパスを設定します(デフォルトは"/stream")。
このパスと、StreamPort, StreamNameFormatによって、"http://localhost:26110/stream/CBonBlackTuner0.ts"
のようなアドレスで接続する事が出来るようになります。
このURLのStreamBasePath以降は、次のように解釈されます。
まず、LocalWebServerRootPathで指定されたパスに、指定されたファイルが存在するかどうかを確認します。
存在しない場合、ファイル名がStreamNameFormatで指定された値と同じであれば、指定されたチューナーが配信する
トランスポートストリームを送信します。
-
StreamContentType: ストリームのHTTP要求に対して、レスポンスに含むContent-Typeを設定します(デフォルトは"video/mpeg")。
クライアントのプレーヤーによっては、デフォルトと異なるContent-Typeが都合がよい場合があります。
その場合にこのプロパティを設定して下さい。
-
StreamNameFormat: クライアントが、トランスポートストリームの配信を受ける場合に接続する、
HTTP接続の要求URLファイル名を設定します(デフォルトは"{0}{1}.ts")。
このファイル名はフォーマット文字列になっていて、"{0}"がチューナー名、"{1}"がデバイスIDに相当します。
例えば、一台目の黒Friioチューナーは、"CBonBlackTuner0.ts"となります。
-
StreamPort: クライアントが、トランスポートストリームの配信を受ける場合に接続する、
HTTP接続のポート番号を設定します(デフォルトは26110)。
このポート番号は、RemotePortのポート番号や他のアプリケーションと競合する番号には設定出来ません。
但し、IISがホストするポート番号やURLのリソース名とは共存出来ます。
例えばポート番号を80番に設定すると、IISで80番をホストしていたとしても、トランスポートストリームの配信や
ローカルWebサーバの配信が可能です(IISにも同一のリソース名によるファイルが存在する場合の動作は未定義です)。
クライアント(Bon.RemoteControllerなど)は、動画を表示するプレーヤープログラムへのパスを、この定義から参照します。
-
Nameには、プラットフォームを定義するID文字列を入力する必要があります。
これは、"「プラットフォーム名」-「アーキテクチャ名」"のようにハイフンで区切ります。
現在、プラットフォーム名には"Windows"が想定されています(Bon.RemoteControllerが使用)。
アーキテクチャ名には、32ビットWindowsの場合は"INTEL"、64ビットWindowsの場合は"AMD64"を指定します。
このID文字列は、Bon.RemoteControllerが判別しています。
従って、他のプログラムがクライアントとなる場合は、異なるID定義が要求される事になるかもしれません
(例えば、UNIX環境のプログラムは"UNIX-INTEL"など)。
アーキテクチャ名にはこの他にも"MIPS", "ARM"などの定義がありますが、これらもBon.RemoteController固有の定義です。
-
Valueには、Nameで指定したプラットフォーム固有のプレーヤーへの物理パスを指定します。
物理パスをそのまま指定すると、ドライブやフォルダ構成が異なるマシンで不都合が生じるため、
環境変数を置換することが出来ます。
デフォルトでは、"%ProgramFiles%"のような環境変数定義が含まれています。
この環境変数定義が使用出来るかどうかも、クライアントのプログラムによります(Bon.RemoteControllerはサポートしています)。
また、パスの指定方法も、クライアントによって異なる可能性があります
(例えば、UNIX環境のプログラムは"/usr/local/bin/mplayer"など)。
上記のように、ストリームサービス自体はこの設定群を解釈しないで、そのままクライアントに渡します。
従って、クライアントプログラムによっては、この情報を全く使用しない場合があります。
レコーダーは、録画したファイルをここで定義したパスに保存します。
イベントログの表示
Bon.StreamServiceが出力したイベントログを表示するタブです。
-
基本的には、WindowsイベントビューワMMCスナップインと同じですが、Bon.StreamServiceが出力したログのみが表示されます。
表示のカスタマイズ機能はない為、複雑な用途の場合はMMCスナップインを使用して下さい。
-
ログの項目をダブルクリックすると、そのログの詳細を表示します。
トランスポートストリーム配信機能は、ストリームサービスの基本的な機能です。
クライアントからのHTTP要求に応じて、トランスポートストリームデータを配信します。
ローカルWebサーバー機能は、簡易的なWebサーバー機能です。
ストリームサービスに接続する、BonDriver互換クライアントを使用出来ます。
インストール先のwwwrootフォルダ配下に、BonDriver_StreamService.dllとBonDriver_StreamService.iniファイルが存在します。
このファイルを、BonDriverを使用するアプリケーション(TVTestなど)配下にコピーし、INIファイルの内容を編集して下さい。
BonDriver互換クライアントの動作には、.NET Framework 2.0ランタイムと、Visual C++ 2005 SP1 ランタイムが必要です。
また、BonDriverは今のところ64ビットインターフェイスが規定されていません。
そのため、インストールされるBonDriver_StreamService.dllは、常に32ビットバージョンです。
このクライアントを動作させる場合は、ストリームサービスのインストーラでインストールを行っておく必要があります。
インストールを行うと、Bon.Interfaces.dllがグローバルアセンブリキャッシュにインストールされます。
BonDriver互換クライアントはこのDLLを使用します。
もし、何もインストールしていない環境で動かす場合は、Bon.Interfaces.dllも一緒のフォルダにコピーして下さい。
-
BonDriverのAPIインターフェイスは、マルチチューナーインスタンスに対応していません。
そのため、チューナーを区別するには、チューナー毎に異なるファイル名のDLLを用意する必要があります。
BonDriver_StreamService.dllの場合は、このファイルをコピーして適当なファイル名にリネームして使用します。
例えば、BonDriver_A.dll、BonDriver_B.dll、BonDriver_C.dllなどです。
拡張子に".dll"を付ければ、基本的にどのようなファイル名でもかまいませんが、BonDriverを使用するアプリケーションに
よっては、先頭が"BonDriver_"となっている事を要求する可能性があります。
DLLファイルは上記のようにファイル名を変更して使用しますが、INIファイル名は常にBonDriver_StreamService.iniです。
-
INIファイルは、BonDriver互換クライアントが、どのストリームサービスのチューナーに接続するのかを記述する定義ファイルです。
このファイルには、複数のDLLファイルの設定を記述する事が出来ます。
サンプルのINIファイルには、記述の仕方が書かれているので参考にして下さい。
-
INIファイルのセクション名(角括弧で囲まれた名前)は、DLLのファイル名(拡張子を除く)で引き当てられます。
例えば、BonDriver_A.dllの設定は、[BonDriver_A]セクションから読み取られます。
以下に設定する値名を示します。
-
TunerName: ストリームサービスのチューナーを識別するチューナー名(チューナークラス名)です。
チューナークラス名がわからない場合は、一度、リモートコントローラで接続して確かめると良いでしょう。
-
DeviceID: 同じチューナー種別の異なるチューナーインスタンスを識別するIDです。
これもリモートコントローラで確かめる事が出来ます。
-
RemoteUrl: ストリームサービスのリモートURLです(ストリームURLではないので注意)。
RemoteBasePath・RemotePortプロパティから決定されるURLを指定します。
-
以上の情報をINIファイルに記述したら、BonDriver対応のアプリケーションを起動します。
例えば、TVTestの場合は、"tvtest.exe /nd /d BonDriver_A.dll"のようにコマンドラインを指定します。
-
BonDriver互換クライアントは、ストリームサービスの全ての機能を制御出来るだけのインターフェイスを持っていません。
そのため、
・チューナーロックが出来ない
・サービスIDを指定してストリーミング出来ない
・レコーダー機能にアクセス出来ない
等の制限があります。
互換性について:このBonDriver互換クライアントは、IBonDriver3インターフェイスまで実装してありますが、
問題が発生する可能性があります。
・ストリームデータが、MPEG-TSの境界を無視しています。一応188バイトの倍数で返すようにしていますが、ストリームサービスから
送られてくるデータにはそのような境界がないため、何らかのタイミングで境界を跨ぐようになるかもしれません。
クライアントプログラムは、ストリームサービスとリモート参照で接続し、ストリームサービスを操作することが出来ます。
リモート参照を使用するには、以下の手順を実施して下さい。
-
クライアントマシンには、.NET Framework 2.0かそれ以上のランタイムがインストールされている必要があります。
Bon.RemoteControllerが動作するのであれば、既にインストール済みです。
-
Bon.StreamServiceのインストーラによって、Bon.Interfaces.dllアセンブリがインストールされています。
このアセンブリを、開発中のプロジェクトの参照設定に追加して下さい。
開発中のマシンにインストールされていれば、参照設定追加ダイアログの「.NET」タブに"Bon.Interfaces"が表示されます。
-
このアセンブリが公開しているインターフェイスとクラスは、"Bon"名前空間と"Bon.Remoting"名前空間に属します。
必要であれば、using文を追加して下さい(主に使用するのはBon.Remoting名前空間です。Bon名前空間に存在する型定義は、
チューナーをリモートではなく直接操作するために使用します)。
-
Bon.Remoting.RemoteStreamServiceクラスを生成します。
その後、RemoteStreamService.GetTunerCollection()を呼び出して、チューナーコレクションにアクセス出来るようにします。
引数には、ストリームサービスのリモート参照ベースURLを指定します。
URLは、ストリームサービスのRemoteBaseUrl, RemotePortプロパティの設定によって変わります。
デフォルト設定では、"http://localhost:26111/remote/"のように指定します。
引数は、IUrlインターフェイスですが、これはBon.Urlクラスを使用して生成出来ます。
COMの場合は、UrlBuilderクラスを使用してIUrlインターフェイスのインスタンスを生成して下さい。
-
GetTunerCollection()を呼び出した時点では、まだストリームサービスに接続していません。
戻り値として返されたIRemoteTunerCollectionを使用した時点で、通信が発生します。
具体的には、以下のようにしてチューナーを列挙し、操作を行います。
IRemoteTunerCollection tunerCollection = service.GetTunerCollection();
foreach (IRemoteTuner tuner in tunerCollection)
{
// tunerへの呼び出し
}
-
チューナーのストリームURLを取得するには、IRemoteTuner.GetTunerStatus()を呼び出してIRemoteTunerStatusインターフェイスのインスタンスを取得します。
このインスタンスのStreamUrlsプロパティに、アクセスすべきURL群が格納されています。
通常、このプロパティは単一のURLを含んでいますが、ストリームサービスが動作しているマシンがIPマルチホーム構成の場合は、
このプロパティに複数のURLが格納されます。
IRemoteTunerStatusインターフェイスには、チューナーの状態が格納されています。これらの値を画面にステータスとして表示すると良いでしょう。
-
後は、このURLに対してプレーヤーを接続するだけです。VLCプレーヤーのような外部プログラムを起動する場合は、
プログラムの引数にこのURLを指定すれば良いでしょう。内臓プレーヤーを構築する場合は、Bon.Remoting.StreamClientクラスを使用するか、
自力でURLにHTTP接続する必要があります。
外部プレーヤーを起動する単純な例を示します。
IRemoteTunerStatus status = tuner.GetTunerStatus();
Process.Start(@"C:\Program Files\VideoLan\VLC\vlc.exe", status.StreamUrls[0]);
外部プレーヤーのパスをストリームサービスから取得する(DefaultPlayersプロパティ)場合は、
IRemoteTuner.GetDefaultPlayerPath()を使用します。
その場合、プラットフォーム文字列を生成するのに、Bon.Architectureクラスを使用出来ます。
Bon.Remoting.StreamClientクラスは、Streamクラスを継承したストリームサービス接続用のクラスです。
Connectメソッドを呼び出す事で、ストリームサービスからのデータをStream.Readメソッドで読み出す事が出来ます
(Stream.BeginReadメソッドによる非同期読み取りも可能です)。
また、このクラスはCOMのIStreamインターフェイスを実装しています。従って、他のCOMインスタンスにデータをそのまま供給する事が出来ます。
-
IRemoteTunerインターフェイスには、チューナーの操作を実行する様々なメソッドが用意されています。
これを使用してチューナーのコントロールを行います。
一つのチューナーに対して、チューナークライアントは複数接続の可能性があります。
チューナークライアントを特定する必要がある操作(サービスIDの変更など)は、チューナークライアントの
エンドポイントIPアドレス(IStreamEndPointインターフェイス)が必要です。
現在接続しているチューナークライアント群のエンドポイントIPアドレスは、IRemoteTunerStatusクラスのClientEndPoints
プロパティから入手する事が出来ます。
勿論、内臓プレーヤーを自力で構築している場合は、自分でエンドポイントIPアドレスがわかっているはずなので、
そのまま使用すれば良いでしょう。
-
RemoteStreamServiceクラスは、レコーダーへの参照も公開します。RemoteStreamService.GetRecorder()を呼び出して、
レコーダー参照を取得します。
レコーダーに登録されている予約情報は、それぞれがIRegisteredProgramクラスのインスタンスです。
RemoteStreamService.RegisteredIDプロパティのGUIDは、予約情報毎に一意のIDとして割り当てられています。
予約情報を特定する場合は、このIDを使用します。
レコーダーの予約情報を列挙する場合は、IRemoteRecorderをそのまま列挙して下さい。
IRemoteRecorder recorder = service.GetRecorder();
foreach (IRegisteredProgram program in recorder)
{
ListViewItem lvi = new ListViewItem(program.RecordingStatus.ToString());
lvi.SubItems.Add(program.RegisteredID.ToString());
lvi.SubItems.Add(program.StartTime.ToString("yyyy/MM/dd HH:mm:ss"));
listView.Items.Add(lvi);
}
-
レコーダーの保存先となるストレージIDは、IRemoteRecorder.StorageIDsプロパティから入手します。
その後、IRemoteRecorder.RegisterProgram()を呼び出す際に、引数で指定します。
特定のストレージIDに対応するディスクの空き領域は、IRemoteRecorder.GetCurrentSpaces()で取得します。
以下のようにしてストレージを列挙出来ます。
foreach (string storageID in recorder.StorageIDs)
{
ListViewItem lvi = new ListViewItem(storageID);
lvi.SubItems.Add(recorder.GetCurrentSpaces(storageID));
listView.Items.Add(lvi);
}
-
Bon.Interfacesアセンブリには、iEPGパーサが含まれています。
Bon.IEPG.IEPGParserクラスのインスタンスを生成し、iEPGディスクリプタを含むストリーム(System.IO.Stream又はCOM IStreamインターフェイス)を
IEPGParser.Parseメソッドに与えてパースします。
その後、IEPGParserを列挙すると、IIEPGItemインターフェイスのインスタンスが取得できるため、
ここからiEPGディスクリプタの内容を取得することが出来ます。
-
インターフェイスのより詳細な内容は、BonSDKのBon.Interfacesプロジェクトに含まれるソースコードを参照して下さい。
少々煩雑ですが、Bon.RemoteControllerのソースコードを参照すると、制御方法の細部を確認することが出来ます。
COPYING