flutter flutter_vlc_player播放视频设置循环播放失效、初始化后获取不到视频宽高

插件:flutter_vlc_player: ^7.4.3

问题1:设置循环播放_controller.setLooping(true);无用。

解决方法:

//vlcPlayer设置循环播放失效,以这种方式失效循环播放
_setLoopListener() async {
  if (_videoController!.value.hasError) {
    esLoadingToast('视频加载失败');
  } else {
    if (_videoController!.value.playingState == PlayingState.ended) {

      _videoController!.stop().then((_) => _videoController!.play());

    }
  }
}

initState(){
super.initState();
_videoController!.addListener(_setLoopListener);
}

问题2:播放器初始化完成但是元数据还未解析完成,导致无法获取到视频的宽高

_videoController?.addOnInitListener((){
 if (_videoController!.value.isInitialized) {//已经初始化
 final size = _videoController!.value.size;
 //打印出来获取到0
 print('width= ${size.with}');
 //打印出来获取到1
 print('aspectRatio= ${_videoController!.value.aspectRatio}');
 }
});

解决方法:

_videoController?.addOnInitListener((){
  _waitForVideoSize();
});

//视频虽然初始化完成但是元数据还未解析完成,使用轮询直到获取到宽高
_waitForVideoSize() {
  if (_videoController!.value.isInitialized) {
    int _attempt = 0;
    Timer.periodic(Duration(milliseconds: 300), (timer) {
      final size = _videoController!.value.size;
      if (size.width > 0 && size.height > 0) {
        timer.cancel(); // 停止轮询
        _totalDuration = _videoController!.value.duration;
        _videoController!.setVolume(0);
        _videoController!.setLooping(true);//VlcPlayer对于网络视频有时生效,有时失败
        double _videoWidth = _videoController!.value.size.width;
        double _videoHeight = _videoController!.value.size.height;
        print('_videoWidth= $_videoWidth  _videoHeight= $_videoHeight');
        print('aspectRatio= ${_videoController!.value.aspectRatio}');
        _sizeWidth = _videoWidth;
        _sizeHeight = _videoHeight;

        double _aspectRatio = _videoHeight / _videoWidth;
        _logic.videoAspectRatio = _aspectRatio;
        print('videoAspectRatio===== ${_logic.videoAspectRatio}');
        _videoController!.play();
        _isVideoInit = true;
        setState(() {});

      }else if(_attempt>= 200){
        timer.cancel();
      }
    });
  }
}
Flutter 开发中,`flutter_vlc_player_plugin.h` 是一个原生 C++/Objective-C 头文件,通常与 iOS 平台上的 VLC 播放器插件相关联。该文件是 `flutter_vlc_player` 插件的一部分,用于实现 Flutter 与原生 iOS 代码之间的桥接,尤其是在播放、控制和事件监听等操作中起到关键作用。 ### 插件结构与职责 `flutter_vlc_player_plugin.h` 文件定义了插件的核心接口和回调机制,使得 Flutter 应用可以通过 MethodChannel 与原生代码进行通信。该文件通常包含如下内容: - 插件类的声明,例如 `FlutterVlcPlayerPlugin`; - 方法调用的处理函数,如 `handleMethodCall`; - 与 VLC 播放器实例交互的函数声明,例如播放、暂停、停止等; - 事件通道(EventChannel)的注册与事件监听器的定义。 ### 常见问题与解决方案 1. **找不到 `flutter_vlc_player_plugin.h` 文件** - 这通常发生在项目配置不完整或插件未正确安装的情况下。确保通过 `pubspec.yaml` 正确添加了 `flutter_vlc_player` 插件,并运行 `flutter pub get` 和 `pod install`(针对 iOS)[^1]。 2. **编译错误:头文件未找到** - 如果 Xcode 报错提示找不到 `flutter_vlc_player_plugin.h`,请检查 iOS 项目中的 `Podfile` 是否包含 VLC 播放器的依赖项,例如 `MobileVLCKit`。此外,确保构建设置中的 Header Search Paths 包含正确的路径。 3. **插件初始化失败** - 若在运行时出现插件初始化失败的问题,可能是由于未正确注册插件类。请确认在 `AppDelegate` 或 `main.m` 中是否调用了 `FlutterVlcPlayerPlugin.registerWith(registrar)`。 4. **方法调用失败或无响应** - 检查 `handleMethodCall` 方法是否正确定义并处理了所有方法名,如 `play`, `pause`, `stop` 等。同时确保在 Flutter 端使用 `MethodChannel` 调用的方法名与原生端一致。 ### 使用指南 在 iOS 原生代码中,`flutter_vlc_player_plugin.h` 文件的使用方式如下: #### 定义插件类 ```objective-c #import <Flutter/Flutter.h> @interface FlutterVlcPlayerPlugin : NSObject<FlutterPlugin> + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar; @end ``` #### 实现方法调用处理 ```objective-c #import "flutter_vlc_player_plugin.h" #import <Flutter/Flutter.h> @implementation FlutterVlcPlayerPlugin + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar { FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"flutter_vlc_player" binaryMessenger:registrar.messenger]; FlutterVlcPlayerPlugin* instance = [[FlutterVlcPlayerPlugin alloc] initWithChannel:channel]; [registrar addMethodCallDelegate:instance channel:channel]; } - (instancetype)initWithChannel:(FlutterMethodChannel*)channel { self = [super init]; if (self) { _channel = channel; } return self; } - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"play" isEqualToString:call.method]) { // 调用 VLC 播放逻辑 result(@"Playing"); } else if ([@"pause" isEqualToString:call.method]) { // 调用 VLC 暂停逻辑 result(@"Paused"); } else { result(FlutterMethodNotImplemented); } } @end ``` ### 调试建议 - 使用 Xcode 的调试工具检查插件是否成功加载; - 在 `handleMethodCall` 中添加日志输出,确保方法调用被正确接收; - 确保 VLC 播放器的依赖库(如 `MobileVLCKit`)已正确链接到项目中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值