mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-11 17:30:00 +02:00
fix(player): rebasculer sur HLS quand la piste audio n'est pas démuxable
mpegts.js ne démuxe que l'AAC et le MP3. Une chaîne diffusée en E-AC3
(stream_type 0x87) ou en AC-3 (0x81) était donc lue sans aucune piste audio,
sans erreur ni avertissement : l'image passait, le son était simplement absent.
Les journaux le montrent au PMT — "pid_stream_type":{"256":27,"257":135} avec
un "common_pids" réduit au seul h264, là où les flux audibles annoncent
"257":15 pour l'AAC.
L'évènement MEDIA_INFO porte l'information : quand il arrive sans piste audio,
le lecteur détruit la session MPEG-TS et rejoue la même chaîne par
/api/live/<id>/source/playlist.m3u8. Le préréglage source garde la vidéo en
copie de flux et ne réencode que l'audio, en AAC — le coût processeur reste
négligeable. La bascule n'est tentée qu'une fois par lecture, et seulement sur
une URL live directe.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5b9eb74a84
commit
de49e8b34d
1 file changed
+39
@@ -289,6 +289,34 @@
|
||||
this.mpegts = player;
|
||||
this._mpegtsIsLive = isLive;
|
||||
|
||||
// mpegts.js ne démuxe que l'AAC et le MP3. Une chaîne diffusée en E-AC3
|
||||
// (stream_type 0x87) ou en AC-3 (0x81) est donc lue sans aucune piste
|
||||
// audio, sans erreur ni avertissement : l'image passe, le son est
|
||||
// simplement absent. On bascule alors sur le chemin HLS, où FFmpeg
|
||||
// réencode systématiquement l'audio en AAC.
|
||||
player.on(mpegts.Events.MEDIA_INFO, function (mediaInfo) {
|
||||
if (self._destroyed || self._audioFallbackDone) return;
|
||||
if (mediaInfo && mediaInfo.hasAudio) return;
|
||||
|
||||
var hlsUrl = self._hlsEquivalent(self.url);
|
||||
if (!hlsUrl) return;
|
||||
|
||||
self._audioFallbackDone = true;
|
||||
self.log('Aucune piste audio démuxée (codec non supporté) — bascule HLS');
|
||||
self.onLoading('Piste audio incompatible — réencodage');
|
||||
|
||||
try {
|
||||
player.unload();
|
||||
player.detachMediaElement();
|
||||
player.destroy();
|
||||
} catch (e) {}
|
||||
self.mpegts = null;
|
||||
|
||||
self.url = hlsUrl;
|
||||
if (self._canPlayNativeHls()) self._playDirect(hlsUrl);
|
||||
else self._startHls();
|
||||
});
|
||||
|
||||
player.on(mpegts.Events.ERROR, function (type, detail) {
|
||||
self.log('Erreur MPEG-TS : ' + type + ' / ' + detail);
|
||||
if (self._destroyed) return;
|
||||
@@ -310,6 +338,17 @@
|
||||
this._attemptPlay();
|
||||
};
|
||||
|
||||
/// `/api/live/<id>.ts` → `/api/live/<id>/source/playlist.m3u8`.
|
||||
///
|
||||
/// Le préréglage `source` garde la vidéo en copie de flux (`-c:v copy`) :
|
||||
/// seul l'audio est réencodé, le coût processeur reste négligeable.
|
||||
/// Renvoie `null` si l'URL n'est pas un flux live direct — rien à tenter.
|
||||
XFPlayer.prototype._hlsEquivalent = function (url) {
|
||||
var match = /^(.*\/api\/live\/)([^/?#]+)\.ts(\?.*)?$/.exec(url);
|
||||
if (!match) return null;
|
||||
return match[1] + match[2] + '/source/playlist.m3u8';
|
||||
};
|
||||
|
||||
// ---------------- Lecture directe ----------------
|
||||
|
||||
XFPlayer.prototype._playDirect = function (url) {
|
||||
|
||||
Reference in new issue
Block a user