Как получить полную продолжительность видео HLS в flutter video_player на Android?

#flutter #flutter-video-player #flutter-android

#flutter #flutter-video-player #flutter-android

Вопрос:

Я пытаюсь воспроизвести видео HLS в flutter video_player. Я создаю файл m3u8 следующим образом:

 #EXT-X-VERSION:4
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1609034710
#EXT-X-PLAYLIST-TYPE:EVENT
#EXTINF:10.0,
video_part1.ts
#EXTINF:10.0,
video_part2.ts
#EXTINF:10.0,
video_part3.ts
#EXTINF:10.0,
video_part4.ts
#EXTINF:10.0,
video_part5.ts

... // etc.
 

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

Видео воспроизводится нормально, но когда я проверяю controller.value.duration , оно всегда показывает 50 секунд — продолжительность первого списка воспроизведения перед любыми обновлениями, и это не позволяет мне выходить за seekTo пределы этой позиции.

Я могу посчитать реальную продолжительность из списка воспроизведения, но вопрос в следующем: как я могу поместить эту продолжительность в проигрыватель и искать в нем любую позицию?

Ответ №1:

После некоторых исследований:

  • Все проигрыватели, использующие video_player снизу, ведут себя одинаково и неправильно обновляют продолжительность воспроизведения (Chewie, YoYo Player, Better player и т. Д.)
  • Для того, чтобы изменить это поведение, вам, вероятно, потребуется разветвить реализацию video_player по умолчанию и добавить (или изменить) некоторый код внутри нее. Есть некоторые события, внутри которых обновляются разные параметры controller.value , поэтому вам, вероятно, просто нужна продолжительность обновления где-то там. Я решил попробовать позже, но не сейчас.
  • Расширение VideoPlayerController по умолчанию не помогает, так как содержит множество частных переменных, к которым нельзя получить доступ в унаследованном коде.
  • Существует более новая версия 2.0.0 video_player, которая, вероятно, решает эту проблему (по крайней мере, она устраняет ошибку, когда controller.value.isBuffering всегда false ), но на данный момент она находится в бета-версии и требует бета-версии flutter и dart sdk с функцией безопасности null. Это не будет проблемой в будущем, когда весь код перейдет на нулевую безопасность, но теперь это требует обновления большого количества моего кода в проекте и не гарантирует, что проблема будет решена, поэтому я не использовал его.

В итоге я использовал flutter_playout для этой задачи. Он НЕ основан на video_player по умолчанию и не имеет этой ошибки (но, вероятно, есть другие, нужно использовать его чаще), и это работает!