Skip to content

fix(chase): PMT を読めないまま元の TS で開いた 4K の局の録画を HEVC の写しに替える - #2791

Merged
5ym merged 3 commits into
mainfrom
fix/chase-ts4k-pmt-wait
Nov 14, 2026
Merged

5ym merged 3 commits into
mainfrom
fix/chase-ts4k-pmt-wait

Conversation

@5ym

@5ym 5ym commented Nov 14, 2026

Copy link
Copy Markdown
Collaborator

録り始めたばかりで先頭に PMT がまだ無い、TS で送る 4K の局の録画を、画面が放送のまま (raw) の追っかけで開くと、元の TS が届いて MPEG-2 のデコーダ (WASM) で何も出なかった (#2757 の取り残し)。

  • 開く前に PMT を読めなかった元の TS の追っかけは、送る前に伸びている録画のストリームから PMT を読む (Session.learnsBroadcast。ライブと同じ peekPmt、3 秒まで)
  • HEVC なら放送の HEVC を写したものに替えて tuned を broadcast: "hevc" で出し直す (chaseRawServed・switchFormat)。画面は追っかけでもこれを受けて 4K の局の録画として形式を選ぶ
  • 読めた答えは録画ごとに覚える (learnBroadcast)
  • docs/stream.md「TS で送る 4K の局の録画」を更新

確かめたのは合成した TS (伸びる録画のストリームから PMT を読む・形式の決め方) のテストだけで、実際の放送の録画と画面での切り替えは確かめていません。

🤖 Generated with Claude Code

https://claude.ai/code/session_01T8TqVbtN2Hp8wNmqBX8pzT

録り始めたばかりで先頭に PMT がまだ無い、TS で送る 4K の局の録画を、画面が放送のまま (raw) の追っかけで開くと、
サーバは MPEG-2 の局の録画として元の TS を送り、画面の MPEG-2 のデコーダ (WASM) は HEVC をデコードできず何も出なかった。

- 開く前に録画の PMT を読めなかった元の TS の追っかけは、送る前に録画のストリームから PMT を読む (Session.learnsBroadcast・readsVideo)
- 映像が HEVC なら放送の HEVC を写したものに替え、tuned を broadcast: "hevc" で出し直す (chaseRawServed・switchFormat)
- 読めた答えは録画ごとに覚え、次に開くときはそれで決める (recorded-broadcast の learnBroadcast・broadcastDecided)
- 画面は追っかけでも tuned の broadcast を受けて 4K の局の録画として形式を選ぶ

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T8TqVbtN2Hp8wNmqBX8pzT
@claude

claude Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 24s —— View job


レビュー結果

差分を読みました。実行とテストはしていません。

大きな不具合は見つかりませんでした。以下は確認してほしい点です。

要確認

  • tuned の channel を全追っかけで変えています (src/lib/server/live.ts の tuned を組み立てる箇所)。
    this.source !== undefined のとき channel.split("@")[0] にしたので、raw 以外の追っかけでも、答えの channel が <録画の ID>@<位置> から録画の ID だけに変わります。
    • 画面側 (live-player.svelte.ts) が tuned.channel を、リクエストした値と比べる箇所はありませんか。
    • 再選局の判定や、追っかけの目印を読む箇所はありませんか。
    • あるなら今回の修正で挙動が変わります。ないことを確認するか、switchFormat で出し直すときだけ変えてください。
  • session.audios = tracks を全追っかけに設定しています (openChase)。switchFormat で答え直すのは raw の追っかけだけなので、設定が要るのも raw のときだけに見えます。raw 以外に影響がないかを確認してください。

設計・不具合

  • runRaw で switchFormat した後、input.return(undefined) を待たずに runEncode(label) へ進んでいます (void)。followFile のハンドルが閉じ切る前に、runEncode が source から同じファイルを開き直します。ファイルは読み取りだけなので問題ないと見ていますが、peekPmt が読んだぶんのバッファを return で確実に解放できるかは確認してください。
  • chaseRawServed は playable を見ず、HEVC を再生できない端末の切り替えを画面に任せています。docs にその旨があり意図どおりです。切り替えは画面のコードを通るので、実機での確認が要ります (PR 本文にも書かれています)。
  • PMT を 3 秒待っても読めなかったとき (head.count === null) は learnBroadcast を呼ばず、元の TS のまま送ります。次に開くときにまた 3 秒待ちます。録画が長く PMT を書かない場合は毎回待つので、意図どおりか確認してください。

テスト

  • chaseRawServed・learnBroadcast・broadcastDecided・伸びる録画のストリームからの peekPmt は、単体テストがあります。
  • Session.runRaw の追っかけの分岐 (readsVideo の source 側、switchFormat から runEncode への移行、tuned の出し直し) と、画面側の chase.broadcast の更新にはテストがありません。実機で確認するなら、手順を PR に書いてください。

文章 (docs/writing.md)

  • 「録り始めたばかりで先頭に PMT がまだ無い」「読めた答えを覚え」など、決まりに反する言い回しは見つかりませんでした。
  • live.ts のコメント「追っかけも、…同じく見る」は、何を見るのか (PMT を読む) が分かりにくいです。「PMT を読む」と書くと通じます。
    | ブランチ: fix/chase-ts4k-pmt-wait

@claude

claude Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 21s —— View job


レビュー結果

差分を読み、tuned.channel の参照箇所を grep で確認しました。テストは実行していません。

大きな不具合は見つかりませんでした。以下は確認してほしい点です。

要確認

  • tuned の channel が、raw 以外の追っかけでも <録画の ID>@<位置> から録画の ID だけに変わります (src/lib/server/live.ts の tuned を組み立てる箇所)。
    • tuned.channel を読むのは src/routes/live/+page.svelte:560 だけで、データ放送の channel キーに使っています。ここは追っかけでも動作に影響しないと見ています。ただし、位置の違う追っかけでキーが変わらなくなるため、データ放送を作り直す条件が変わります。意図どおりか確認してください。
    • switchFormat で出し直すときだけ変える形にすれば、影響を raw の追っかけに絞れます。
  • session.audios = tracks を設定するのは raw && transport === "ts" && !broadcastDecided(path) のときだけです (openChase)。ほかの追っかけには影響しません。
  • PMT を 3 秒待っても読めなかったとき (head.count === null) は learnBroadcast を呼ばず、元の TS のまま送ります。 次に開くときもまた最大 3 秒待ちます。PMT を書かない録画では毎回待つので、意図どおりか確認してください。
  • runRaw で void input.return(undefined) の完了を待たずに runEncode(label) へ進みます。 読み取り専用のファイルなので問題ないと見ていますが、peekPmt のバッファが確実に解放されるか確認してください。

テスト

  • chaseRawServed・learnBroadcast・broadcastDecided・伸びる録画のストリームからの peekPmt は、単体テストがあります。
  • Session.runRaw の追っかけの分岐 (readsVideo の source 側、switchFormat から runEncode への移行、tuned の出し直し) と、live-player.svelte.ts の chase.broadcast の更新にはテストがありません。PR 本文のとおり実機では未確認なので、確認する手順を PR に書いてください。

文章 (docs/writing.md)

  • 決まりに反する言い回しは見つかりませんでした。
  • live.ts のコメント「追っかけも、…送る前に PMT を読む」は、何を読むかが書いてあり通じます。
    | ブランチ: fix/chase-ts4k-pmt-wait

追っかけの答えには serviceId を付けない (#2792 の決まり)。channel は録画の ID だけにする (この PR)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T8TqVbtN2Hp8wNmqBX8pzT
@claude

claude Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 16s —— View job


レビュー結果

差分を読み、serviceId と tuned.channel の参照箇所を grep で確認しました。テストは実行していません。

大きな不具合は見つかりませんでした。

要確認

  • tuned の channel が、raw 以外の追っかけでも <録画の ID>@<位置> から録画の ID だけに変わります (src/lib/server/live.ts の tuned を組み立てる箇所)。
    • 画面側で tuned.channel を読むのは src/routes/live/+page.svelte:560 のデータ放送のキーだけです。位置の違う追っかけでキーが変わらなくなり、データ放送を作り直す条件が変わります。意図どおりか確認してください。
    • serviceId を追っかけの答えから外す変更は、live-player.svelte.ts のコメント (「追っかけの答えには serviceId が無い」) と合っています。
  • PMT を 3 秒待っても読めなかったとき (head.count === null) は learnBroadcast を呼ばず、元の TS のまま送ります。 PMT を書かない録画は、開くたびに最大 3 秒待ちます。意図どおりか確認してください。
  • runRaw で void input.return(undefined) の完了を待たずに runEncode(label) へ進みます。 読み取り専用のファイルなので問題ないと見ていますが、peekPmt のバッファが確実に解放されるか確認してください。

テスト

  • chaseRawServed・learnBroadcast・broadcastDecided・伸びる録画のストリームからの peekPmt は単体テストがあります。
  • Session.runRaw の追っかけの分岐 (readsVideo の source 側、switchFormat から runEncode への移行、tuned の出し直し) と、live-player.svelte.ts の chase.broadcast の更新にはテストがありません。PR 本文のとおり実機では未確認なので、確認する手順を PR に書いてください。

文章 (docs/writing.md)

決まりに反する言い回しは見つかりませんでした。
| ブランチ: fix/chase-ts4k-pmt-wait

@5ym
5ym merged commit 51e1efd into main Nov 14, 2026
58 of 59 checks passed
@5ym
5ym deleted the fix/chase-ts4k-pmt-wait branch November 14, 2026 08:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant