„Kenne ich" heisst nicht „kann ich diese Datei"
Der Spieler schickte sein Profil aus `canPlayType` — und das ist eine Auskunft des `<video>`-Elements. Ein Strom läuft aber nicht durch das Element, sondern durch den MSE-Puffer, und die beiden sind sich nicht einig. Gemessen in Chromium: | | canPlayType | MediaSource.isTypeSupported | |---|---|---| | `audio/flac` | probably | **false** | | `audio/mp4; codecs="mp3"` | probably | **false** | Der Server glaubte dem Profil, packte die Datei pflichtschuldig um und liess die Spur unberührt — und der Browser stand vor etwas, das er nach eigener Auskunft können müsste. Heraus kam „Dieser Browser kann die Spuren dieser Datei nicht öffnen". Jetzt zählt ein Codec nur, wenn **beide** Auskünfte ihn bestätigen; welcher der beiden Wege es wird, entscheidet der Server erst danach. Und geprüft wird jeder Typ in der Form, in der er wirklich ankommt — `audio/mp4` und nicht `audio/flac`: genau dieser Unterschied entschied bei FLAC zwischen „geht" und „geht nicht". Gemessen: MP3 fällt dadurch aus dem Profil, der Server rechnet es um, statt es durchzureichen. **Und wenn doch etwas durchrutscht, wird gerechnet statt gemeldet.** Scheitert die Wiedergabe mit einem Codec- oder Dekodierfehler, baut der Spieler den Strom genau einmal neu auf — mit `transcode: true`, an derselben Stelle. Der Satz „über das Zahnrad lässt sich eine Fassung wählen, die er versteht" ist weg: wer das liest, weiss weder welche, noch warum der Server sie nicht gleich gegeben hat. Lief schon ein gerechneter Strom, unterbleibt der zweite Versuch — dann liegt es nicht am Codec, und dreissig Sekunden Warten auf dasselbe sind keine Hilfe. **Nicht geprüft:** dass der Rückfall im Betrieb auslöst. Jede Datei im Prüfbestand spielt; ein echtes Scheitern liess sich hier nicht herbeiführen. Gemessen ist der Serverteil (`remux` wird zu `transcode`) und das neue Profil. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e30158b84c
commit
9c2e2b5f47
@@ -308,6 +308,50 @@ public class HlsArgumenteTests
|
||||
});
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// Der zweite Versuch
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
/// <summary>Wer es probiert hat und scheiterte, bekommt gerechnet.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <b>Das Urteil des Browsers schlägt seine eigene Auskunft.</b>
|
||||
/// <c>canPlayType</c> ist eine Behauptung: „kenne ich" heisst nicht „kann
|
||||
/// ich diese Datei". Gemessen in Chromium — <c>canPlayType('audio/flac')</c>
|
||||
/// sagt „probably", <c>MediaSource.isTypeSupported</c> derselben
|
||||
/// Zeichenkette sagt <c>false</c>. Wer es ausprobiert hat, weiss mehr.
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public void Erzwungen_wird_gerechnet_auch_wenn_alles_passt()
|
||||
{
|
||||
IReadOnlyList<ProbedStream> spuren = [Bild("h264"), Ton(1, "aac")];
|
||||
|
||||
var ohne = Stromentscheid.Fuer("mp4", spuren, Browser);
|
||||
var mit = Stromentscheid.Fuer("mp4", spuren, Browser, erzwingen: true);
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(ohne.Art, Is.EqualTo(Stromart.Direkt), "ohne Zwang geht die Datei durch");
|
||||
Assert.That(mit.Art, Is.EqualTo(Stromart.Umkodieren));
|
||||
Assert.That(mit.Gruende, Does.Contain(Stromgrund.SpielerKamNichtZurecht));
|
||||
Assert.That(mit.BildKopieren, Is.False, "umkodieren heisst: das Bild wird angefasst");
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>Und die gewählte Stufe bleibt dabei erhalten.</summary>
|
||||
[Test]
|
||||
public void Erzwungen_bleibt_die_gewaehlte_Stufe()
|
||||
{
|
||||
var plan = Stromentscheid.Fuer(
|
||||
"mp4", [Bild("h264", 2160), Ton(1, "aac")], Browser, 720, erzwingen: true);
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(plan.Art, Is.EqualTo(Stromart.Umkodieren));
|
||||
Assert.That(plan.Hoehe, Is.EqualTo(720));
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>Beim Umpacken ist die Stufe gegenstandslos.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
|
||||
Reference in New Issue
Block a user