HTML5 <audio> textTrack.kind = субтитры cueChange событие, не работающее в FireFox

UPDATE:

В этой проблеме больше не существует FireFox, теперь работает cuechange. Встроенные изображения base64 также отображают.

Оригинальный код - простая реализация MP3-плеера с субтитрами с использованием HTML5 <AUDIO> и нескольких строк JavaScript.

В примере Audio Player HTML есть файл субтитров .VTT со встроенными изображениями с использованием Base64.

ОРИГИНАЛЬНАЯ ПОЧТА НАЧИНАЕТСЯ ЗДЕСЬ

Я использую HTML5 <AUDIO> Player с субтитрами VTT <track>

Плеер и тексты субтитров VTT (с изображениями) отлично работают с Google Chrome версии 35.

Нажмите здесь, чтобы: Ссылка на страницу html, которая работает в Google Chrome, но не FireFox
Теперь эта ссылка работает в Firefox с обходным решением ниже.

FireFox Version 35 может воспроизводить mp3, но субтитры VTT работают неправильно.

События onCueChange и cueChange работают как в Chrome Ни OnCueChange, ни события cueChange не работают в FireFox

Новое обновление, добавленное ниже с помощью простого обходного пути (1/26/16)

OnCueChange встроен в HTML

<track id="trk" kind="subtitles"  onCueChange="cueChange()" srclang="en" src="SeasonsInTheSun.vtt" default />

cueChange Event Listener

track.addEventListener("cuechange", cueChange, false);

Как это работает? Когда время VTT изменяется, audio.track генерирует событие cueChange.
В нижеуказанных речах VTT (2 из 25) событие cueChange должно срабатывать при 00:00:00.001 и 00:00:04.200
Когда событие срабатывает, script затем читает activeCues[0].text
activeCues.text отображается в <div id="lyrics> innerHTML

WEBVTT

00:00:00.001 --> 00:00:04.000
Seasons in the Sun
Terry Jacks
00:00:04.200 --> 00:00:20.000
Goodbye to you, my trusted friend
We've known each other since we were nine or ten
Together we climbed hills and trees

Нажмите здесь для ссылки на полный .vtt

Этот .vtt в дополнение к лирике имеет встроенные изображения base64

ПРИМЕЧАНИЕ. VTT должен обслуживаться с HTTP-заголовком. MIME-тип Content-Type:text/vtt

Я подтвердил через Firebug следующее:

  • Файл VTT загружается с ошибкой.
  • AcvtiveCues имеет правильную длину и текст.
  • Будут загружены 25 реплик из файла VTT и правильные
  • Режим textTrack "показывает"

Полный HTML-код с JavaScript

<!DOCTYPE html>
<head><title>Seasons in the Sun</title>
<style type="text/css">
html,body{padding:0;margin:0;width:100%;min-height:100%;background-color:#000;color:#f0f;}
#lyrics{margin-left:3em;font: 700 2.3em arial,sans-serif;color:#0ff;text-align:center;}
</style></head><body>
<audio id="audio" preload="auto" controls>
<source src="http://islmpeg.s3.amazonaws.com/mp3/TerryJacks-SeasonsInTheSun.mp3" type="audio/mpeg">
<track id="trk" kind="subtitles" srclang="en" src="http://islmpeg.s3.amazonaws.com/mp3/SeasonsInTheSun.vtt" default  />
</audio>
<br/><div id="lyrics"></div><br/>
<script type="text/javascript">
//<![CDATA[
var lyrics = document.getElementById('lyrics');
var audio = document.getElementById('audio');
var track = document.getElementById('trk');
var textTrack = track.track;
track.addEventListener("cuechange", cueChange, false);

function init(){audio.volume = .3;audio.play();}
function cueChange(){
var cues = textTrack.activeCues;
if (cues.length > 0){
lyrics.innerHTML = cues[0].text.replace(/\n/g, '<br>');}}
window.onload = init;
//]]>
</script></body></html>

Обновление работы вокруг
Работает в FireFox и Chrome

Все еще не работает в FireFox 45 (26 января 2016 г.)
UPDATE: cueChange СЕЙЧАС РАБОТАЕТ В FIREFOX
ЭТО НЕ ИМЕЕТ НИКАКОГО НЕОБХОДИМОГО ДЛЯ ПОЖАРНОЙ БЕЗОПАСНОСТИ

Текстовые подписи работают в MS Edge, но не отображают изображения Base64 **
Код не работает в IE 11
Я никогда не пытался запустить его в IE, поскольку я никогда не буду использовать продукт MS, если это абсолютно необходимо, и этот проект предназначен только для меня. Я могу в будущем работать над IE или, возможно, кто-то еще разместил решение для IE.
UPDATE: Не собирается проверять, подходит ли работа с MS-дерьмом.

Я добавил таймер JS для вызова cueChange() каждые 500 миллисекунд

var nIntervId=window.setInterval(function(){cueChange()},500);

Я удалил это, что работало в Chrome:

track.addEventListener("cuechange", cueChange, false); 

Новый обновленный код (UPDATE: больше не требуется)

<!DOCTYPE html>
<head><title>Seasons In The Sun</title>
<style type="text/css">
html,body{padding:0;margin:0;width:100%;min-height:100%;background-color:#000;color:#f0f;}
#lyrics{margin-left:3em;font: 700 2.3em Arial,sans-serif;color:#0ff;text-align:center;}
#html5{display:none;}
</style></head><body><div><div id="html5"><h2>You Browser Does not support Audio Captions<br/>You will not see the lyrics.</h2></div>
<audio id="audio" preload="auto" controls>
<source src="http://islmpeg.s3.amazonaws.com/mp3/TerryJacks-SeasonsInTheSun.mp3" type="audio/mpeg">
<track id="trk" kind="subtitles" srclang="en" src="SeasonsInTheSun.vtt" default  />
</audio>
<br/><div id="lyrics"></div><br/>
<script type="text/javascript">
//<![CDATA[

var lyrics = document.getElementById('lyrics');
var audio = document.getElementById('audio');
var track = document.getElementById('trk');
var textTrack = track.track;
//track.addEventListener("cuechange", cueChange, false);   // oncuechange 
var nIntervId=window.setInterval(function(){cueChange()},500);

function init(){audio.volume = .3;audio.play();cueChange();}
function cueChange(){
  var cues = textTrack.activeCues;
  if (cues.length > 0){
    lyrics.innerHTML = cues[0].text.replace(/\n/g, '<br>');
  }
}
window.onload = init;
//]]>
</script><img width="1" height="1" src="pix.php?p=sits" alt="."/></body></html>

Ответ 1

Firefox по-прежнему (!) не поддерживает oncuechange (начиная с версии v38.0, май 2015 г.). Однако обычно вы можете использовать video.ontimeupdate для достижения почти одного и того же, например:

var videoElement = $("video")[0];
var textTrack = videoElement.textTracks[0];
if (textTrack.oncuechange !== undefined) {
  $(textTrack).on("cuechange", function() { ... });
} else {
  // some browsers don't support track.oncuechange, so...
  $(videoElement).on("timeupdate", function() { ... });
}

Ответ 2

Патчи теперь добавлены в mozilla-inbound, чтобы получить эти стрельбы для медиа-элементов (теперь они работают для видео). Теперь я буду исправлять звуковую сторону, которая просто не срабатывает, потому что нет окна субтитров.

https://hg.mozilla.org/integration/mozilla-inbound/rev/8935a32269a5 https://hg.mozilla.org/integration/mozilla-inbound/rev/e1d06acdeb7b https://hg.mozilla.org/integration/mozilla-inbound/rev/9f4d815bb9af

Ответ 3

Все еще не исправлено с v39, август 2015 года. Здесь уродливое обходное решение, которое я собирал, чтобы проверить изменения в списке activeCues. Он работает как доказательство концепции, теперь мне нужно переписать мой код для браузеров, которые правильно поддерживают onCueChange, поэтому резервное копирование происходит правильно.

var v = document.getElementsByTagName('video')[0];
var t = v.textTracks;
var la = [];
for(l = 0; l < t.length; l++){
    la[l] = '';
};

var onchangeTest =  (function isEventSupported(eventName) {
    var isSupported = ('oncuechange' in t[0]);
    if (isSupported) {
        return true;
    } else {
        return false;
    };
})();

v.ontimeupdate = function(){
    if(!onchangeTest){
        var activeCues ="";
        var delim ="";
        for(i = 0; i < t.length; i++){
            if(t[i].kind == 'captions' || t[i].kind == 'subtitles'){
                delim = "<br />";  
            } else {
                delim = "\n";
            };
            a = v[i].activeCues;
            if(a){
                var tt = '';
                for(ii = 0; ii < a.length; ii++){
                    tt += a[ii].text + delim;  
                    if(tt !== la[i]){
                        la[i] = tt;
                        console.log('tt: ' + tt + ' la[' + i + ']: ' + la[i]);
                    };
                };
            };
        };
    };
};

Ответ 4

Спасибо за ответ от avaunt! Я думаю, что в исходном коде есть опечатка. Когда я тестировал его как в FireFox, так и в IE, он не работал.

Соответствующая строка

a = v[i].activeCues;

и он должен читать

a = t[i].activeCues;

поскольку activeCues является свойством объекта textTracks, а не объекта video. После этого изменения он работает!

Я попытался сделать этот пост ответом на его пост, но система не позволяла мне. Поэтому добавление его в качестве ответа.