Flutter VLC 播放器插件
一款基于 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.INTERNET 的 uses-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 构建配置
- 在
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'
}
}
}
- 创建
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。
-
清理仓库
git clean -xdf -
删除 Flutter 项目根目录中现有的 iOS 文件夹。如果您对 iOS 应用进行了任何自定义更改,请重命名它或将其复制到项目外部。
-
重新创建 iOS 应用:此命令将仅创建支持 Swift 的 iOS 目录。请参阅 https://stackoverflow.com/questions/52244346/how-to-enable-swift-support-for-existing-project-in-flutter
flutter create -i swift . -
请确保根据 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 日的最后一条评论)

