現在放送中のチャンネルをライブ視聴できるようにする(mpegts直送 / HLS) - #32
Merged
Conversation
録画済み番組の視聴のみだったところに、EPGStationのライブHLS配信APIを使った チャンネル視聴機能を追加。トップ画面に「現在放送中」行を新設し、選局すると 詳細画面を経由せず直接再生を開始する。録画の追いかけ再生と同じstreamId管理 (開始・keep-alive・停止)の仕組みを流用している。
「番組名更新」行を「現在放送中」の下に新設。EPGStationの/schedules/broadcasting から全チャンネルの放映中番組をまとめて取得し、チャンネルカードに番組名を反映する。 自動更新ではなく手動更新(ボタン押下時のみ)とすることでシンプルに保っている。
- 視聴画面に「REC」ボタンを追加。現在放送中の番組をEPGStationの手動予約API (POST /reserves) でワンタッチ録画予約できるようにした。録画は予約した瞬間からの 開始になる(生放送は巻き戻せないため)。 - addReserve() は当初 Call<Long> でレスポンスボディをパースしようとしていたが、 実際のレスポンス形と一致せずGson例外でonFailureに落ちていた(EPGStation側では 予約自体は成立していた)。Call<ResponseBody> に変更しHTTPステータスのみで 成功判定するよう修正。 - 録画ボタンのAction はアイコンなしだと実機で描画されなかったため、既存の ic_sidebar_rec.xml をアイコンとして使うよう変更。 - ライブHLS開始直後のウォームアップ中に404以外のロードエラーで再生が停止して しまう問題に対応し、startLiveHlsPlayback() のリトライ対象を種別不問・ 20回x2秒に拡大(録画の追いかけ再生側は変更なし)。
HLS視聴(既存機能、タップ)はそのまま残し、チャンネルカード長押しで
低遅延なmpegts直送再生を試せるようにした。
- EPGStationのGET /streams/live/{channelId}/m2tsは、HLSと違い開始APIが
不要でstreamId管理も一切いらないシンプルな仕組み(TCP接続に紐づく)。
既存の録画TS直再生の仕組み(startDirectPlayback)をそのまま流用できる。
- 実機検証の結果、生のライブTSに字幕処理のネイティブコード
(TsReadexDataSource/ARIB字幕)を使うとクラッシュすることが判明したため、
mpegts直送では字幕処理を無効化している(既知の制約としてWIP.mdに記録)。
- USBデバッグなしでもクラッシュを確認できるよう、未捕捉例外を保存して
次回起動時に表示するEpgTvApplicationを追加。
実機確認済み: HLSの約25秒に対し、mpegts直送は体感5秒程度まで低遅延化。
画質はEPGStationサーバー側のm2ts用エンコードプロファイル設定に依存する。
mpegts直送の方が低遅延・高画質にできることが確認できたため、単押しの デフォルト動作に昇格。HLSは字幕対応が必要な場合やmpegts側が不安定な 場合のフォールバックとして長押しに割り当てる。
- RECボタンの隣にℹ️アイコンを追加。押すと現在放送中の番組情報(チャンネル名・ ジャンル・時刻・概要・詳細説明)をダイアログで見られるようにした。既存の 録画詳細画面の「番組情報」機能(ProgramInfoDialogFragment)をそのまま流用。 - mpegts直送再生時はシーク不可の生ストリームのためシークバーを非表示にした (HLSは追いかけ再生のバッファ状況が見えて便利なため残す)。Leanbackに シークバーの表示切り替えAPIが無いため、コントロール行のビューを直接 R.id.playback_progressで探してGONEにする方式を採用。 androidx.leanback.widget.SeekBarへのキャストミスで実機クラッシュしたが、 EpgTvApplicationのクラッシュログ機能で原因を特定・修正できた。
前回クラッシュ内容ダイアログのタイトル・閉じるボタンがハードコード されていたため、プロジェクトのi18n方針(values/values-ja-rJP)に合わせて リソース化。閉じるボタンは既存のR.string.closeを再利用。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
EPGStation の /api/channels にはフィルタ用のクエリパラメータが無く、 全チャンネルがそのまま返る。EPGStation公式Web UIのChannelModel.isAudioVideoService と同じ基準(ARIBサービスタイプのホワイトリスト)をクライアント側に移植し、 データ放送専用サービス等をライブ視聴列から除外する。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
DefaultLoadErrorHandlingPolicyはリトライ間隔だけでなく最大リトライ回数も デフォルト3回に制限されており、getRetryDelayMsForで間隔を2秒に伸ばしても 3回(約6秒)で致命的エラーとしてプレイヤーが停止していた。 getMinimumLoadableRetryCountも合わせてオーバーライドし、コメント通り 最大40秒(20回x2秒)のウォームアップ待機が機能するようにする。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Owner
|
Allow edits by maintainers チェックつけていただいていたので僭越ながら直接修正をpushさせていだきました。
|
Owner
|
tsreadex + libaribcaptionでクラッシュする件、issues に追加しました。 |
Owner
|
現行の実装は録画追いかけ再生も含めてmode=0決め打ちなので、そこをケアする issue を追加しました |
Owner
|
マージしました! |
Contributor
Author
|
マージありがとうございました。所々やり残りのままだったこと大変失礼しました。それらもまとめていただけまして感謝しております。ありがとうございました。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要(ライブ視聴関連PR)
現在放送中のチャンネルをそのまま視聴できるようにしました。
config.yml設定次第でほぼ即再生・高画質も可能。字幕は非対応)実装のポイント
GET/streams/live/{channelId}/m2ts)は、HLSと違って開始APIが不要でした。プレイヤーが直接このURLに接続するだけで配信が始まり、切断で自動終了するシンプルな仕組みなので、streamId管理(開始・keep-alive・停止)が一切要りません。既存の「録画TS直再生」の仕組み(ProgressiveMediaSource+OkHttpDataSource)をほぼそのまま流用しています。既知の制約
TsReadexDataSource/ARIB字幕のネイティブ処理を通すとクラッシュすることが実機検証で判明したため、字幕処理自体を無効化しています。録画ファイルと違い生放送のTSは複数サービス多重化やPAT/PMTのタイミングが異なるためではないかと推測しています。cmd例は-snで字幕ストリームを除外している設定なので、そもそもサーバー側で字幕データを送っていません)。config.ymlのstream.live.ts.m2tsmode=0の設定次第です。無変換(パススルー)が最速・最高画質ですが帯域を多く使います(地上デジタル1080iで15〜18Mbps程度)。当方はEPGStation config.ymlのmode=0を以下の設定で開発・運用しています。
コメントで伺った tsreadex + libaribcaption を使った字幕対応の土台があるとのこと、もし差し支えなければ知見を伺えると、mpegts版の字幕対応に活かせるかもしれません。
テスト環境
J:COM セットトップボックス XA401 / Android TV
EPGStation Version 2.10.0
Test plan
チャンネル一覧行の表示確認
単押しでmpegts直送再生が始まることの確認
長押しでHLS再生が始まることの確認
「REC」ボタンでの録画予約確認
「ℹ」ボタンでの番組情報表示確認
視聴画面から戻った際にストリームが解放されることの確認