Мы не могли понять, почему приложение зависало именно на iOS 12, и нам нужно было быстро найти решение, так как приближался крайний срок, мы решили написать собственный компонент, отображающий субтитры.
Мы использовали пакет subtitle
для разбора файлов vtt: npm install subtitle --save
Компонент Subtitles.jsx
:
import React, { PureComponent } from "react";
import PropTypes from "prop-types"
import * as Subtitle from 'subtitle';
class Subtitles extends PureComponent {
constructor(props) {
super(props);
this.vtt = [];
}
componentDidMount() {
if (this.props.lang) {
this.loadVTT(this.props.lang);
}
}
componentDidUpdate(prevProps, prevState, snapshot) {
if (prevProps.lang !== this.props.lang) {
this.loadVTT(this.props.lang);
}
}
loadVTT(lang) {
fetch(`path_to_subtitles_directory/${lang}.vtt`)
.then(response => response.text())
.then(response => {
this.vtt = Subtitle.parse(response);
})
}
render() {
const { time} = this.props;
// find subtitle text to be displayed at the video's current time
const subtitleLine = this.vtt.find(function(element) {
return time > element.start && time < element.end;
});
return (
<div>
{subtitleLine && (
<div dangerouslySetInnerHTML={{__html: subtitleLine.text}} />
)}
</div>
);
}
}
Subtitles.propTypes = {
time: PropTypes.number,
lang: PropTypes.string,
};
export default Subtitles;
Теперь мы можем просто визуализировать компонент Subtitles из нашего видео
<Subtitles
lang={subtitleLanguage}
time={elapsedVideoTime}
/>
Предоставленное свойство elapsedVideoTime
будет представлять собой истекшее время видео в миллисекундах, которое можно получить из элемента video с помощью события timeupdate
.
Это просто обходной путь для другой проблемы. Если кто-нибудь знает, как действительно решить проблему, я буду рад услышать решение На данный момент это работает для нашего варианта использования.