#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 по умолчанию и не имеет этой ошибки (но, вероятно, есть другие, нужно использовать его чаще), и это работает!