Android video.duration не загружается до тех пор, пока video.play()

У меня есть видео html5, в котором я пытаюсь настроить обратные вызовы через определенные промежутки времени во время воспроизведения. Видео начинает воспроизводиться из javascript с video.play(). Прямо сейчас мой код прослушивает событие 'loadedmetadata', затем запрашивает продолжительность и устанавливает эти обратные вызовы. Отлично работает на мобильном сафари, но не на Android (2.3.4 и 2.3.7).

На Android 'loadedmetadata', кажется, испускается до того, как продолжительность действительно доступна. Чтобы проверить это, я записал продолжительность каждого шага процесса загрузки в своем коде, чтобы увидеть, где ее можно прочитать. До video.play() и после одного события 'timeupdate' свойство video.duration равно 6000, независимо от используемого видео. Я проверил это с файлом mp4 и файлом 3gp. После выполнения этих условий становится доступна фактическая продолжительность.

Я нашел этот другой пост с похожими проблемами [1]. Ответ с наибольшим количеством голосов, который не был принят, - это то, как я изначально настроил это, и он отлично работает на iOS. Принятый ответ также не работает и предполагает, что это проблема вебкита. Я регистрирую свойство video.readyState и вижу, что оно равно '4' до того, как видео начнет воспроизводиться, но продолжительность по-прежнему недоступна до тех пор, пока оно не начнет воспроизводиться, и первое событие 'timeupdate'.

Наш текущий обходной путь — запрашивать значение video.duration и настраивать обратные вызовы событий только тогда, когда video.duration !== 6000. Это довольно уродливо, и я хотел бы добраться до сути, чтобы этот хак не вернулся к укусу. Обсуждение здесь [2], по-видимому, предполагает, что проблема может быть связана с кодировкой. То есть, не закодированный должным образом, андроид не читает метаданные правильно, пока файл не будет загружен, или, возможно, вообще, и он вычисляет продолжительность другим способом.

Есть ли что-нибудь, что я могу сделать, чтобы сделать это чище, или я пока застрял с хаком?

[1] Проблема с получением продолжительности видео HTML5

[2] http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/


person brodney    schedule 26.03.2012    source источник
comment
Я использовал прослушиватель v.addEventListener('durationchange', repos, false); для отслеживания изменений, но да... похоже, что это проблема WebView/Video во многих сборках Android.   -  person Offbeatmammal    schedule 11.03.2013
comment
Мобильное устройство имеет свои ограничения, поэтому они не загружают все, что делает настольный браузер, в браузере Android видео не вызывается до тех пор, пока вы не воспроизведете, так как это сэкономит пропускную способность и уменьшит использование памяти/буфера. Я думаю, здесь вы можете сделать он воспроизводится по умолчанию, а затем использует скрипт, который останавливает видео через 1-2 секунды... это должно служить вашей цели..   -  person MarmiK    schedule 16.07.2013


Ответы (1)


Id использует setTimeout, который вызывает функцию, чтобы проверить, доступна ли продолжительность рекурсивно.

Таким образом, функция может, как только будет доступна какая-либо информация, отобразить и т. д. продолжительность.

person David Fariña    schedule 17.07.2013