docs(media): record v10 and H264 evidence boundary
This commit is contained in:
1 parent
1b7655a34d
commit
cde71ea256
8 files changed
+71
-70
No files matched your search
@@ -18,7 +18,7 @@ Last updated: 2026-08-24
|
||||
- Ordinary peer ICE is STUN-only, and current LiveKit media is UDP-only. Credentials, room secrets, candidate details, and diagnostic data remain private and narrowly scoped. A future strict-firewall transport requires separate evidence and must remain inside LiveKit rather than becoming another Screener route candidate.
|
||||
- Browser peers use existing periodic WebRTC/LiveKit stats to maintain one exact-route decoded-progress timestamp. New frames or route/connection changes reset it; a non-paused deadline reports the edge once. Track availability, bitrate, FPS, resolution, freeze, RTT, jitter, loss, sender stats, and SFU layer describe only the current path: they remain framework or diagnostic inputs and cannot prove another parent would be better.
|
||||
- Browser capture requests available share audio by default on initial capture and source switch, with an explicit video-only warning when no audio track is returned. Its screen-audio control offers live-switchable 64/128/256 kbps sender ceilings and defaults to 128. The last-wins quality wire owns desired state; each endpoint serially applies and reads back current Host/relay/SFU audio senders, exposes local failures, and gives future senders the latest desired value. Opus remains fixed, and without an applied-ack wire the Host does not claim room-wide atomic convergence. These are configuration ceilings, not fidelity claims.
|
||||
- Browser sharing defaults to VP8. The advanced `automatic | H.264 | VP8` selector is temporary pre-share diagnostic input: the selected preference is applied when the share's peer offers and optional SFU publication are first created, then remains fixed until that share ends. Ordinary Pause/Resume changes source enablement under the current `shareGeneration`; it does not renegotiate or republish media. After the codec-transaction cleanup, controlled H.264 root-cause repair and physical direct, relay, and SFU evidence choose one final fixed Browser codec. The selector and codec-choice product surface are then deleted whether the result is VP8 or H.264.
|
||||
- Browser sharing defaults to VP8. The advanced `automatic | H.264 | VP8` selector is temporary pre-share diagnostic input: the selected preference is applied when the share's peer offers and optional SFU publication are first created, then remains fixed until that share ends. Ordinary Pause/Resume changes source enablement under the current `shareGeneration`. Controlled H.264 diagnosis and physical direct, relay, and SFU evidence choose one final fixed Browser codec; the final product exposes only that codec.
|
||||
- Recommended quality remains exactly `1080p60`, `1080p30`, and `720p30`, with the middle `1080p30` as the accepted default. `480p` means only an advanced `854x480` resolution choice whose FPS and bitrate remain independently selected; it is not a fourth recommended profile.
|
||||
- Two distribution artifacts are accepted only after the current feature, NAT, and real-network ledger is complete. A public-server one-click deployment package installs the current application plus STUN/SFU and proxy components on a user-owned server. A Windows/macOS/Linux local package runs the Host, application server, and local state on the broadcaster's machine without source, Node, or any external Screener/network service; it keeps workable direct P2P but reports the reachability loss imposed by public ingress, TLS, gateway, NAT, or firewall limits rather than promising universal connectivity.
|
||||
- Current UI, presence, route labels, and diagnostics describe observed state only; they do not create route authority.
|
||||
@@ -27,19 +27,19 @@ Last updated: 2026-08-24
|
||||
|
||||
## Current Source And Production
|
||||
|
||||
- Production runs Browser runtime `39fcf93bae057fcbb1002702c3be6b90bac9027f`, release `39fcf93`, on `screener-v9`. Canonical root `main` contains that runtime plus the current docs-only truth checkpoints; auxiliary branches and older worktrees do not supersede it.
|
||||
- Integrated source and production admit up to `20` Viewers and implement the uniform `1/2/3` endpoint cap, exact prepare candidate, first-decoded-frame commit, strict rollback revision, decoded-progress stall, a two-stage direct/SFU operation deadline, and one event-driven room controller. A short-lived exact-generation decoded-frame observer proves only the pending candidate inside the existing total deadline; the periodic stats sampler remains responsible for active-path diagnostics and stalls. Ordinary peer ICE is STUN-only and the sole application fallback is SFU/UDP; stale TURN environment keys fail startup. SFU admission uses exact publication and Viewer-subscription handles with explicit no-default ingress/egress capacities and a listener-fenced dedicated LiveKit owner.
|
||||
- Integrated source and production use the memory-resident room model: random free four-digit codes, the configurable dormant lease, exact-Host resume, restart loss, local creation-preference replay, orthogonal Viewer grants and `open | password | disabled` code entry, and direct invitation/policy controls. SQLite room persistence, `ROOM_DATABASE_PATH`, `ROOM_TTL_SECONDS`, and a writable room StateDirectory are absent from the current runtime.
|
||||
- Production runs Browser runtime `39fcf93bae057fcbb1002702c3be6b90bac9027f`, release `39fcf93`, on `screener-v9`; current source uses the single `screener-v10` Browser wire. Auxiliary branches and older worktrees do not supersede canonical `main`.
|
||||
- Current source and production admit up to `20` Viewers and implement the uniform `1/2/3` endpoint cap, exact prepare candidate, first-decoded-frame commit, strict rollback revision, decoded-progress stall, a two-stage direct/SFU operation deadline, and one event-driven room controller. A short-lived exact-generation decoded-frame observer proves only the pending candidate inside the existing total deadline; the periodic stats sampler remains responsible for active-path diagnostics and stalls. Ordinary peer ICE is STUN-only and the sole application fallback is SFU/UDP; stale TURN environment keys fail startup. SFU admission uses exact publication and Viewer-subscription handles with explicit no-default ingress/egress capacities and a listener-fenced dedicated LiveKit owner.
|
||||
- Current source and production use the memory-resident room model: random free four-digit codes, the configurable dormant lease, exact-Host resume, restart loss, local creation-preference replay, orthogonal Viewer grants and `open | password | disabled` code entry, and direct invitation/policy controls. SQLite room persistence, `ROOM_DATABASE_PATH`, `ROOM_TTL_SECONDS`, and a writable room StateDirectory are absent from the current runtime.
|
||||
- Production runs from `/opt/screener/releases/39fcf93`. Its immutable runtime ZIP SHA-256 is `28190c3a69ec937d39ab5d49fdbc8db6a07e6013c2ddd5f5590bf8249bf6bce6`; `/opt/screener/backups/39fcf93-pre-v9-20260824T004257Z` is the verified rollback boundary and its `SHA256SUMS` hash is `1f741f29022f5eb1eb311a24f87f5f48598dca7b1879b88f9033c331fa06bd37`.
|
||||
- Production implements live 64/128/256 kbps audio-ceiling mutation; generation-fenced paused codec prepare, Resume source acknowledgement, decoded-progress proof, and rollback; typed first-frame Viewer presentation and privacy-safe on-demand route diagnostics; neutral room-code denial and responsive entry controls; exactly three recommended profiles with `1080p30` as default and advanced-only `854x480`; and no parent-edge quality-proof wire. The accepted codec contract above is not yet implemented or deployed: the next atomic Browser release removes that transaction, defaults new shares to VP8, restores ordinary `shareGeneration`-fenced Pause/Resume, and uses one new wire version that rejects v9 without aliases or dual parsing.
|
||||
- Current source defaults new shares to VP8, keeps the diagnostic selector pre-share only and fixed for the share lifetime, uses `shareGeneration`-fenced Pause/Resume, and requires the v10 wire. Both source and production implement live 64/128/256 kbps audio-ceiling mutation, typed first-frame Viewer presentation, privacy-safe on-demand route diagnostics, neutral room-code denial, responsive entry controls, exactly three recommended profiles with `1080p30` as default and advanced-only `854x480`.
|
||||
- Browser SFU subscribers reconcile eligible Host screen publications across connect/activate event ordering, participant/track arrival, and reconnect. Production LiveKit logs only warn/error, and the application service has a bounded same-host LiveKit readiness preflight.
|
||||
- Exact runtime source `d543f38aacad3df5ef65fde1055cc8e733972afe`, integrated without runtime changes by main `39fcf93bae057fcbb1002702c3be6b90bac9027f`, passed 670 Web tests in 48 files, TypeScript typecheck, client/server production builds, the access/privacy gate, production-dependency audit, and repository hygiene. Its one-Host/20-Viewer Chrome loopback decoded every Viewer and kept endpoint fanout within cap `2`, but used direct local peer routes and observed no SFU publication; it is not public-network, SFU, mobile, audio-quality, codec-switch, H.264 performance, or background-lifecycle evidence.
|
||||
- Exact v10 runtime source `fdd5a4a529ff297f41c05ea3388bf484d76afe8f` passed 610 Web tests in 45 files, TypeScript typecheck, client/server production builds, access/privacy, the 257-test SFU admission gate, dependency audit, and repository hygiene. Its one-Host/20-Viewer Chrome 151 loopback decoded every Viewer, propagated fixed VP8 settings, bounded Host/relay fanout at `2`, captured all current-child timing distributions, and observed no SFU publication. It is not public-network, SFU, mobile, physical audio/codec, H.264 performance, or background-lifecycle evidence.
|
||||
- Postflight found `screener`, LiveKit, coturn, and nginx active with `NRestarts=0`; local and public `/` and `/healthz` return 200, every served client file matches the immutable release, the public Browser bundle contains `screener-v9` and no `screener-v8`, the release shares no regular-file inode with its rollback predecessor, and the accepted socket/firewall boundary is intact. No current v9 media room was created, so deployment evidence is not route or physical-media acceptance. Detail is owned by [deployment](./deployment.md) and [verification status](./verification-status.md).
|
||||
- Chrome loopback, cap2/cap3, short resource, recovery, MBB, and A/V fixtures are bounded evidence only. They do not establish quality, resource limits, or product policy.
|
||||
|
||||
## Current Priority
|
||||
|
||||
1. Implement, integrate, and atomically deploy the accepted codec simplification, then close the [current evidence ledger](./todo.md) with physical live-audio validation, controlled Host-background diagnosis, and representative direct/peer-relay/SFU network runs. Browser loopback, state-machine gates, and deployment health do not substitute for those paths.
|
||||
1. Integrate and atomically deploy the v10 Browser contract while controlled H.264 diagnosis starts in parallel. Physical direct/peer-relay/SFU evidence then selects the fixed Browser codec exposed by the product.
|
||||
2. Run the mobile lifecycle matrix and later mechanism-simplification audit only at their stated boundaries; Native/executable and distribution work remain later product phases.
|
||||
|
||||
## Working Rules
|
||||
|
||||
@@ -262,10 +262,26 @@ intrinsic bitrate or efficiency win for every implementation or scene; actual
|
||||
outbound codec/profile, encoder implementation and decoded stats remain the
|
||||
result truth. A codec choice also does not prove shared encode: separate browser
|
||||
PeerConnections may construct separate encoders, and the SFU still publishes
|
||||
only the configured `q,h` representations. After the H.264 root cause is fixed,
|
||||
fresh-share physical direct, browser-relay, and SFU runs choose either VP8 or
|
||||
H.264 as the single fixed Browser codec. Either result removes the temporary
|
||||
selector instead of retaining a permanent codec control.
|
||||
only the configured `q,h` representations. A fresh-share physical direct
|
||||
comparison chooses the fixed Browser codec; relay and SFU validate H.264 only
|
||||
when that comparison selects it.
|
||||
|
||||
Current Chromium source makes the negotiated H.264 format a material Windows
|
||||
runtime input. `kPlatformH264CbpEncoding` is disabled by default on Windows;
|
||||
the Media Foundation path skips the NVIDIA MFT for constrained-baseline H.264,
|
||||
and the WebRTC hardware encoder returns software fallback for unsupported
|
||||
formats such as odd dimensions. Ordinary H.264 simulcast streams are initialized
|
||||
as separate encoder streams. The target run must therefore join each outbound
|
||||
SSRC/RID to its exact `RTCCodecStats.sdpFmtpLine` and record the exposed encoder
|
||||
implementation, power-efficiency flag, interval encode cost, and process GPU
|
||||
video-encode activity. These fields distinguish format and encoder paths; their
|
||||
presence alone does not establish the Screener root cause.
|
||||
|
||||
Pinned LiveKit server `1.13.5` gives VP8 a temporal layer selector and gives
|
||||
H.264/H.265 the generic simulcast spatial selector. H.264 SFU evidence therefore
|
||||
starts with every Host publication RID and the Viewer-selected dimensions/FPS:
|
||||
layer changes are spatial, while same-dimension FPS changes remain attributable
|
||||
to publisher, transport, or Viewer decode evidence.
|
||||
|
||||
The repository diagnostic is a mechanical single-machine preflight, not a
|
||||
quality runner. Lifecycle runs fix the accepted v10 VP8 default; each fresh run performs exactly
|
||||
@@ -276,18 +292,18 @@ Codec preflight uses fresh Host/share/PeerConnection sessions for Automatic,
|
||||
H.264, and VP8 and rejects an actual-codec mismatch. Reports retain only
|
||||
allowlisted failure stages and sanitized identifiers.
|
||||
|
||||
Quality diagnosis remains a separately orchestrated headed matrix with the same
|
||||
real game, browser/driver, capture surface, and one external wired direct Viewer;
|
||||
the local loopback preflight cannot satisfy it. Capture A, sender B, and Viewer C
|
||||
samples must share the current generation and overlapping windows; identity
|
||||
polling must not advance their accumulators. Record actual codec/profile,
|
||||
Quality diagnosis uses a headed matrix with the same real game, Browser build,
|
||||
driver/GPU, capture surface, `1080p30 / 5 Mbps / balanced`, foreground state,
|
||||
and one external wired direct Viewer. Fresh H.264, VP8, and H.264 confirmation
|
||||
shares each run for 60 to 90 seconds. Capture A, sender B, and Viewer C samples
|
||||
share the current generation and overlapping windows; identity polling does not
|
||||
advance their accumulators. Each window records actual codec/profile,
|
||||
configured/source/send/receive FPS, interval encoded frames/encode time,
|
||||
limitation reason, game FPS, and process-scoped GPU evidence. Missing
|
||||
implementation or power-efficiency fields remain unknown. Add a remote runner
|
||||
adapter only when that matrix has a current automated consumer. No H.264 root
|
||||
cause or policy change is accepted until the controlled sample distinguishes
|
||||
capture starvation, software fallback, hardware queue/driver pressure, and
|
||||
congestion.
|
||||
limitation reason, game FPS, and process-scoped CPU/GPU evidence. Capture input,
|
||||
sender output, transport limits, and Viewer decode evidence classify the first
|
||||
bottleneck. A direct H.264 result selected by that matrix is then checked once
|
||||
through browser relay and once through SFU. Missing implementation or
|
||||
power-efficiency fields remain unknown.
|
||||
|
||||
Open-source distribution is not itself a patent-license exemption. This Web
|
||||
change only requests a codec already implemented by the browser/LiveKit path and
|
||||
@@ -850,6 +866,9 @@ is a separate optimization.
|
||||
- [IANA AV1 media type and format parameters](https://www.iana.org/assignments/media-types/video/AV1)
|
||||
- [Chromium/libwebrtc video stats origins](https://webrtc.googlesource.com/src/+/HEAD/video/g3doc/stats.md)
|
||||
- [Chromium WebRTC hardware encoder factory](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory.cc)
|
||||
- [Chromium Windows H.264 constrained-baseline acceleration gate](https://github.com/chromium/chromium/blob/main/third_party/blink/renderer/platform/peerconnection/webrtc_util.cc)
|
||||
- [Chromium Windows Media Foundation encoder selection](https://chromium.googlesource.com/chromium/src/+/master/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc)
|
||||
- [Chromium WebRTC hardware fallback and simulcast initialization](https://chromium.googlesource.com/chromium/src/+/HEAD/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc)
|
||||
- [Chromium WebRTC AV1 hardware feature gate](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/media/webrtc/webrtc_features.cc)
|
||||
- [MDN `RTCRtpSender.setParameters()`](https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpSender/setParameters)
|
||||
- [Chromium `motion` to libwebrtc `kFluid` bridge](https://chromium.googlesource.com/chromium/src/third_party/+/refs/heads/main/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc)
|
||||
|
||||
+10
-28
@@ -43,19 +43,17 @@ Current high-signal boundary:
|
||||
- ADR-0002 owns the implemented room model: one process-memory RoomStore,
|
||||
random free four-digit codes, configurable 24-hour dormant leases, restart
|
||||
loss, local Host preference replay, an independent expiring Viewer grant, and
|
||||
open/password/disabled code entry. Current source and production use the
|
||||
single `screener-v9` wire and neither runtime uses SQLite; exact rollback
|
||||
open/password/disabled code entry. Current source uses `screener-v10`,
|
||||
production uses `screener-v9`, and neither runtime uses SQLite; exact rollback
|
||||
artifacts are owned by deployment.
|
||||
- Exact runtime source `d543f38aacad3df5ef65fde1055cc8e733972afe`, integrated
|
||||
without runtime changes by main `39fcf93bae057fcbb1002702c3be6b90bac9027f`, implements the Browser
|
||||
v9 batch: live audio-ceiling mutation, paused codec switching with exact Resume
|
||||
source authority and proof, typed Viewer presentation, Host-on-demand route
|
||||
diagnostics, neutral room-code denial, responsive entry controls, default
|
||||
`1080p30`, and advanced-only `854x480`. It passed 670 Web tests in 48 files,
|
||||
typecheck, client/server builds, access/privacy, dependency audit, and
|
||||
repository hygiene. Its exact 20-Viewer Chrome run passed on
|
||||
direct loopback with no SFU publication, so it is not SFU or public-network
|
||||
evidence.
|
||||
- Exact v10 runtime source `fdd5a4a529ff297f41c05ea3388bf484d76afe8f`
|
||||
defaults Browser sharing to VP8, keeps the temporary codec selector pre-share
|
||||
only, fixes codec preference for the share lifetime, uses ordinary
|
||||
`shareGeneration`-fenced Pause/Resume, and uses the single v10 wire. It passed
|
||||
610 Web tests in 45 files, typecheck, client/server
|
||||
builds, access/privacy, SFU admission, dependency audit, repository hygiene,
|
||||
and a 20-Viewer Chrome direct-loopback gate. That evidence does not establish
|
||||
H.264 performance, public-network behavior, or SFU packet flow.
|
||||
- Production runs exact `39fcf93bae057fcbb1002702c3be6b90bac9027f`, release
|
||||
`39fcf93`, wire `screener-v9`. The immutable runtime ZIP SHA-256 is
|
||||
`28190c3a69ec937d39ab5d49fdbc8db6a07e6013c2ddd5f5590bf8249bf6bce6`;
|
||||
@@ -81,22 +79,6 @@ Current high-signal boundary:
|
||||
material. Do not merge or delete them until their unique changes, references,
|
||||
and reparse/junction safety are checked against current main.
|
||||
|
||||
The accepted codec contract now defaults new shares to VP8, keeps the codec
|
||||
selector pre-share only, fixes the preference for the lifetime of a share, and
|
||||
uses ordinary `shareGeneration`-fenced Pause/Resume. Current source and production
|
||||
still run the v9 codec transaction described above. The next Browser cutover must
|
||||
delete that transaction and its messages, use one new wire version, and reject v9
|
||||
without compatibility aliases before this simplification is reported as implemented
|
||||
or deployed.
|
||||
|
||||
Current TODO priority is that codec simplification and atomic deployment, followed
|
||||
immediately by controlled H.264 root-cause repair, physical route validation, a
|
||||
single final Browser codec decision, and deletion of the temporary selector for
|
||||
either VP8 or H.264. Physical audio validation, controlled Host-background diagnosis,
|
||||
representative direct/peer-relay/SFU network acceptance, mobile lifecycle,
|
||||
distribution/native packages, retained product decisions, and the read-only
|
||||
simplification audit follow their ledger order.
|
||||
|
||||
Follow the current ledger in order and report each verified physical-evidence
|
||||
boundary without reviving stale agent or branch facts.
|
||||
```
|
||||
+10
-11
@@ -15,19 +15,19 @@ This is the current execution index. Git history owns completed timelines; [veri
|
||||
|
||||
## Current Source
|
||||
|
||||
- Canonical root `main` is the source and integration truth. It contains the deployed Browser runtime checkpoint `39fcf93bae057fcbb1002702c3be6b90bac9027f` plus the current docs-only truth checkpoints; auxiliary branches and older worktrees do not supersede it.
|
||||
- The single Browser `screener-v9` boundary rejects stale clients before room authority. Current source implements one Host plus up to `20` Viewers, one steady outbound media-copy cap for every non-server endpoint (default `2`, static `1/2/3`), and the process-memory room model with random four-digit codes, a default 24-hour dormant lease, exact-Host resume, restart loss, local Host preference replay, independent token invitations, `open | password | disabled` code entry, and no SQLite runtime.
|
||||
- Canonical root `main` is the source and integration truth. Current source uses the single Browser `screener-v10` boundary and rejects stale v9 clients before room authority; auxiliary branches and older worktrees do not supersede it. Production remains on v9 until the atomic cutover recorded below.
|
||||
- Current source implements one Host plus up to `20` Viewers, one steady outbound media-copy cap for every non-server endpoint (default `2`, static `1/2/3`), and the process-memory room model with random four-digit codes, a default 24-hour dormant lease, exact-Host resume, restart loss, local Host preference replay, independent token invitations, `open | password | disabled` code entry, and no SQLite runtime.
|
||||
- One event-driven controller owns the committed graph and at most one room-serial child operation. It uses one deterministic candidate list/cursor and one total direct-then-SFU deadline; exact admission and physical resources remain charged through drain, and the pending candidate commits only after an exact-generation decoded-frame proof. A short-lived 100 ms stats observer proves only that candidate inside the existing deadline, while the 2-second sampler remains responsible for active-path diagnostics and decoded-frame stalls. Healthy edges remain sticky and current-path quality does not authorize reparenting.
|
||||
- Ordinary peer ICE is STUN-only and the only application fallback is the dedicated LiveKit SFU over UDP. SFU generations use explicit no-default ingress/egress capacities, exact `reserved | committed | draining` accounting, delete-plus-absence release, one Host publication, and exact Viewer subscription handles. No Screener TURN, ICE/TCP, media TCP, or TLS-relayed media route exists.
|
||||
- Current source implements live 64/128/256 kbps audio-ceiling mutation for current and future Host/relay/SFU senders. It also implements paused `automatic | H.264 | VP8` switching as one generation-fenced prepare/Resume/source-ack/proof transaction with a server-monotonic `resumeAttempt`, authoritative re-pause, bounded rollback preparation, and no automatic Resume.
|
||||
- Current source implements typed first-frame Viewer presentation and recovery, Chinese user-facing route/access failures, privacy-safe failed-page export, authenticated Host-only on-demand route snapshots, neutral `ROOM_ACCESS_DENIED` room-code admission, and responsive entry controls. The unused parent-edge quality-proof protocol is absent.
|
||||
- Current source implements live 64/128/256 kbps audio-ceiling mutation for current and future Host/relay/SFU senders. Browser sharing defaults to VP8; `automatic | H.264 | VP8` is a temporary pre-share-only diagnostic input and remains fixed for the share lifetime. Ordinary Pause/Resume changes the existing tracks and Host SFU publication under the exact current Host session and `shareGeneration`.
|
||||
- Current source implements typed first-frame Viewer presentation and recovery, Chinese user-facing route/access failures, privacy-safe failed-page export, authenticated Host-only on-demand route snapshots, neutral `ROOM_ACCESS_DENIED` room-code admission, and responsive entry controls.
|
||||
- Recommended quality remains exactly `1080p60`, `1080p30`, and `720p30`; current source defaults to `1080p30`. Advanced resolution adds `480p` as `854x480` without adding a fourth preset, and advanced FPS and bitrate remain independent.
|
||||
- Exact runtime source `d543f38aacad3df5ef65fde1055cc8e733972afe`, integrated without runtime changes by main `39fcf93bae057fcbb1002702c3be6b90bac9027f`, passed 670 Web tests in 48 files, TypeScript typecheck, client/server production builds, the access/privacy gate, production-dependency audit, and repository hygiene. Its exact one-Host/20-Viewer Chrome loopback passed every gate with all Viewers decoding and Host/relay fanout bounded by cap `2`; all observed media routes were local direct peers and no SFU publication appeared. This is source, state-machine, build, privacy, and direct-loopback evidence, not public-network, SFU, mobile, physical audio/codec, H.264 performance, or Host-background evidence.
|
||||
- Exact v10 runtime source `fdd5a4a529ff297f41c05ea3388bf484d76afe8f` passed 610 Web tests in 45 files, TypeScript typecheck, client/server production builds, the access/privacy gate, the 257-test SFU admission gate, production-dependency audit, and repository hygiene. Its one-Host/20-Viewer Chrome 151 loopback decoded every Viewer, propagated the fixed VP8 settings, kept Host and relay fanout within cap `2`, captured all four current-child timing distributions, and observed no SFU publication. This is source, state-machine, build, privacy, and direct-loopback evidence, not public-network, SFU, mobile, physical audio/codec, H.264 performance, or Host-background evidence.
|
||||
|
||||
## Current Milestone
|
||||
|
||||
1. Replace the current codec transaction with the accepted pre-share-only selector, VP8 default, fixed per-share codec preference, and ordinary `shareGeneration`-fenced Pause/Resume. Integrate and deploy it atomically on one new Browser wire version with no v9 compatibility path.
|
||||
2. Diagnose and repair the H.264 path under controlled conditions, validate the result on physical direct, peer-relay, and SFU paths, choose one final fixed Browser codec, and delete the temporary selector for either outcome.
|
||||
1. Integrate and deploy the v10 Browser contract atomically while controlled H.264 diagnosis runs in parallel.
|
||||
2. Use physical direct, peer-relay, and SFU evidence to choose the fixed Browser codec exposed by the product.
|
||||
3. Validate live audio ceilings on physical direct, peer-relay, and SFU paths, then reproduce the Host background/minimized report under controlled conditions while recording the actual negotiated codec.
|
||||
4. Finish representative ICE/STUN/SFU acceptance including mobile networks. Browser port prediction, NAT classification, TCP probing, fake page keepalive, and quality-driven reparenting remain outside the accepted model.
|
||||
|
||||
@@ -42,9 +42,8 @@ This is the current execution index. Git history owns completed timelines; [veri
|
||||
|
||||
## Current Hold
|
||||
|
||||
There is no active P0/P1 source or deployment hold. Browser v9 is integrated, locally gated, atomically
|
||||
deployed, and postflight-clean, but its codec transaction is no longer the accepted product contract.
|
||||
The accepted simplification is truth-only until the next atomic Browser release; source and production
|
||||
must not be reported as simplified before that cutover. Physical audio, heterogeneous-network, SFU,
|
||||
There is no active P0/P1 source or deployment hold. The Browser v10 contract is implemented and
|
||||
locally gated, while production remains the postflight-clean v9 release until the atomic cutover. Source
|
||||
and production must remain reported separately. Physical H.264 quality, audio, heterogeneous-network, SFU,
|
||||
background, and mobile evidence remains open. Native/executable work and broad repository cleanup
|
||||
remain outside the current evidence boundary.
|
||||
+2
-2
@@ -6,8 +6,8 @@ Only items in **Now** are executable after their stated decision gate. A branch
|
||||
|
||||
## Now
|
||||
|
||||
1. **Simplify Browser codec ownership and deploy it atomically.** Default new shares to VP8, keep `automatic | H.264 | VP8` only as a pre-share diagnostic choice, and keep that choice fixed after sharing starts. Delete the codec generation, prepared binding, `resumeAttempt`, source acknowledgement, proof, rollback, and SFU replacement transaction; ordinary Pause/Resume remains one `shareGeneration`-fenced source-state change. Remove the replaced v9 messages instead of preserving aliases or dual parsers, cut one new wire version that rejects stale v9 clients before room authority, run the proportionate Browser gates, then deploy and record the exact release boundary.
|
||||
2. **Resolve H.264 and remove Browser codec choice.** Reproduce the dated blur/performance report on the same Host, browser, driver, game scene, and wired direct Viewer while changing one variable at a time. Implement a codec-specific repair only if actual codec/profile/encoder and capture/sender/Viewer evidence identifies one, then validate fresh shares on physical direct, browser-relay, and SFU paths. Choose VP8 or H.264 as the single fixed Browser codec from that evidence and delete `automatic | H.264 | VP8`, the selector, and the remaining codec-choice product code for either result; do not rebuild live codec switching.
|
||||
1. **Deploy Browser v10 atomically.** Current source defaults new shares to VP8, keeps `automatic | H.264 | VP8` as a pre-share diagnostic choice fixed for that share, uses `shareGeneration`-fenced Pause/Resume, and exposes the single v10 wire. Complete integration, deploy server and Browser assets together, reject stale v9 before room authority, and record the exact release boundary.
|
||||
2. **Classify H.264 in parallel and select one fixed Browser codec.** Reproduce the dated blur/performance report on the same Host, browser, driver, game scene, and wired direct Viewer while changing one variable at a time. Validate fresh shares on physical direct, browser-relay, and SFU paths, choose VP8 or H.264 from actual codec/profile/encoder and capture/sender/Viewer evidence, and make that codec the only Browser product choice.
|
||||
3. **Physically validate live screen-audio ceilings.** With audible game/music capture, switch 64/128/256 kbps while sharing across direct, browser-relay, and SFU paths, then create a new edge and switch source. Record sender readback, observed bitrate, route continuity, audible result, and A/V synchronization. Treat every setting as a ceiling, and do not infer fidelity or room-wide atomic convergence from configuration alone.
|
||||
4. **Diagnose desktop Host background/minimized performance.** On the same machine, dynamic scene, direct Viewer, browser, and fresh share, compare foreground, occluded, minimized, and hidden states while recording the actual negotiated codec. Correlate capture settings/FPS, frames captured/encoded/sent/decoded, bitrate, `qualityLimitationReason`, encode time, browser/game CPU and GPU, and the existing local-preview pause boundary. Treat browser scheduling/throttling and codec effects as hypotheses until measured. Do not spoof page activity, add keepalive timers, or misuse Wake Lock; if current Chrome/Edge cannot preserve the accepted Host behavior through standard Web APIs, record that capability boundary before considering the packaged/native Host.
|
||||
5. **Finish real-network route acceptance.** Measure standard ICE/STUN direct paths, peer relay, SFU ingress/subscription, exact first-frame commit and rollback, relay-ingress repair with subtree retention, disconnect/capacity drain, Pause/Resume, and bounded explicit failure across representative IPv4/IPv6 NATs and mobile networks. Include an all-UDP-blocked case to establish the current failure boundary. Do not add port prediction, NAT classification, TCP probes, guessed candidates, route scores, or quality-driven reparenting.
|
||||
|
||||
@@ -22,6 +22,7 @@ Capacity and routing entries below describe the exact tested source or release o
|
||||
|
||||
## Retained Functional Evidence
|
||||
|
||||
- Exact v10 runtime source `fdd5a4a529ff297f41c05ea3388bf484d76afe8f` passed repository hygiene, TypeScript typecheck, client and server production builds, all 610 Web tests in 45 files, the 257-test SFU admission gate, the access/privacy Browser gate, and the production-dependency audit with zero vulnerabilities. Its one-Host/20-Viewer Chrome 151 direct-loopback report passed all seven assertions: all Viewers decoded, fixed VP8 settings reached every participant, Host and relay media edges stayed within cap `2`, no orphan SFU publication appeared, and all four current-child timing distributions contained 20 values. The report SHA-256 is `802CBB7632E9AEA3C39FE831A7F7880D24140B2E83942CE0DFDA05DE4B408EED`. This validates the v10 source boundary, not H.264 quality, hardware attribution, physical capture, public-network behavior, or SFU packet flow.
|
||||
- Exact Browser v9 source `d543f38aacad3df5ef65fde1055cc8e733972afe`, integrated by deployed main `39fcf93bae057fcbb1002702c3be6b90bac9027f`, passed repository hygiene, TypeScript typecheck, client and server production builds, all 670 Web tests in 48 files, the access/privacy Browser gate, and the production-dependency audit with zero vulnerability. This covers the in-memory room/access boundary, v9 protocol, one serialized exact-candidate route controller, generation-bound first-decoded-frame proof, physical resource retention, SFU lifecycle and admission, paused codec transition/rollback/source authority, live media-setting mutation, on-demand route observability, Viewer presentation state, and entry UI. These are local source/state-machine/build gates, not heterogeneous-network, target-device quality, or real LiveKit packet-flow proof.
|
||||
- The same exact v9 source passed the required one-Host/20-Viewer local Browser gate with endpoint cap `2`; report SHA-256 is `EB879256C13C75FF1C7F3BC313DE1681FC5D89FC1F51D63B96ECD3ECB93DD09F`. Queue, candidate, first-frame, and final timing each recorded `20/0` populated/missing values. The sorted millisecond evidence is:
|
||||
|
||||
|
||||
+6
-6
@@ -2,7 +2,7 @@
|
||||
|
||||
## 2026-08-18 14:45
|
||||
|
||||
状态:production Browser runtime 为 exact `39fcf93bae057fcbb1002702c3be6b90bac9027f`、release `39fcf93`、wire `screener-v9`;canonical main 包含该 runtime 和其上的当前 docs-only truth checkpoints。当前 Browser 合同包括 live-media mutation、Viewer presentation/diagnostics、无枚举房间准入和质量选择,并已通过原子部署 postflight;精确 deployed behavior 只由 deployment 文档记录。
|
||||
状态:Current source 使用单一 `screener-v10` Browser wire,默认 VP8,codec selector 仅在分享前用于诊断且结果在 share lifetime 内固定;Pause/Resume 由当前 Host session 和 `shareGeneration` 约束。Production 仍为 exact `39fcf93bae057fcbb1002702c3be6b90bac9027f`、release `39fcf93`、wire `screener-v9`。精确 deployed behavior 只由 deployment 文档记录。
|
||||
|
||||
## 目标与边界
|
||||
|
||||
@@ -160,7 +160,7 @@ accepted 的唯一 wire 是 `screener-v10`,不做版本协商、v9 parser、
|
||||
|
||||
每次 `setParameters()` 都必须从当次 `getParameters()` 派生更新,然后读回 requested/applied `maxBitrate`、`maxFramerate`、`scaleResolutionDownBy` 和 degradation preference。浏览器负责具体降级,实际结果由 stats 观测;拒绝或浏览器改写必须进入可见状态,不能只写 `console.warn`。
|
||||
|
||||
Web 视频端不做视频 SDP munging。当前默认 `VP8`;临时测试期内,`automatic` 以空 `setCodecPreferences([])` 恢复 P2P 浏览器默认且不覆盖 LiveKit 默认 codec,显式 H.264/VP8 在本轮分享的首个 offer/publication 前应用。P2P 与 browser relay 始终保留完整 browser codec/repair 回退列表,SFU 始终保持 `backupCodec: false`。分享开始后 codec preference 固定;现有 peer 不因暂停而重协商,SFU 不因暂停而 republish,v10 wire 不包含 codec generation、preparation、proof、rollback 或 replacement 消息。普通 Pause/Resume 只以当前 Host session 和 `shareGeneration` 更新一个 paused boolean、切换同一批 capture tracks并唤醒普通 route reconciliation。实际 outbound codec/profile、encoder implementation 与 stats 是结果真相;浏览器支持 H.264 不证明命中硬编。codec transaction 清理后立即定位并修复 H.264 根因,通过物理 direct、browser relay 与 SFU 验证后只选择 VP8 或 H.264 中一个作为固定 Browser codec,并在任一结论下删除 selector 与 codec-choice 产品功能。AV1 仍不得仅凭压缩率推断默认启用。唯一获准的 Web SDP 变换是下述 Viewer answer 的 Opus stereo receive preference,不得借此扩展视频码率、codec 或通用 munging。
|
||||
Web 视频端当前默认 `VP8`。诊断期内,`automatic` 以空 `setCodecPreferences([])` 使用 P2P 浏览器和 LiveKit 默认,显式 H.264/VP8 在本轮分享的首个 offer/publication 前应用;P2P 与 browser relay 保留浏览器公布的完整 codec/repair 列表,SFU 使用 `backupCodec: false` 的单一 publication codec。每次分享的 codec preference 保持固定,普通 Pause/Resume 只以当前 Host session 和 `shareGeneration` 更新 paused 状态并切换同一批 capture tracks。实际 outbound codec/profile、encoder implementation 与 stats 是结果真相。物理 direct 对照选择一个固定 Browser codec,browser relay 与 SFU 随后验证该选择,最终产品静态配置这一 codec。Viewer answer 的 Opus stereo receive preference 是当前 Web SDP 变换边界。
|
||||
|
||||
Web display-audio 请求显式关闭 `echoCancellation`、`noiseSuppression`、`autoGainControl` 和 `voiceIsolation`,并以 `channelCount: { ideal: 2 }` 偏好双声道;这是当前 Chrome/Edge Host 基线的实现契约,用于避开网页 `getDisplayMedia()` 默认的语音处理和单声道 APM 候选,不宣称跨浏览器保证,也不固定采样率。所有值都是非强制 post-selection preference;不使用 `exact`、`min` 或 `advanced`。若 `getAudioTracks()` 为空,分享者界面必须显示“当前来源没有可共享音频”。Web 端同时传入 `windowAudio: "window"` 与 `systemAudio: "include"`:窗口选项请求该窗口/应用音频,整个屏幕选项允许用户勾选系统音频;标签页使用浏览器自身的标签页音频选择。浏览器可以忽略这些约束或 picker hints,且没有对应的标准来源类型读回,因此 UI 不额外推断或标注来源。系统音频由用户显式选择,可能包含语音或通知;video-only 始终可用。
|
||||
|
||||
@@ -174,7 +174,7 @@ Web display-audio 请求显式关闭 `echoCancellation`、`noiseSuppression`、`
|
||||
|
||||
Host 本地预览直接绑定现有 capture stream,不创建 viewer、`RTCPeerConnection` 或额外媒体边,也不产生 SFU/应用服务器出口。预览仍可能有本地合成、缩放和 GPU 显示成本;在同一动态场景对预览开/关采集 Host CPU、GPU、encode time 和实际 FPS。后台性能诊断必须把 Host 页面前台/遮挡/最小化、被捕获 source 前台/遮挡/最小化以及 preview 播放/暂停分成独立变量,并关联 document visibility/focus、track mute/readyState 与 capture/outbound/inbound stats。页面 timer、伪活跃和 Screen Wake Lock 都不构成屏幕捕获保活方案;若标准浏览器无法维持目标行为,应记录平台能力边界而不是制造第二套 lifecycle。只有稳定收益且捕获、编码和远端画面不变时,才把直播后的默认动态预览改为静止缩略图或隐藏并允许按需展开;隐藏预览绝不停止 capture track 或 sender encode。
|
||||
|
||||
2026-08-19 当时生产 release `769de201f7cc` 的模糊、游戏低帧、持续 `bandwidth` 提示和 Host 刷新恢复都只作为该 release 的用户报告;当前生产已是 `39fcf93`。首轮复现必须在相同机器、Chrome/Edge、驱动、游戏场景和单个有线 direct Viewer 上对照该历史 release 与最新 `main`。生命周期实验固定当前默认 VP8,每个独立 affected baseline 只运行 observe、受影响 `HostPeer` rebuild、capture replace、Host reload 或 preview cycle 中一个动作;codec A/B 另以全新 Host/share/PeerConnection 会话分别请求 Automatic/H.264/VP8 并校验 actual codec。质量判断只使用同一 generation 且时间重叠的 capture A、sender B、Viewer C 窗口;stats identity poll 不推进采样 accumulator,可选 encoder 字段缺失保持 unknown。若实际 codec/encoder 不变而 BWE/发送恢复,则下调 codec 根因优先级;只有编码成本异常时才进入受控 codec repair。
|
||||
H.264 对照固定同一 Host、Chrome/Edge 版本、驱动、游戏场景、`1080p30 / 5 Mbps / balanced` 和单个有线 direct Viewer,并为 H.264、VP8 与复核用 H.264 分别创建全新 Host/share/PeerConnection 会话。质量判断只使用同一 generation 且时间重叠的 capture A、sender B、Viewer C 窗口,并同步记录游戏 FPS 与 Host 浏览器进程 CPU/GPU;stats identity poll 不推进采样 accumulator,可选 encoder 字段缺失保持 unknown。Capture、sender 与 Viewer 的实际 FPS/码率、codec/profile、encode/decode cost、`qualityLimitationReason`、丢帧、冻结和传输指标共同归类采集、编码、带宽或解码瓶颈。
|
||||
|
||||
`track.getSettings()` 中存在的 EC/NS/AGC/voice-isolation、`channelCount` 和 `sampleRate` 只能作为当前捕获观测;缺失字段保持未知,Opus 协商仍是独立事实。每个 Web Host 或浏览器 relay 的实际音频 sender 在首次绑定和换源后通过标准 `RTCRtpSender.setParameters()` 请求并读回当前 64/128/256 kbps ceiling;这只是上限,浏览器 WebRTC 拥塞控制仍可降低实际流量,不新增应用层音频降级器。128 kbps 保持默认,因为 RFC 7587 将 20 ms full-band stereo music 的建议区间列为 64--128 kbps,pinned LiveKit 2.22.0 也把 128 kbps 命名为 `musicHighQualityStereo`;256 kbps 是用户显式选择的较高上限,不是质量保证。Peer answer 声明 `stereo=1;maxaveragebitrate=256000`,让同一接收协商覆盖所有三档,实际 sender ceiling 仍由所选档位约束;普通 PC synthetic 不用于标定参数、听感或性能。
|
||||
|
||||
@@ -336,7 +336,7 @@ Token-free SFU standby prewarm 保持可选且不创建 participant、publicatio
|
||||
- RoomStore 的四位空闲码随机分配/释放、活动分享免过期、dormant lease/续租、Host token/Viewer grant 摘要验证、`open/password/disabled` 正交 policy、grant 到期/跨房拒绝、rotate/revoke 强撤销、Viewer 上限和超额拒绝;
|
||||
- 进程重启后 room state 全空、旧 Host/grant/password fail closed、释放号码复用时旧 grant 仍失败;`ROOM_LEASE_SECONDS` 的默认/边界与 `MAX_ROOMS <= 9000` 校验,已删除的 `ROOM_DATABASE_PATH`/`ROOM_TTL_SECONDS` fail-fast;
|
||||
- STUN UDP URL 严格校验、生产 STUN 必需、LiveKit tuple 完整性/TTL/secret 独立性、当前 route/session/revision/connection generation guard,以及 ordinary peer、未授权房间和 Native 的 STUN-only isolation;LiveKit `sfu-config` 保持独立边界;
|
||||
- accepted next source contract 的单一 `screener-v10` 信令 literal、v9 及更早客户端 mismatch 的一次性刷新终态,以及协议非法 JSON、未知消息、错误方向、跨房间目标和 payload 限制;v10 不含 parent-edge quality proof 或 codec transaction/resume handshake,只保留 shareGeneration-fenced paused boolean、`ROOM_ACCESS_DENIED`、typed Viewer route failure 与 Host-only 按需脱敏 route snapshot,不保留旧 parser、writer 或别名;`qualityProfileIdSchema` 保持三档不变,只有 `qualityResolutionSchema` 包含 `480p`,`DEFAULT_QUALITY_SETTINGS` 为 1080p30、VP8;
|
||||
- current source contract 使用单一 `screener-v10` 信令 literal、严格 JSON schema、方向与房间授权校验、payload 上限和 client-mismatch 刷新终态;分享状态由 `shareGeneration`-fenced paused boolean 表达,访问失败使用 `ROOM_ACCESS_DENIED`,Viewer route failure 为 typed terminal,Host 诊断按需返回脱敏 snapshot。`qualityProfileIdSchema` 保持三档,`qualityResolutionSchema` 包含 `480p`,`DEFAULT_QUALITY_SETTINGS` 为 1080p30、VP8;
|
||||
- 质量协议的 host 授权、严格字段与数值范围、last-wins、当前/未来 relay、已配置 SFU 和普通 P2P wire 兼容;sender 的四字段 requested/applied 读回、拒绝与持续受限提示;screen audio SDP helper 覆盖 CRLF、existing/missing fmtp、unknown key preservation、幂等、payload number、rejected/non-audio,以及 empty/no-Opus/ambiguous/parser 异常原对象 fallback,`ViewerPeer` 覆盖 initial/restart/rebuild 时同一结果的 local/signaling 一致性,SFU publisher 精确断言 high-quality stereo/forceStereo/DTX 且不覆盖 RED;
|
||||
- HTTP/WS 集成:nginx per-source site-access `limit_req` 与统一错误不泄露 secret,应用不建立 IP limiter 状态;Viewer 可在 Origin/容量门下 upgrade;Host 首条鉴权同时要求 upgrade-captured site access 与 Host token,Viewer 要么持 exact-room grant,要么先有 site access 再按 `open/password/disabled`。覆盖原子创建 profile、同浏览器重建偏好、fragment/sessionStorage/replaceState、无 site access 的 code-only 统一拒绝、unknown/expired/disabled/wrong-or-absent-password/full code-only 使用完全相同的 `ROOM_ACCESS_DENIED` code/文案/close、grant 与 Host 的独立错误、raw grant/密码不进入 URL/日志/服务端持久状态,以及 rotate/revoke 后 grace/route 清理、旧 Viewer/上游媒体边关闭和 reconnect 拒绝;
|
||||
- 客户端策略与 stats 解析:会话替换不重连,ordinary ICE 与 LiveKit protocol 分离;
|
||||
@@ -359,8 +359,8 @@ Token-free SFU standby prewarm 保持可选且不创建 participant、publicatio
|
||||
|
||||
## 当前交付边界
|
||||
|
||||
- Production 当前运行 exact `39fcf93bae057fcbb1002702c3be6b90bac9027f`、release `39fcf93`、wire `screener-v9`,因此仍是 automatic 默认、paused codec transaction 与 Resume source-ack/proof 行为;该 release 的 deployment postflight 已通过,回滚边界为 `/opt/screener/backups/39fcf93-pre-v9-20260824T004257Z`。本设计正文的 VP8 默认、pre-share-only selector、简单 Pause/Resume 与 `screener-v10` 是下一次原子实现/部署边界,尚未进入当前 source 或 production;v10 上线时拒绝 v9,不保留 alias 或兼容 parser。
|
||||
- H.264/模糊与 Host 后台性能继续按受控根因证据诊断;标准 ICE/SFU 继续按真实异构网络验收,不增加 guessed candidate、NAT classifier、TCP probe 或 quality-driven reparent。
|
||||
- Current source 使用单一 `screener-v10` wire,默认 VP8,codec selector 只在分享前可用且对本次分享固定,Pause/Resume 由当前 Host session 和 `shareGeneration` 约束。Production 仍运行 exact `39fcf93bae057fcbb1002702c3be6b90bac9027f`、release `39fcf93`、wire `screener-v9`,回滚边界为 `/opt/screener/backups/39fcf93-pre-v9-20260824T004257Z`。v10 以 server 与 Browser assets 原子部署并在 room authority 前校验 wire version。
|
||||
- 物理 direct 证据选定最终固定 Browser codec;若选择 H.264,再由 browser relay 与 SFU 验证。Host 后台性能按受控根因证据诊断;标准 ICE/SFU 按真实异构网络验收。
|
||||
- 当前发布面只包含 Web Host、Viewer 和 browser relay。Native sender、capture helper、shared-encode executable 与两个分发包仍由各自后续决策和物理证据驱动,不属于当前 Browser release。
|
||||
|
||||
任何一步只实现当前消费者需要的接口。不得为未来账号、第三种媒体拓扑或原生 sender 预建抽象层。
|
||||
|
||||
+1
-1
@@ -58,7 +58,7 @@ SFU 的 publication、subscription、server-resource accounting、临时 overlap
|
||||
- 分享端桌面封装:用 Electron 固定 Chromium 版本、改善选源/热键/系统音频体验,同时保留 Web 观看端。
|
||||
- Windows 应用音频:Windows 11 Native sender 使用本地 opaque window target 绑定 HWND、PID 与进程创建时间,只捕获所选游戏及其子进程的音频,避免把语音聊天或通知声一并分享;“全部系统声音”只能由分享者显式选择。普通 Windows 10 不具备当前 process-loopback API 门槛,必须明确标为未解决/不支持而不是伪兼容。浏览器无法证明或隔离任意进程音频时必须如实提示,原生捕获失败、无声或进程退出不得静默扩大为整机捕获。
|
||||
- 受限网络边界:当前媒体只使用 ordinary direct/STUN UDP 与 LiveKit SFU/UDP;全 UDP 封锁、只允许标准 HTTPS 出站等网络在有界窗口后明确失败。不得用 TCP 探测、客户端声称的 NAT 类型或另一套应用 route candidate 猜测可达性。若真实矩阵证明该失败边界需要扩展,先比较 LiveKit 内建 ICE/TCP 或其内部安全 relay transport,并另行接受安全、端口、延迟和部署合同。
|
||||
- Web 编码选择:分享高级设置在开始分享前暂时提供 `自动 | H.264 | VP8`,当前 Browser 默认 `VP8`;该 selector 只用于建立 H.264 对照测试,不是长期产品控制。选定 preference 在本次分享的首个 P2P/relay offer 和 SFU publication 前应用,并对之后为该分享新建的 sender 保持一致;`automatic` 恢复浏览器/LiveKit 默认,显式 H.264/VP8 仍保留完整 repair 与其他 codec 回退列表,SFU 保持 `backupCodec = false`。分享开始后 codec 固定,直播中和暂停中都不提供 codec 切换;需要改变时停止并重新开始分享。实际 codec/profile、encoder implementation 与 stats 是结果真相;H.264 可选不等于浏览器必走硬编。codec transaction 清理后立即定位并修复 H.264 根因,在物理 direct、browser relay 与 SFU 路径验证,再只保留证据支持的 VP8 或 H.264 作为固定 Browser codec;无论选择哪一个都删除 selector 与 codec-choice 产品功能。AV1 仍不得仅凭压缩率推断默认启用。
|
||||
- Web 编码选择:诊断期的分享高级设置在开始分享前提供 `自动 | H.264 | VP8`,当前 Browser 默认 `VP8`。选定 preference 在本次分享的首个 P2P/relay offer 和 SFU publication 前应用,并对该分享的后续 sender 保持固定;`automatic` 使用浏览器/LiveKit 默认,显式 H.264/VP8 优先使用浏览器公布的对应 codec,SFU 使用单一 publication codec。实际 codec/profile、encoder implementation 与 stats 是结果真相。相同 Host、浏览器、驱动、游戏场景和有线 direct Viewer 的物理对照先选择一个固定 Browser codec,再由 browser relay 与 SFU 验证;最终产品只暴露该固定 codec。
|
||||
|
||||
### P2 - 可选功能
|
||||
|
||||
|
||||
Reference in new issue
Block a user