Наша платформа запускает веб-приложение React внутри веб-просмотра на Android. Мне нужно создать видео плейлист для этого конкретного приложения. Поскольку нам необходимо поддерживать все диапазоны устройств, мы иногда сталкиваемся с проблемами, которые устройства более высокого уровня или мой браузер могут не замечать. В частности, эта проблема - когда я получаю 9-е видео в своем плейлисте (неважно, какой видеофайл я использую), видео выдает ошибку в обещании воспроизведения: «Запрос play () был прерван вызовом pause (). "
Это знакомая ошибка, но pause () нигде в коде не вызывается. Я думаю, что эта ошибка точна, но то, что вызывает pause (), не ясно. Во время копания кроличьей норы мне любопытно, имеют ли разные устройства какое-то ограничение на количество открытых соединений TCP и т. Д.
Браузер не имеет здесь никаких проблем. Плейлист видео плеера выглядит нетронутым. Просто на устройстве появляется ошибка.
Я пытался играть, приостанавливать, устанавливать currentTime, загружать - во многих вариациях. Что я сейчас устранил некоторые ошибки на устройстве, но этот все еще стоит. Часть кода кажется избыточной - с удовольствием объясню все, что выглядит странно в деталях.
Примечание. Список воспроизведения будет синхронизироваться с другими устройствами, имеющими тот же список воспроизведения. Чтобы синхронизация работала - мне нужно динамически собирать продолжительность списка воспроизведения, поскольку список воспроизведения варьируется по ряду причин - поэтому я рендерил n количества видеоэлементов, чтобы получить метаданные. Элементы видео затем скрываются / видимы и воспроизводятся / приостанавливаются в зависимости от состояния.
Я попытался получить данные - затем отображать только два видеоэлемента за раз (второе видео будет следующим в очереди, чтобы сократить время загрузки между воспроизведением видео), но это не решило проблему.
Видеоэлемент (ы)
<video
className={styles.attractPlayer}
id={`video-${index}`}
key={index}
style={{ visibility: this.props.showPlayer && this.state.playingVideo === index ? 'visible' : 'hidden' }}
src={`${videoSource}.mp4`}
type="video/mp4"
poster={black}
muted
onLoadedMetadata={() => this.getVideoDuration(`video-${index}`)}
onEnded={() => this.handleVideoEnd()}
/>
Функция окончания видео
handleVideoEnd = async () => {
const { playingVideo } = this.state
let nextVideoID = (playingVideo + 1 <= this.playlist.length - 1) ? playingVideo + 1 : 0,
nextVideo = document.getElementById(`video-${nextVideoID}`)
if(nextVideoID === 0) console.log('Playlist restarted')
await this.setState({playingVideo: nextVideoID})
await this.resetFrame(nextVideo)
console.log('Playing video:', this.playlist[nextVideoID], `- Duration:`, Math.floor(nextVideo.duration))
}
Функция сброса кадра (фактически вызывает play ())
resetFrame = async (video, onSync = false) => {
if(video.currentTime > 0) {
video.currentTime = 0
console.warn('Video time reset')
}
if(!onSync) await video.load()
await video.play()
.catch(e => console.warn(`Error Message: ${e.message} | Error Code: ${e.code}`, video))
if(video.paused) console.log('Video is paused')
}
ОЖИДАЕМОЕ ПОВЕДЕНИЕ
Предыдущее видео заканчивается, и начинается следующее. (работает в браузере / старших устройствах). Если список воспроизведения закончен, здесь также есть некоторая логика синхронизации, которая выравнивает все устройства, которые будут воспроизводить видео одновременно для появления. Это работает нормально. Существует запасной вариант: если по какой-либо причине пропущена возможность синхронизации, список воспроизведения будет перезапущен самостоятельно.
АКТУАЛЬНОЕ ПОВЕДЕНИЕ
То же, что и выше, за исключением того, что проблемные устройства выдают ошибку (пауза, прерывающая воспроизведение, код ошибки 20) - в зависимости от устройства, место, в котором оно выходит из строя, является постоянным. Это устройство выходит из строя на 9-м видео каждый раз. Неудачное видео будет воспроизводиться нормально, если его поместить до 9-й дорожки.
Я предполагаю, что видео не может быть воспроизведено, поэтому воспроизведение немедленно приостанавливается и прерывается. Что вызвало бы это, предполагая, что сам файл в порядке?
UPDATE:
Переключено на использование video.js - ошибка, которую он выдает, немного отличается, но соответствует тому, что я подозревал.
«Воспроизведение мультимедиа было прервано из-за проблемы с повреждением или из-за того, что использованный мультимедиа не поддерживал ваш браузер»
Проблема в том, что видео работает нормально, если оно используется ранее в плейлисте ... каждое видео выдает эту же ошибку в одну и ту же точку независимо от: /