如何在 Android 上的 flutter video_player 中获取完整的 HLS 视频?

How to get full duration of HLS video in flutter video_player on Android?

我正在尝试在 flutter 中播放 HLS 视频 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 超出该位置。

我可以从播放列表中计算出实际持续时间,但问题是:我如何将该持续时间放入播放器并搜索到其中的任何位置?

经过一些研究:

  • 所有使用下面 video_player 的播放器都具有相同的行为并且没有正确更新播放持续时间(Chewie、YoYo Player、Better 播放器等)
  • 为了更改此行为,您可能需要分叉默认 video_player 实现并在其中添加(或更改)一些代码。里面有一些事件会更新 controller.value 的不同参数,所以你可能只需要在那里某处更新持续时间。我决定稍后再试一次,但不是现在。
  • 扩展默认的 VideoPlayerController 没有帮助,因为它包含许多无法在继承代码中访问的私有变量。
  • 有一个较新的 2.0.0 版本的 video_player 可能解决了这个问题(至少它解决了当 controller.value.isBuffering 总是 false 时的错误),但目前它是在 beta 中,需要具有 null 安全功能的 beta flutter 和 dart sdk。以后代码全部迁移到null safety不会有问题,但是现在需要更新我项目中的很多代码,不保证之后问题就解决了,所以我没有使用它。

最终使用 flutter_playout 完成此任务。它不是基于默认 video_player 并且没有这个错误(但可能有其他错误,需要更多地使用它),并且它有效!