2016-05-04 2 views
1

Я взял видео mp4, закодировал его для HTTP Live Streaming (HLS) с помощью ffmpeg, в результате чего появилась серия файлов myvideo.ts и плейлист myvideo.m3u8 - и я пытаюсь воспроизвести его с помощью тега HTML <video> в Safari, с собственными возможностями HLS этого браузера:Как я могу создать видеоролик HLS (m3u8) в Safari?

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

Он играет один раз. Но, несмотря на атрибут «loop» в теге видео, он не зацикливается. Он остается замороженным на последнем кадре видео.

Если я пытаюсь определить конец видео с помощью прослушивателя событий, как описано здесь: Detect when an HTML5 video finishes ... это событие кажется, никогда не срабатывает.

Свойство «приостановлено» в javascript (document.getElementById('myvideo').paused) оценивается как ложное, даже после того, как видео сыграло один раз и остановилось.

Как я могу получить видеоролик в Safari?

+0

Сафари, вероятно, ожидают, что больше блоков будет написано на стороне сервера. Я бы рекомендовал не использовать собственные возможности HLS, поскольку он недоступен в большинстве браузеров. Рассмотрим один из клиентских обработчиков JavaScript для HLS, использующих API расширения источников мультимедиа. Они могут лучше справляться с вашими обстоятельствами HLS. – Brad

+0

Во всех других браузерах я использую библиотеку «hls.js» Dailymotion (https://github.com/dailymotion/hls.js), которая работает очень хорошо во всем, кроме Safari. В Safari воспроизведение сильно заикается, поэтому я пытался воспроизвести собственное воспроизведение в этом браузере. – sherlock42

ответ

0

HLS предназначен для прямого трансляции, поэтому он никогда не «заканчивается», чтобы автоматически зацикливаться. Я использовал JavaScript-таймер в качестве взлома, чтобы обойти это:

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; 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^