Flutter VLC 播放器插件

Join the chat at https://discord.gg/mNY4fjVk Support me on Patreon

一款基于 VLC 的 Flutter 视频播放器替代方案,支持 iOS 和 Android。

安装

iOS

如果无法查看从外部源加载的媒体,您还应添加以下内容

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

有关更多信息或更精细地控制您的 App Transport Security (ATS) 限制,您应该 阅读 Apple 的文档

请确保 <project root>/ios/Podfile 中的以下行已取消注释

platform :ios, '9.0'

注意:虽然 Flutter 的 video_player 在 iOS 模拟器上无法运行,但此包 (flutter_vlc_player) 在 iOS 模拟器上是完全可用的。

要为外部显示器(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 文件包含 android.permission.INTERNETuses-permission 声明来完成的。

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

由于 Flutter 默认包含此权限,因此该权限可能已在此文件中声明。

请注意,如果您遇到“Cleartext HTTP 流量到 * 是不允许的”,您需要在 AndroidManifest.xml 文件中添加 android:usesClearTextTraffic="true" 标志,或定义一个新的“网络安全配置”文件。有关更多信息,请查看 https://developer.android.com.cn/training/articles/security-config

为了从内部设备存储加载媒体/字幕,您应该按如下方式设置存储权限

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

在某些情况下,您还需要将 android:requestLegacyExternalStorage="true" 标志添加到 AndroidManifest.xml 文件中的 Application 标签,以避免访问被拒绝错误。没有此标志,Android 10 应用无法访问存储。 参考

之后,您可以通过以下方式访问媒体/字幕文件

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

Android 构建配置

  1. android/app/build.gradle

android {
    packagingOptions {
       // Fixes duplicate libraries build issue, 
       // when your project uses more than one plugin that depend on C++ libs.
        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.** { *; }

快速入门

要开始使用该插件,请复制此代码或遵循 `flutter_vlc_player/example` 中的示例项目。

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

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @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
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  VlcPlayerController _videoPlayerController;

  @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
  void dispose() async {
    super.dispose();
    await _videoPlayerController.stopRendererScanning();
    await _videoPlayerController.dispose();
  }

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

录制功能

要开始/停止视频录制,您需要分别调用 startRecording(String saveDirectory)stopRecording() 方法。通过调用停止方法,您可以通过 vlcPlayerController.value.recordPath 获取录制文件的路径。


升级说明

版本 5.0 现有应用升级

要升级到 5.0 版本,您首先需要将现有项目迁移到 Swift。

  1. 清理仓库

    git clean -xdf

  2. 删除 Flutter 项目根目录中现有的 iOS 文件夹。如果您对 iOS 应用进行了任何自定义更改,请重命名它或将其复制到项目外部。

  3. 重新创建 iOS 应用:此命令将仅创建支持 Swift 的 iOS 目录。请参阅 https://stackoverflow.com/questions/52244346/how-to-enable-swift-support-for-existing-project-in-flutter

    flutter create -i swift .

  4. 请确保根据 flutter 工具显示的警告更新项目(更新 Info.plist、Podfile)。

如果您对 iOS 应用进行了任何更改,请使用上述方法重新创建该应用,并将更改的文件复制进去。

请在之后遵循上述说明。

重大更改(从 V4 到 V5)

整个平台已在 v5 中重构。这需要您重构应用以遵循 v5。


已知问题

1) 视频录制功能在 iOS/Android 中存在问题:如果视频在录制过程中达到末尾,底层的 vlckit/libvlc 库无法完成录制过程,我们也无法检索录制的文件。该问题已报告并在此处跟踪:

https://code.videolan.org/videolan/VLCKit/-/issues/394 (请参阅 2020 年 9 月 22 日的最后一条评论)


当前问题

当前问题列表 在此处。发现 bug?打开问题

GitHub

查看 Github