AVPlayer hat die Untertitel wieder abgeschaltet

Der Server lieferte sie, die Spur lag im Stream, ausgewaehlt war sie auch —
und angezeigt wurde trotzdem nichts.

Der Grund ist eine Eigenschaft, die von Haus aus auf `true` steht:
`appliesMediaSelectionCriteriaAutomatically`. Der Player richtet sich damit
nach den Untertiteleinstellungen des Systems, und die stehen in aller Regel
auf „aus\". Er nahm also jede Wahl, die wir trafen, wieder zurueck —
lautlos, und erst nachdem wir sie gesetzt hatten.

Beim Ton aendert das Abschalten nichts: welche Spur klingt, ist laengst
beim Aushandeln entschieden, und bei einem umgerechneten Stream kommt
ohnehin nur eine an.

Dazu eine zweite Absicherung: bei einer Abspielliste laedt AVFoundation die
Nebenspuren nachtraeglich. Meldet sie beim ersten Mal noch keine, ginge der
bestellte Untertitel verloren — deshalb wird im Sekundentakt nachgefasst,
solange nichts ausgewaehlt ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-28 21:40:30 +02:00
co-authored by Claude Opus 5
parent cff0c06745
commit 5e33971452
2 changed files with 22 additions and 0 deletions
@@ -85,6 +85,23 @@ public final class AVPlayerEngine: VideoPlayerEngine {
public init() {
AudioSession.activate()
// **AVPlayer wählt Untertitel sonst selbst — und schaltet sie ab.**
//
// Diese Eigenschaft steht von Haus aus auf `true`: der Player richtet
// sich dann nach den Untertiteleinstellungen des Systems. Die stehen
// in aller Regel auf „aus", und damit nimmt er jede Wahl, die wir
// treffen, wieder zurück — lautlos, und erst nachdem wir sie gesetzt
// haben.
//
// Zu sehen war das als „ich schalte Untertitel ein und sehe nichts":
// der Server lieferte sie, die Spur war im Stream, ausgewählt war sie
// auch, und angezeigt wurde trotzdem nichts.
//
// Beim Ton ändert das Abschalten nichts: welche Spur klingt, ist
// längst beim Aushandeln entschieden, und bei einem umgerechneten
// Stream kommt ohnehin nur eine an.
player.appliesMediaSelectionCriteriaAutomatically = false
}
public func load(_ source: PlaybackSource) async throws(PlaybackFailure) {