Flutter视频播放插件lykluk_vlc_player的使用

Flutter视频播放插件lykluk_vlc_player的使用

lykluk_vlc_player 是一个基于VLC库的视频播放器插件,支持iOS和Android平台。相较于Flutter自带的video_player插件,它提供了更多的功能和更好的性能。

安装

iOS

如果你无法从外部源加载媒体文件,你需要在 Info.plist 文件中添加以下配置:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

确保在 <project root>/ios/Podfile 文件中的以下行未被注释:

platform :ios, '9.0'

为了启用外部显示器(如Chromecast)的VLC投射功能,你还需要添加以下配置:

<key>NSLocalNetworkUsageDescription</key>
<string>Used to search for chromecast devices</string>
<key>NSBonjourServices</key>
<array>
  <string>_googlecast._tcp</string>
</array>

Android

要从互联网加载媒体/字幕文件,你的应用需要 INTERNET 权限。这可以通过确保在 <project root>/android/app/src/main/AndroidManifest.xml 文件中包含以下权限声明来实现:

<uses-permission android:name="android.permission.INTERNET" />

如果遇到“Cleartext HTTP traffic to * is not permitted”的错误,你需要在 AndroidManifest.xml 文件中添加 android:usesClearTextTraffic="true" 标志,或者定义一个新的“网络安全性配置”文件。更多详情请参阅 https://developer.android.com/training/articles/security-config

为了从内部设备存储加载媒体/字幕文件,你需要添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在某些情况下,你还需要在 AndroidManifest.xml 文件的应用程序标签中添加 android:requestLegacyExternalStorage="true" 标志。之后你可以通过以下路径访问媒体/字幕文件:

"/storage/emulated/0/{FilePath}"
"/sdcard/{FilePath}"

Android构建配置

  1. android/app/build.gradle 文件中:
android {
    packagingOptions {
       // 解决重复库构建问题,当项目使用多个依赖于C++库的插件时。
        pickFirst 'lib/**/libc++_shared.so'
    }
   
   buildTypes {
      release {
         minifyEnabled true
         useProguard true
         proguardFiles getDefaultProguardFile(
                 'proguard-android-optimize.txt'),
                 'proguard-rules.pro'
      }
   }
}
  1. 创建 android/app/proguard-rules.pro 文件,并添加以下行:
-keep class org.videolan.libvlc.** { *; }

Android多窗口支持

要在Android应用中启用多窗口支持,你需要在 AndroidManifest.xml 中为主活动添加 android:resizeableActivity 键,以及为应用程序添加 android.allow_multiple_resumed_activities 元数据:

<manifest ...>
  <application ...>
    <activity ...
      android:resizeableActivity="true">
      ...
    </activity>
    ...
    <meta-data
      android:name="android.allow_multiple_resumed_activities"
      android:value="true" />
  </application>
</manifest>

快速开始

要开始使用该插件,你可以复制以下代码或参考 flutter_vlc_player/example 示例项目:

import 'package:flutter/material.dart';
import 'package:flutter_vlc_player/vlc_player_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // 这个小部件是你的应用的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  VlcPlayerController _videoPlayerController;

  Future<void> initializePlayer() async {}

  [@override](/user/override)
  void initState() {
    super.initState();

    _videoPlayerController = VlcPlayerController.network(
      'https://media.w3.org/2010/05/sintel/trailer.mp4',
      hwAcc: HwAcc.FULL,
      autoPlay: false,
      options: VlcPlayerOptions(),
    );
  }

  [@override](/user/override)
  void dispose() async {
    super.dispose();
    await _videoPlayerController.stopRendererScanning();
    await _videoPlayerController.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: Center(
          child: VlcPlayer(
            controller: _videoPlayerController,
            aspectRatio: 16 / 9,
            placeholder: Center(child: CircularProgressIndicator()),
          ),
        ));
  }
}

更多关于Flutter视频播放插件lykluk_vlc_player的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频播放插件lykluk_vlc_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


lykluk_vlc_player 是一个基于 libvlc 的 Flutter 插件,用于在 Flutter 应用中播放视频。它支持多种视频格式和流媒体协议,并且提供了丰富的控制功能。以下是如何在 Flutter 项目中使用 lykluk_vlc_player 的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 lykluk_vlc_player 依赖:

dependencies:
  flutter:
    sdk: flutter
  lykluk_vlc_player: ^0.0.1  # 请查看 pub.dev 以获取最新版本

然后运行 flutter pub get 以安装依赖。

2. 导入插件

在需要使用 lykluk_vlc_player 的 Dart 文件中导入插件:

import 'package:lykluk_vlc_player/lykluk_vlc_player.dart';

3. 初始化播放器

initState 方法中初始化播放器:

class VideoPlayerScreen extends StatefulWidget {
  @override
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  LyklukVlcPlayerController? _controller;

  @override
  void initState() {
    super.initState();
    _controller = LyklukVlcPlayerController();
    _controller?.initialize();
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Player'),
      ),
      body: Center(
        child: LyklukVlcPlayer(
          controller: _controller!,
          url: 'https://www.example.com/video.mp4', // 替换为你的视频 URL
        ),
      ),
    );
  }
}

4. 控制播放器

你可以通过 LyklukVlcPlayerController 来控制视频的播放、暂停、停止、调整音量等操作。例如:

FlatButton(
  onPressed: () {
    _controller?.play();
  },
  child: Text('Play'),
),
FlatButton(
  onPressed: () {
    _controller?.pause();
  },
  child: Text('Pause'),
),
FlatButton(
  onPressed: () {
    _controller?.stop();
  },
  child: Text('Stop'),
),

5. 处理播放器事件

你可以监听播放器的各种事件,例如播放状态、错误信息等:

_controller?.onPlayerStateChanged.listen((state) {
  print('Player state: $state');
});

_controller?.onPlayerError.listen((error) {
  print('Player error: $error');
});

6. 自定义播放器UI

你可以通过 LyklukVlcPlayercontroller 来获取播放器的状态,并根据需要自定义播放器的 UI。例如,显示当前播放时间、总时长、播放进度等。

StreamBuilder<Duration>(
  stream: _controller?.onPositionChanged,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text('Position: ${snapshot.data}');
    } else {
      return Text('Position: 0:00');
    }
  },
),
StreamBuilder<Duration>(
  stream: _controller?.onDurationChanged,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text('Duration: ${snapshot.data}');
    } else {
      return Text('Duration: 0:00');
    }
  },
),

7. 其他功能

lykluk_vlc_player 还支持其他功能,例如调整音量、设置播放速度、截图等。你可以查阅插件的文档以获取更多信息。

8. 处理平台特定配置

在某些情况下,你可能需要在 AndroidiOS 项目中进行一些额外的配置。例如,在 Android 项目中,你可能需要在 AndroidManifest.xml 中添加网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

iOS 项目中,你可能需要在 Info.plist 中添加以下配置以允许播放网络视频:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>
回到顶部