Неожиданно приостановлено воспроизведение видеоэлемента на устройстве Android - PullRequest
0 голосов
/ 16 мая 2019

Наша платформа запускает веб-приложение 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 - ошибка, которую он выдает, немного отличается, но соответствует тому, что я подозревал. «Воспроизведение мультимедиа было прервано из-за проблемы с повреждением или из-за того, что использованный мультимедиа не поддерживал ваш браузер» Проблема в том, что видео работает нормально, если оно используется ранее в плейлисте ... каждое видео выдает эту же ошибку в одну и ту же точку независимо от: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...