Flutter视频播放插件android_vlc_player的使用
Flutter视频播放插件android_vlc_player的使用
特性
- 从您的Flutter应用启动VLC播放器
- 在运行VLC的任何Android设备上工作
支持的Mime类型
- video/*
- audio/*
- */rmvb
- */avi
- */mkv
- application/3gpp*
- application/mp4
- application/mpeg*
- application/ogg
- application/sdp
- application/vnd.3gp*
- application/vnd.apple.mpegurl
- application/vnd.dvd*
- application/vnd.dolby*
- application/vnd.rn-realmedia*
- application/x-iso9660-image
- application/x-extension-mp4
- application/x-flac
- application/x-matroska
- application/x-mpegURL
- application/x-ogg
- application/x-quicktimeplayer
- application/x-shockwave-flash
- application/xspf+xml
- misc/ultravox
安装
运行以下命令以安装包:
flutter pub add android_vlc_player
如何使用它
创建新的AndroidVLCPlayer
实例:
final _androidVlcPlayer = AndroidVlcPlayer();
启动播放器:
_androidVlcPlayer.startVLCPlayer(
file: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
mimeType: "video/*",
title: "Test",
);
查看示例应用。
许可证
BSD 3-Clause License
版权所有 (c) 2023 Djeddi Yacine
保留所有权利。
根据以下条件,允许重新分发源代码和二进制形式:
1. 源代码的重新分发必须保留上述版权声明、本条件列表和以下免责声明。
2. 二进制形式的重新分发必须在文档和/或其他随附材料中复制上述版权声明、本条件列表和以下免责声明。
3. 不得使用版权持有者或其贡献者的名称来支持或推广源自此软件的产品,除非事先获得书面许可。
本软件按“原样”提供,不作任何明示或暗示的保证,包括但不限于适销性和特定用途适用性的暗示保证。在任何情况下,版权持有者或贡献者均不对因使用本软件而引起的直接、间接、特殊、示例性或后果性损害(包括但不限于替代商品或服务的采购、数据或利润损失或业务中断)承担责任,无论是在合同诉讼、严格责任还是侵权(包括疏忽或其他方式)中,即使已被告知可能造成此类损害的可能性。
示例代码
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:android_vlc_player/android_vlc_player.dart';
void main() {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
useMaterial3: true,
),
home: ScaffoldMessenger(
child: Scaffold(
appBar: AppBar(
title: const Text('VLC Plugin Example'),
),
body: const MyApp(),
),
),
);
}
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _androidVlcPlayerPlugin = AndroidVlcPlayer();
bool? _vlc;
final TextEditingController _videoController = TextEditingController();
final TextEditingController _mimeController = TextEditingController();
final TextEditingController _titleController = TextEditingController();
Future<void> vlc({
required String file,
required String mimeType,
required String title,
}) async {
bool vlc;
try {
vlc = await _androidVlcPlayerPlugin.startVLCPlayer(
file: file,
mimeType: mimeType,
title: title,
) ??
false;
} on PlatformException {
vlc = false;
}
setState(() {
_vlc = vlc;
});
}
@override
void initState() {
super.initState();
_videoController.clear();
_mimeController.clear();
_titleController.clear();
}
@override
void dispose() {
_videoController.dispose();
_mimeController.dispose();
_titleController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Center(
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('是否安装了VLC: ${_vlc.toString()}\n'),
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: TextField(
controller: _videoController,
decoration: const InputDecoration(
hintText: "视频URL",
border: OutlineInputBorder(),
),
onSubmitted: (url) {
if (url.isNotEmpty) {
_videoController.text = url;
}
},
),
),
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: TextField(
controller: _mimeController,
decoration: const InputDecoration(
hintText: "Mime类型",
border: OutlineInputBorder(),
),
onSubmitted: (mime) {
if (mime.isNotEmpty) {
_mimeController.text = mime;
}
},
),
),
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: TextField(
controller: _titleController,
decoration: const InputDecoration(
hintText: "标题",
border: OutlineInputBorder(),
),
onSubmitted: (title) {
if (title.isNotEmpty) {
_titleController.text = title;
}
},
),
),
ElevatedButton(
onPressed: () {
if (_videoController.value.text.isNotEmpty &&
_mimeController.value.text.isNotEmpty &&
_titleController.value.text.isNotEmpty) {
vlc(
file: _videoController.value.text,
mimeType: _mimeController.value.text,
title: _titleController.value.text,
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("请输入视频信息以开始VLC播放"),
),
);
}
},
child: const Text("开始VLC"),
),
],
),
),
),
);
}
}
示例代码解释
-
导入必要的库:
import 'package:flutter/material.dart'; import 'dart:async'; import 'package:flutter/services.dart'; import 'package:android_vlc_player/android_vlc_player.dart';
-
创建主应用类:
void main() { runApp(const App()); } class App extends StatelessWidget { const App({super.key}); @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( useMaterial3: true, ), home: ScaffoldMessenger( child: Scaffold( appBar: AppBar( title: const Text('VLC Plugin Example'), ), body: const MyApp(), ), ), ); } }
-
创建包含VLC播放器功能的状态管理类:
class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { final _androidVlcPlayerPlugin = AndroidVlcPlayer(); bool? _vlc; final TextEditingController _videoController = TextEditingController(); final TextEditingController _mimeController = TextEditingController(); final TextEditingController _titleController = TextEditingController(); Future<void> vlc({ required String file, required String mimeType, required String title, }) async { bool vlc; try { vlc = await _androidVlcPlayerPlugin.startVLCPlayer( file: file, mimeType: mimeType, title: title, ) ?? false; } on PlatformException { vlc = false; } setState(() { _vlc = vlc; }); } @override void initState() { super.initState(); _videoController.clear(); _mimeController.clear(); _titleController.clear(); } @override void dispose() { _videoController.dispose(); _mimeController.dispose(); _titleController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Center( child: SingleChildScrollView( physics: const BouncingScrollPhysics(), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text('是否安装了VLC: ${_vlc.toString()}\n'), Padding( padding: const EdgeInsets.only(bottom: 10.0), child: TextField( controller: _videoController, decoration: const InputDecoration( hintText: "视频URL", border: OutlineInputBorder(), ), onSubmitted: (url) { if (url.isNotEmpty) { _videoController.text = url; } }, ), ), Padding( padding: const EdgeInsets.only(bottom: 10.0), child: TextField( controller: _mimeController, decoration: const InputDecoration( hintText: "Mime类型", border: OutlineInputBorder(), ), onSubmitted: (mime) { if (mime.isNotEmpty) { _mimeController.text = mime; } }, ), ), Padding( padding: const EdgeInsets.only(bottom: 10.0), child: TextField( controller: _titleController, decoration: const InputDecoration( hintText: "标题", border: OutlineInputBorder(), ), onSubmitted: (title) { if (title.isNotEmpty) { _titleController.text = title; } }, ), ), ElevatedButton( onPressed: () { if (_videoController.value.text.isNotEmpty && _mimeController.value.text.isNotEmpty && _titleController.value.text.isNotEmpty) { vlc( file: _videoController.value.text, mimeType: _mimeController.value.text, title: _titleController.value.text, ); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text("请输入视频信息以开始VLC播放"), ), ); } }, child: const Text("开始VLC"), ), ], ), ), ), ); } }
更多关于Flutter视频播放插件android_vlc_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频播放插件android_vlc_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用android_vlc_player
插件来播放视频的示例代码。这个插件允许你使用VLC媒体播放器在Android设备上播放视频。
1. 添加依赖
首先,你需要在你的Flutter项目的pubspec.yaml
文件中添加android_vlc_player
的依赖:
dependencies:
flutter:
sdk: flutter
android_vlc_player: ^3.2.13 # 请检查最新版本号
2. 导入插件
在你的Dart文件中(例如main.dart
),导入android_vlc_player
插件:
import 'package:flutter/material.dart';
import 'package:android_vlc_player/video_player_controller.dart';
import 'package:android_vlc_player/video_player_view.dart';
3. 创建视频播放器页面
下面是一个完整的Flutter页面示例,展示如何使用android_vlc_player
来播放视频:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter VLC Player Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: VideoPlayerScreen(),
);
}
}
class VideoPlayerScreen extends StatefulWidget {
@override
_VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}
class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
late VideoPlayerController _controller;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.network(
'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
// 你可以替换为其他视频URL
autoPlay: true,
options: VlcPlayerOptions(
hwAcc: VlcHwAcc.full,
),
)..initialize().then((_) {
// 播放器初始化完成后可以执行一些操作
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('VLC Player Demo'),
),
body: Center(
child: _controller.value.isInitialized
? VideoPlayerView(_controller)
: Container(
child: CircularProgressIndicator(),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
if (_controller.value.isPlaying) {
_controller.pause();
} else {
_controller.play();
}
});
},
tooltip: _controller.value.isPlaying ? 'Pause' : 'Play',
child: Icon(
_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
);
}
}
4. 运行应用
确保你已经连接了Android设备或启动了Android模拟器,然后在你的项目根目录下运行以下命令来启动应用:
flutter run
这个示例展示了如何创建一个简单的Flutter应用,使用android_vlc_player
插件来播放网络视频。你可以根据需要进一步自定义和扩展这个示例,例如添加更多的控制按钮(如停止、全屏、音量控制等)。