2016-05-04 1 views
1

J'ai pris une vidéo mp4, l'ai encodée pour HTTP Live Streaming (HLS) en utilisant ffmpeg - résultant en une série de fichiers myvideo.ts et une playlist myvideo.m3u8 - et j'essaie de la lire en utilisant la balise HTML <video> dans Safari, avec les capacités HLS natives de ce navigateur:Comment faire pour qu'une vidéo HLS (m3u8) soit bouclée dans Safari?

<video id="myvideo" src="myvideo.m3u8" loop="loop"></video> 

Il joue, une fois. Mais malgré l'attribut "loop" dans la balise vidéo, il ne boucle pas. Il reste figé sur la dernière image de la vidéo.

Si je tente de détecter la fin de la vidéo à l'aide d'un écouteur d'événement tel que décrit ici: Detect when an HTML5 video finishes ... cet événement ne semble tirer.

La propriété "en pause" dans javascript (document.getElementById('myvideo').paused) est évaluée comme étant fausse, même après la lecture et l'arrêt de la vidéo. Comment puis-je faire tourner la vidéo dans Safari?

+0

Safari attend probablement que plus de morceaux soient écrits côté serveur. Je recommande de ne pas utiliser la fonctionnalité native HLS, car elle n'est pas disponible dans la plupart des navigateurs. Considérez l'un des gestionnaires JavaScript côté client pour HLS qui utilisent l'API des extensions de source multimédia. Ils peuvent avoir une meilleure gestion de vos circonstances HLS. – Brad

+0

Dans tous les autres navigateurs, j'utilise la bibliothèque "hls.js" de Dailymotion (https://github.com/dailymotion/hls.js), qui fonctionne très bien dans tout sauf Safari. Dans Safari, la lecture bégaie mal, c'est pourquoi j'ai essayé la lecture native dans ce navigateur. – sherlock42

Répondre

0

HLS est destiné à être un flux en direct, donc il ne finit jamais réellement pour boucler automatiquement. J'ai utilisé une minuterie JavaScript comme un hack pour contourner ce problème:

var LOOP_WAIT_TIME_MS = 1000, 
    vid = document.getElementById("myvideo"), 
    loopTimeout; 

vid.addEventListener('play', function() { 
    if (!/\.m3u8$/.test(vid.currentSrc)) return; 
    loopTimeout = window.setTimeout(function() { 
    loopTimeout = null; 
    vid.pause(); 
    vid.play(); 
    }, (vid.duration - vid.currentTime) * 1000 + LOOP_WAIT_TIME_MS); 
}); 

vid.addEventListener('pause', function() { 
    if (!/\.m3u8$/.test(vid.currentSrc)) return; 
    if (loopTimeout) { 
    clearTimeout(loopTimeout); 
    loopTimeout = null; 
    } 
});