【要望】ストリーミング配信情報の提供
NetworkTVモードを使用してストリーム配信(TCP)による視聴プログラムの作成を試みています。 クライアントからEpgTimerSrvへ制御コマンド(CtrlCmd)を送ることでストリーム配信要求して視聴するものです。 現在、ストリーム配信時にポート番号を得るところで躓いております。
NetworkTVモードで開いたり(CMD2_EPG_SRV_NWTV_SET_CH)、 ストリーム配信ファイルを開いた際(CMD2_EPG_SRV_NWPLAY_OPEN)に使用されるポート番号を得る術がありません。
SrvPipeを使用すればサーバー側にプログラムを配置すること可能だと思われます。 ただTCPを使用するとなれば、Windows仕様のEDCBにおいてはサーバー側にすら全く手掛りがありません。
例えばですが、配信中のストリーム情報一覧を出力するような制御コマンドの実装等は可能でしょうか。 一度ご検討頂きたく願います。
視聴プログラムはライブ再生(放送されているものの視聴)でしょうか? それとも録画の再生でしょうか?
ライブ再生についてはCMD2_EPG_SRV_NWTV_SET_CHではなく拡張されたCMD2_EPG_SRV_NWTV_ID_SET_CH
https://github.com/xtne6f/edcb.py/blob/master/edcb.py#L689
を呼ぶことでチューナーのプロセスIDを取得できるので、これをCMD2_EPG_SRV_RELAY_VIEW_STREAM
https://github.com/xtne6f/edcb.py/blob/master/edcb.py#L936
に渡してTCPストリームを取得できます。
起動中のチューナーの一覧はCMD2_EPG_SRV_ENUM_TUNER_PROCESS
https://github.com/xtne6f/edcb.py/blob/master/edcb.py#L819
で取得できるので、これを使って接続したいTCPストリームを選択するようなこともできると思います。
例はPythonで実装した制御コマンドですが、CMD2_EPG_SRV_RELAY_VIEW_STREAMはC#のほうにはまだ追加していないので必要なら追加します。
ライブ再生については以上でおそらく必要なコマンドは備わっていますが、いっぽう録画の再生については今のところCMD2_EPG_SRV_NWPLAY_OPEN以外に使えるコマンドがないです。
使用するTCPポート番号自体はサーバーが把握しているのでたとえば「ポート番号を得るコマンド」を新設すれば一応要望は叶うはずですが、CMD2_EPG_SRV_NWPLAY_OPEN自体がたとえば等速再生しかできない(たとえば早回しできない)など細かい難点があるので、もし録画の再生を実現したいならEDCB側にわりと手を加える必要がでてきます。
具体的に実現したいことなど説明いただければ拡張を検討します。
早々にご回答頂きありがとう御座います。
非_WIN32版を用いて、CMD2_EPG_SRV_RELAY_VIEW_STREAMを試してみました。 簡単なプログラムを用意して送信動作を確認したのですが、開始から4〜6回程度の送信後にCTCPServer::ResponseThread内のsend関数からの戻り値が-1になり意図せず送信終了します。 送信開始から終了まで、send関数をコールする直前のバッファ上位は0x71から始まるもので、送信バイト数は概ね24064(188*128)でした。
試した処理の流れとしては2パターン 0.EpgDataCap_Bonのネットワーク設定としてSrvPipe、TCPを設定. 1.CMD2_EPG_SRV_NWTV_ID_SET_CHでNetworkTVモード開始. 2.CMD2_EPG_SRV_RELAY_VIEW_STREAMでprocessIDでTCPに流す. 3.クライアント側の受信処理.
0.EpgDataCap_Bonのネットワーク設定としてSrvPipeを設定. 1.CMD2_EPG_SRV_NWTV_ID_SET_CHでNetworkTVモード開始. 2.CMD2_EPG_SRV_NWPLAY_OPENでSendTSTCP_0_processID_0.fifo(TCPのストリーム配信起動のため適当なファイル)オープン. 3.CMD2_EPG_SRV_RELAY_VIEW_STREAMでprocessIDでTCPに流す. 4.クライアント側の受信処理.
そもそも、CMD2_EPG_SRV_RELAY_VIEW_STREAMの扱い方を間違えているかもしれません。
また、別の質問なのですが、 CMD2_EPG_SRV_NWPLAY_OPENでpipeファイルを直接開いて、CMD2_EPG_SRV_NWPLAY_PLAYでストリーム配信は出来ないのでしょうか? 実際に試したところ、CMD2_EPG_SRV_NWPLAY_OPENで開く(存在の確認)はできるのですが、CMD2_EPG_SRV_NWPLAY_PLAYでストリーム配信がされませんでした。 この方法が可能なら他のクライアンの状況(NetworkTVモードだと全てのクラアイントに配信)に影響されず、任意のクライアントにストリーム配信できるのでポート番号も管理できそうです。 セキュリティもアクセスの可否をCompatFlags等で切り替えれば保たれそうに思います。
以上、ご指摘できる点があればご教示を頂けますでしょうか。
トランスポートストリームなのでたぶんバッファ上位は0x47(10進数で71)だと思います。EpgDataCap_BonからFIFOファイルを介してEpgTimerSrvが読みとる単位が24064バイト以下なので、EpgTimerSrvがクライアントに送信する単位も概ね24064になります。 https://github.com/xtne6f/EDCB/blob/work-plus-s-250920/EpgTimerSrv/EpgTimerSrv/EpgTimerSrvMain.cpp#L222
CMD2_EPG_SRV_RELAY_VIEW_STREAMを使う方式ではEpgDataCap_Bonのネットワーク設定はSrvPipeだけで十分です(TCPのほうは主にBonDriver_TCP.dllとの接続用)。send関数の数回コールで失敗するなら、たぶんクライアント側の受信処理が上手くいってないと思います。CMD2_EPG_SRV_RELAY_VIEW_STREAMを呼ぶとその接続に使用したTCPソケットがそのままトランスポートストリームの受信用ソケットになるので、これをrecv()しつづける必要があります。
また、別の質問なのですが、 CMD2_EPG_SRV_NWPLAY_OPENでpipeファイルを直接開いて、CMD2_EPG_SRV_NWPLAY_PLAYでストリーム配信は出来ないのでしょうか?
現状は出来ないです。配信先を指定するCMD2_EPG_SRV_NWPLAY_SET_IPコマンドを配信先を"0.0.0.1"(SrvPipeを表す特別なIP)にして
CMD2_EPG_SRV_RELAY_VIEW_STREAMをEpgTimerSrvのプロセスIDでコールするという(まどろっこしい)方法があるかとも思いましたが、CMD2_EPG_SRV_NWPLAY_SET_IPコマンドをTCP経由で送る場合はセキュリティ上の配慮で配信先をコマンド送信元に制限しています。
https://github.com/xtne6f/EDCB/blob/work-plus-s-250920/EpgTimerSrv/EpgTimerSrv/EpgTimerSrvMain.cpp#L2370
拡張するとすればシンプルにTSファイルのパスと配信開始位置などを渡して受信用ソケットを受け取るようなコマンドでしょうか。ただ、TSファイルのパスを得る仕組み(パスを一覧するコマンドなど)とか一覧・配信可能なパスの範囲はどうするかとか課題はでてきます。ちょっと考えてみます。
要領を得ない質問を汲み取っていただき助かります。 ご指摘通りにCMD2_EPG_SRV_RELAY_VIEW_STREAMをリクエストしたソケットを閉じず、そのまま受信することで利用できました。 これにより抱えていた問題は解決に至りました。 代替案等をご提案頂いておりましたが、自由度が高く直接的に使える当該コマンドを利用します。 丁寧に対応頂きありがとうございました。 本issueはCloseさせて頂きます。
録画のストリーム配信においても、先の件と同じ問題があり再オープンさせて頂きました。 複数クライアントで使用する場合、ストリーム配信で使用するポート番号の変化をクライアント側で追えないというもの。 ライブ視聴においてはCMD2_EPG_SRV_RELAY_VIEW_STREAMを使用することで解決した問題です。
録画のストリーム配信においてはCMD2_EPG_SRV_NWPLAY_SET_IPで任意ポート番号を設定できるものと考えていました。 しかし、実際には引数の構造体にポート番号を設定してもBON_TCP_PORT_BEGIN(2230)となるようです。
そこで、先にご提案して頂いた件
拡張するとすればシンプルにTSファイルのパスと配信開始位置などを渡して受信用ソケットを受け取るようなコマンドでしょうか。ただ、TSファイルのパスを得る仕組み(パスを一覧するコマンドなど)とか一覧・配信可能なパスの範囲はどうするかとか課題はでてきます。
ご提案頂いたものは、CMD2_EPG_SRV_RELAY_VIEW_STREAMにおけるfifoファイル(プロセスID指定)を録画ファイルに置き換えたものとの認識でいます。 そうであるなら、今一度その実装を考えてはいただけないでしょうか。
使い勝手の大きく異なるものとはいえ、一連のストリーム配信用コマンド(CMD2_EPG_SRV_NWPLAY_XXXX)と機能が被ります。 そのため不要と考えられるようならスルーして下さい。 よろしくお願いします。
次のリリースより後になるかもしれませんが実装しようと思います。
ご指摘のとおり現状
CMD2_EPG_SRV_NWPLAY_TF_OPEN (録画中ファイルの再生用)
CMD2_EPG_SRV_NWPLAY_OPEN (録画中ファイル以外の任意のTSファイルの再生用)
が機能的に被りますが、実用上はCMD2_EPG_SRV_NWPLAY_TF_OPENが応用的に「録画中ファイル名の取得」のために呼ばれる程度で、あとは専らTVTest用のEpgTimerPlugInに使われているだけのようで微妙です。
とくに再生速度を変えられないところ、時間指定でのシークができない (CMD2_EPG_SRV_NWPLAY_SET_POS) ところが厳しいです。
CMD2_EPG_SRV_RELAY_VIEW_STREAMに近い構造であれば再生速度は必然的に呼び出し側で制御可能なので、TSファイル名とシーク位置をコマンドの引数にとるようなものを考えています。
新たな制御コマンドの実装を予定して頂きありがとう御座います。
つきましては、シークコマンドリクエスト時のパラメータに時間指定を予定して頂いていると認識しています。
とくに再生速度を変えられないところ、時間指定でのシークができない (CMD2_EPG_SRV_NWPLAY_SET_POS) ところが厳しいです。
これにより、とても使い易くなると思います。 ただ、使用する場面によってはファイル位置指定によるシークも必要かと思います。 出来れば、どちらのパラメータでも使えるものをお願います。 度々のご無理、申し訳ありません。