Vorrat anlegen, und VLC meldet endlich das Stocken
Zwei Änderungen, die an der Wiedergabe selbst etwas tun — beide ohne Abhängigkeit davon, ob die Server je eine Leiter liefern. **Vorrat.** Ohne Angabe legt AVPlayer so viel an, wie es für einen zügigen Start braucht, und keinen Meter mehr. Das ist richtig, solange die Leitung trägt, und falsch, sobald sie aussetzt: ein Loch von fünf Sekunden trifft dann auf einen Puffer von fünf Sekunden, und das Bild steht. Fünfundzwanzig Sekunden sind ein Anfangswert, kein Messergebnis. Nur für Filme und Folgen über das Netz. **Nicht für Sender** — dort hieße ein halbminütiger Vorrat eine halbe Minute Verzug und ein zähes Umschalten. Und nicht für Dateien von der Platte, die brauchen keinen. Wer das entscheidet, muss mehr wissen als der Motor, deshalb reist die Zahl mit der Quelle statt dass die Engine rät. **VLC hat das Stocken nie gemeldet.** `VLCMediaPlayerState` kennt keinen Wert dafür — die Aufzählung führt nur `opening`, `playing`, `paused`, `stopped`, `error`. Der Puffer-Fortschritt kommt über `mediaPlayerBufferingChanged:`, und die Methode fehlte. Folge: `.buffering` ging dort **nie** an, der Wachhund im Player löste nie aus, und ein hängender Strom lief stumm ins Nichts — ohne Kreisel, ohne Meldung, ohne Abbruch. Ausgerechnet auf dem Weg, der die großen Remuxe spielt, bei denen eine schwache Leitung am ehesten scheitert. Gewertet wird nur aus dem Spielen heraus: laut Dokumentation kommt vor jeder Wiedergabe einmal 0,0 und einmal 1,0, und dieses anfängliche Füllen ist der Start, kein Rückler. Dazu meldet VLC jetzt überhaupt Statistik. `variantCount` bleibt dabei `nil` und nicht `1` — eine Datei hat keine Leiter, und „gibt es nicht" ist etwas anderes als „gibt es einmal". Bei der Bitrate steht die Annahme im Kommentar statt im Nebel: libvlc führt `inputBitrate` vermutlich in Byte je Sekunde, daher der Faktor acht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
afab93f53a
commit
baa542690c
@@ -177,6 +177,19 @@ final class PlayerModel {
|
||||
/// Wacht darüber, dass aus „lädt" nicht „lädt für immer" wird.
|
||||
@ObservationIgnored private var bufferWatchdog: Task<Void, Never>?
|
||||
|
||||
/// Wie viel Vorrat bei einem Strom über das Netz angelegt wird.
|
||||
///
|
||||
/// **Nur für Filme und Folgen, nicht für Sender und nicht für Dateien.**
|
||||
/// Ein laufender Sender soll nah am Jetzt bleiben — ein halbminütiger
|
||||
/// Vorrat hieße dort eine halbe Minute Verzug und ein Umschalten, das
|
||||
/// sich zäh anfühlt. Eine Datei von der Platte braucht keinen Vorrat.
|
||||
///
|
||||
/// Fünfundzwanzig Sekunden sind ein Anfangswert, kein Messergebnis: genug,
|
||||
/// um ein Loch von einigen Sekunden zu überbrücken, wenig genug, dass der
|
||||
/// Start nicht spürbar später kommt. Die richtige Zahl gehört mit einer
|
||||
/// gedrosselten Leitung ermittelt.
|
||||
private static let forwardBuffer: Duration = .seconds(25)
|
||||
|
||||
/// Das Buch über die Rückler dieser Wiedergabe.
|
||||
@ObservationIgnored private var stallLedger = StallLedger()
|
||||
/// Seit wann tatsächlich gespielt wird — der Nullpunkt für das Buch.
|
||||
@@ -492,7 +505,12 @@ final class PlayerModel {
|
||||
))
|
||||
playbackSession = target.sessionID
|
||||
playbackVersionID = target.versionID
|
||||
return PlaybackSource(url: target.url, origin: .remote, startTime: start)
|
||||
return PlaybackSource(
|
||||
url: target.url,
|
||||
origin: .remote,
|
||||
startTime: start,
|
||||
forwardBuffer: Self.forwardBuffer
|
||||
)
|
||||
} catch {
|
||||
// Die Worte des Servers stehen auf dem Bildschirm, nicht „keine
|
||||
// abspielbare Datei". Sagt er, warum er ablehnt, ist das die einzige
|
||||
|
||||
Reference in New Issue
Block a user