如何使用better_player包从URL链接中检测获取视频时长
基于better_player获取网络视频URL时长的实现方案
以下两种方案均不需要渲染播放器视图,仅后台预加载视频元数据即可获取时长,流量消耗极低:
方案1:使用better_player自带控制器实现
better_player本身基于video_player封装,可直接通过其控制器获取元数据,适配你现有的better_player依赖,无需额外引入其他包:
import 'package:better_player/better_player.dart'; import 'package:flutter/services.dart'; Future<Duration?> getVideoDuration(String videoUrl, {Map<String, String>? headers}) async { try { final dataSource = BetterPlayerDataSource( BetterPlayerDataSourceType.network, videoUrl, headers: headers ?? {}, ); final controller = BetterPlayerController( const BetterPlayerConfiguration( autoPlay: false, controlsConfiguration: BetterPlayerControlsConfiguration( showControls: false, ), ), betterPlayerDataSource: dataSource, ); await controller.videoPlayerController?.initialize(); final videoDuration = controller.videoPlayerController?.value.duration; controller.dispose(); return videoDuration; } catch (e) { if (e is PlatformException) { print("视频时长获取失败:${e.message}"); } return null; } }
使用说明
- 直接调用异步方法传入视频URL即可,返回的
Duration对象可通过inSeconds属性获取秒级时长,也可自行格式化为时分秒格式 - 如果你的视频需要鉴权,调用时传入和正常播放视频一致的请求头即可
方案2:直接使用底层video_player依赖实现
better_player默认已依赖video_player包,无需额外安装,方案更轻量:
import 'package:video_player/video_player.dart'; Future<Duration?> getVideoDuration(String videoUrl, {Map<String, String>? headers}) async { final controller = VideoPlayerController.networkUrl( Uri.parse(videoUrl), httpHeaders: headers ?? {}, ); try { await controller.initialize(); final duration = controller.value.duration; controller.dispose(); return duration; } catch (e) { controller.dispose(); print("视频时长获取失败:$e"); return null; } }
注意事项
- 需确保应用已配置网络权限:安卓端在
AndroidManifest.xml中添加INTERNET权限,iOS端在Info.plist中配置允许HTTP请求(如果视频链接是非HTTPS的) - 若返回null优先排查视频链接有效性、是否过期、鉴权头是否正确
内容的提问来源于stack exchange,提问作者salem kazem
相关产品推荐
相关产品推荐

