TASK 18: local (record-only) recording pipeline + top-bar pills/light/Start-End button UX
Encoder dual-output: StreamEnabled/RecordEnabled/RecordPath options; per-output ffmpeg block (stream ->flv, record ->mp4); throw unless at least one output. RecordingFile: auto-name ty-<yyyymmdd>-<start hhmm>-0000.mp4, rename-on-stop to ty-...-<len hhmmss>.mp4 with numeric-suffix on collision. LayoutStore persists record folder. MainViewModel: REC/ON-AIR pills, status light, single Start<->End button (replaces Start/Stop variants), StopStream no longer signs out, explicit session timer. About overlay widened. Sign In label + spacing before Start. Tests: 244 passed / 246 (2 pre-existing: AudioPipeline gains-mute, RoundClip). Build 0 warnings. Scope check clean. Memory-map correction (derived-solution rule, 2026-08-29): image-shrink recipe was never recorded when first done, so it was re-derived. Added Derived-solution/recipes rule to AGENTS.md; MyMistakes.md now a permanent recipes registry (records the verified WPF-imaging shrink recipe); schema.md rows MyMistakes as registry; ai.md points to the rule. README hero image replaced: 3.2MB screenshot -> 1400x794 -> 188KB docs/ytLlive-preview.jpg (JPEG q82).
This commit is contained in:
@@ -19,6 +19,19 @@ public sealed class EncoderOptions
|
||||
public int Fps { get; init; } = 60;
|
||||
public int BitrateKbps { get; init; } = 8000;
|
||||
|
||||
/// <summary>Push to <see cref="RtmpUrl"/> (the ON-AIR side). Defaults on so
|
||||
/// the pre-recording callers behave unchanged; the VM sets it from the ON-AIR
|
||||
/// pill.</summary>
|
||||
public bool StreamEnabled { get; init; } = true;
|
||||
|
||||
/// <summary>Write a local file at <see cref="RecordPath"/> (the REC side).
|
||||
/// False unless the REC pill is on.</summary>
|
||||
public bool RecordEnabled { get; init; }
|
||||
|
||||
/// <summary>Local MP4 output path for recording. Required when
|
||||
/// <see cref="RecordEnabled"/> is true.</summary>
|
||||
public string? RecordPath { get; init; }
|
||||
|
||||
/// <summary>H.264 encoder name for <c>-c:v</c>; the encoder probes and prefers
|
||||
/// nvenc → qsv → amf → libopenh264 when not forced.</summary>
|
||||
public string? VideoEncoder { get; init; }
|
||||
|
||||
Reference in New Issue
Block a user