Flutter音视频播放插件byteark_player_flutter的使用
Flutter音视频播放插件byteark_player_flutter的使用
ByteArk Player插件是一个为无缝集成到Flutter应用而设计的强大且灵活的视频播放包。该插件提供了流畅的视频播放体验,支持各种媒体格式,并且高度可定制以满足您的应用需求。无论您正在开发媒体应用、教育平台还是任何需要视频播放功能的项目,ByteArk Player都能让这一切变得简单。
免责声明
这是ByteArk Player的非商业版本。商业用途和/或商业支持需要许可证。如有需要,请联系 sales@byteark.com 获取更多关于我们解决方案的信息。
Android | iOS | |
---|---|---|
支持 | SDK 21+ | 14.0+ |
安装
使用此包将ByteArk Player插件集成到您的项目中。请遵循以下针对Flutter、Android和iOS平台的说明。
Flutter集成
添加依赖
-
在终端运行以下命令以添加ByteArk Player插件到您的项目:
$ flutter pub add byteark_player_flutter
这条命令会自动更新您的
pubspec.yaml
文件以包含ByteArk Player包,并运行flutter pub get
命令。或者,您也可以手动在
pubspec.yaml
文件的dependencies
下添加以下行:dependencies: byteark_player: ^1.0.6 // 请替换为最新版本的插件。
如果您手动编辑了
pubspec.yaml
文件,可以运行以下命令来获取新的依赖项:$ flutter pub get
导入并使用ByteArk Player小部件
- 现在,您可以在Dart代码中导入并开始使用ByteArk Player插件:
import 'package:byteark_player_flutter/presentation/byteark_player.dart'; . . ByteArkPlayer(playerConfig: playerConfig)
iOS配置
要使用CocoaPods将ByteArk Player集成到您的Flutter iOS项目中,请按以下步骤操作:
-
如果您尚未为GitHub帐户设置SSH密钥,请先按照Github网站上的文档添加一个新的SSH密钥(文档链接已去掉)。
-
打开
Podfile
- 导航到您的iOS项目目录并打开
Podfile
,然后在文件中添加以下代码:// 设置平台为iOS 14 platform :ios, '14.0' . . . // 指定CocoaPods应从中获取所需依赖项的源: source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/byteark/byteark-player-sdk-ios-specs.git' source 'https://github.com/byteark/lighthouse-sdk-native-ios-specs.git'
- 导航到您的iOS项目目录并打开
-
安装Pods
- 打开终端窗口并导航到您的Flutter项目的
ios
目录,运行以下命令以安装CocoaPods依赖项并更新仓库:pod install --repo-update
- 打开终端窗口并导航到您的Flutter项目的
-
打开工作区
- 运行
pod install --repo-update
后,CocoaPods将创建一个Xcode工作区文件(.xcworkspace
),请在Xcode中打开此工作区。
- 运行
-
构建并运行
- 在进行上述更改后,请构建并运行您的项目到iOS模拟器或物理设备上以验证集成。
Android配置
要将ByteArk Player集成到您的Flutter Android项目中,请按以下步骤操作:
-
修改
AndroidManifest.xml
- 导航到
android/app/src/main/AndroidManifest.xml
并进行以下更改:- 添加所需的权限以允许网络访问、前台服务和启动接收。在
<manifest>
内添加以下行:<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- 使用
@style/Theme.AppCompat
属性设置android:resource
以使用<activity>
内的主题。这允许您应用与FlutterFragmentActivity
兼容的主题,例如@style/Theme.AppCompat
或其他基于AppCompat
或MaterialComponents
的主题。<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/Theme.AppCompat"/>
- 在
<application>
内添加ByteArk Player服务以启用媒体浏览和服务功能:<!-- ByteArk --> <service android:name="com.byteark.bytearkplayercore.handler.exoplayer.service.ByteArkPlayerService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="androidx.media3.session.MediaLibraryService"/> <action android:name="android.media.browse.MediaBrowserService" /> </intent-filter> </service>
- 在
<application>
内添加Nielsen以启用Nielsen服务功能:<!--Nielsen--> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713"/>
- 添加所需的权限以允许网络访问、前台服务和启动接收。在
- 导航到
-
更新主活动
- 导航到
android/app/src/main/kotlin/com/example/your_project_name/MainActivity.kt
并更新主活动:- 继承
FlutterFragmentActivity()
以确保正确的集成:import io.flutter.embedding.android.FlutterFragmentActivity class MainActivity: FlutterFragmentActivity()
- 继承
- 导航到
-
配置本地属性
- 在
android/local.properties
文件中,设置ByteArk Player和ByteArk LightHouse的GitLab私有令牌。 - 添加以下行,用您从ByteArk团队获得的令牌替换
[YOUR_PRIVATE_TOKEN]
:gitLabByteArkPlayerPrivateToken=[YOUR_PRIVATE_TOKEN] gitLabByteArkLighthousePrivateToken=[YOUR_PRIVATE_TOKEN]
- 在
-
构建并运行
- 在进行上述更改后,请构建并运行您的项目到Android模拟器或物理设备上以验证集成。
使用
以下是使用ByteArk Player小部件在Flutter应用中播放视频的基本示例:
import 'package:byteark_player_flutter/data/byteark_player_license_key.dart';
import 'package:byteark_player_flutter/domain/method_channel/byteark_player_controller.dart';
import 'package:flutter/material.dart';
import 'package:byteark_player_flutter/data/byteark_player_config.dart';
import 'package:byteark_player_flutter/data/byteark_player_item.dart';
import 'package:byteark_player_flutter/presentation/byteark_player.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late ByteArkPlayerController _controller;
@override
void initState() {
// 初始化ByteArkPlayerController。
_controller = ByteArkPlayerController();
super.initState();
}
@override
void dispose() {
// 释放ByteArkPlayerController资源。
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
// 步骤1: 设置ByteArkPlayerItem。
var playerItem = ByteArkPlayerItem(
url:
"https://byteark-playertzxedwv.stream-playlist.byteark.com/streams/TZyZheqEJUwC/playlist.m3u8");
// 步骤2: 设置ByteArkPlayerConfig。
var playerConfig = ByteArkPlayerConfig(
licenseKey: ByteArkPlayerLicenseKey(
android: "ANDROID_LICENSE_KEY", iOS: "IOS_LICENSE_KEY"),
playerItem: playerItem);
return MaterialApp(
title: 'ByteArk Player Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: Scaffold(
appBar: AppBar(
title: const Text('ByteArk Player Demo'),
centerTitle: true,
),
body: Column(
children: [
// 步骤3: 嵌入ByteArk Player小部件。
AspectRatio(
aspectRatio: 16 / 9,
child: ByteArkPlayer(
playerConfig: playerConfig,
height: 300,
),
),
],
),
),
);
}
}
播放器配置
ByteArkPlayerItem
ByteArkPlayerItem
类表示要在ByteArk Player中播放的媒体项。它包含必要的元数据和属性,用于配置和显示媒体内容。
class ByteArkPlayerItem {
final String? mediaId; // 媒体项的唯一标识符。
final String? posterImage; // 与媒体项关联的海报图像URL。
final String? title; // 媒体项的标题。
final String? subtitle; // 媒体项的副标题或描述。
final String? url; // 媒体内容的URL(例如视频或音频)。
final String? shareUrl; // 媒体项的分享URL。
final ByteArkNielsenMetaData? nielsenMetaData; // 与媒体项关联的尼尔森元数据。
final ByteArkDrm? drm; // 媒体项的数字版权管理设置。
}
属性名称 | 类型 | 描述 |
---|---|---|
mediaId |
String? | 媒体项的唯一标识符,用于跟踪和引用。 |
posterImage |
String? | 与媒体项关联的海报图像URL,用于在播放器UI中显示。 |
title |
String? | 媒体项的标题,可能在播放器界面中显示。 |
subtitle |
String? | 媒体项的副标题或描述,向用户提供额外上下文。 |
url (必需) |
String? | 媒体内容的URL(例如视频或直播),播放器从中获取媒体进行播放。 |
shareUrl |
String? | 特定于分享媒体项的URL,允许用户轻松与其他用户共享内容。 |
nielsenMetaData |
ByteArkNielsenMetaData? | 包含与媒体项关联的尼尔森元数据,用于分析和跟踪目的。 |
drm |
ByteArkDrm? | 包含媒体项的数字版权管理设置,确保适当的内容保护。 |
ByteArkPlayerConfig
ByteArkPlayerConfig
类用于配置ByteArk Player的各种设置和功能。每个属性都可以设置以自定义播放器的行为和外观。
class ByteArkPlayerConfig {
final ByteArkPlayerLicenseKey licenseKey; // 播放器的许可证密钥,包含Android和iOS密钥。
final bool? autoPlay; // 当播放器准备就绪时自动开始播放。
final bool? backButton; // 显示返回按钮以导航返回。
final VoidCallback? backButtonAction; // 返回按钮被按下时执行的操作。
final bool? control; // 显示播放控制(播放、暂停等)在UI上。
final bool? muted; // 开始播放时将播放器静音。
final bool? pictureInPicture; // 启用画中画模式。
final bool? seekButtons; // 显示用于导航媒体的搜索按钮。
final int? seekTime; // 搜索前进或后退的时间间隔(秒)。
final ByteArkPlayerItem? playerItem; // 要播放的媒体项。
final ByteArkPlayerPlaylist? playlist; // 播放列表中的媒体项。
final bool? shareButton; // 显示一个按钮以分享媒体。
final bool? fullScreenButton; // 显示一个按钮以切换全屏模式。
final bool? settingButton; // 控制是否显示设置按钮以调整播放器选项。
final bool? secureSurface; // 启用安全表面以进行播放(例如,用于DRM)。
final bool? allowBackgroundPlaying; // 允许后台播放。
final ByteArkPlaybackSetting? playbackSetting; // 自定义播放设置(例如速度)。
final ByteArkNielsenSetting? nielsenSetting; // 尼尔森跟踪设置与媒体消费有关。
final ByteArkLighthouseSetting? lighthouseSetting; // Lighthouse跟踪设置与媒体消费有关。
final ByteArkChromeCastSetting? chromeCastSetting; // Chromecast设置与流媒体有关。
final ByteArkAdsInsertionSetting? adsInsertionSetting; // 设置在播放期间插入广告。
final ByteArkAdsSettings? adsSettings; // 播放器的一般广告设置。
}
属性名称 | 类型 | 描述 |
---|---|---|
licenseKey (必需) |
ByteArkPlayerLicenseKey | 播放器的许可证密钥,包含Android和iOS密钥。 |
autoPlay |
bool? | 当播放器准备就绪时自动开始播放。 |
backButton |
bool? | 是否显示返回按钮以导航返回。 |
backButtonAction |
VoidCallback? | 返回按钮被按下时执行的操作。 |
control |
bool? | 是否显示播放控制(播放、暂停等)在UI上。 |
muted |
bool? | 播放器是否开始时静音。 |
pictureInPicture |
bool? | 启用画中画模式。 |
seekButtons |
bool? | 控制是否显示用于导航媒体的搜索按钮。 |
seekTime |
int? | 搜索前进或后退的时间间隔(秒)。 |
playerItem (必需) |
ByteArkPlayerItem? | 要播放的媒体项。 |
playlist |
ByteArkPlayerPlaylist? | 播放列表中的媒体项。 |
shareButton |
bool? | 是否显示一个按钮以分享媒体。 |
fullScreenButton |
bool? | 是否显示一个按钮以切换全屏模式。 |
settingButton |
bool? | 控制是否显示设置按钮以调整播放器选项。 |
secureSurface |
bool? | 启用安全表面以进行播放,这对于DRM内容很有用。 |
allowBackgroundPlaying |
bool? | 允许后台播放。 |
playbackSetting |
ByteArkPlaybackSetting? | 包含自定义播放设置(例如速度)。 |
nielsenSetting |
ByteArkNielsenSetting? | 定义与媒体消费相关的尼尔森跟踪设置。 |
lighthouseSetting |
ByteArkLighthouseSetting? | 包含与媒体消费相关的Lighthouse跟踪设置。 |
chromeCastSetting |
ByteArkChromeCastSetting? | 定义与Chromecast集成和功能相关的设置。 |
adsInsertionSetting |
ByteArkAdsInsertionSetting? | 指定在媒体播放期间插入广告的设置。 |
adsSettings |
ByteArkAdsSettings? | 包含播放器的一般广告设置。 |
播放器API
SDK 提供的方法和变量可以通过 ByteArkPlayer 实例访问,以控制播放行为或获取媒体内容信息。
ByteArkPlayerController
ByteArkPlayerController
类提供了控制ByteArk Player中媒体播放的接口。此类与底层平台特定实现交互以执行媒体控制操作。
函数名 | 描述 |
---|---|
play() |
开始或恢复媒体播放。 |
pause() |
暂停当前媒体播放。 |
togglePlayback() |
在播放和暂停媒体之间切换。 |
seekForward() |
将媒体向前搜索预设间隔。 |
seekBackward() |
将媒体向后搜索预设间隔。 |
seekTo(int position) |
搜索到媒体中的特定位置(以秒为单位)。[position] 是目标位置。 |
switchMediaSource(ByteArkPlayerConfig config) |
切换当前媒体源到新的媒体源。[config] 包含新媒体源的配置。 |
toggleFullScreen() |
在全屏和正常显示模式之间切换。 |
dispose() |
释放播放器使用的资源并进行清理。 |
currentPosition() |
获取当前播放位置(以秒为单位)。 |
getCurrentAudio() |
获取当前音频轨道。 |
getAudios() |
获取可用音频轨道列表。 |
setAudio(ByteArkPlayerMediaTrack track) |
设置当前音频轨道。 |
getCurrentSubtitle() |
获取当前字幕。 |
getSubtitles() |
获取可用字幕列表。 |
setSubtitle(ByteArkPlayerMediaTrack track) |
设置字幕。 |
getCurrentResolution() |
获取当前分辨率。 |
getResolutions() |
获取可用分辨率列表。 |
setResolution(ByteArkPlayerMediaTrack track) |
设置视频分辨率。 |
getAvailablePlaybackSpeeds() |
获取可用播放速度。 |
getCurrentPlaybackSpeed() |
获取当前播放速度。 |
setPlaybackSpeed(double speed) |
设置播放速度。 |
getCurrentTime() |
获取当前时间。 |
getDuration() |
获取内容持续时间。 |
示例用法
late ByteArkPlayerController _byteArkPlayerController;
@override
void initState() {
super.initState();
// 步骤1: 创建 ByteArkPlayerController 实例
_byteArkPlayerController = ByteArkPlayerController();
}
// 步骤2: 通过调用 byteArkPlayerController.methodName 使用每个方法
ElevatedButton(
onPressed: () {
_byteArkPlayerController.play();
}
)
@override
void dispose() {
// 步骤3: 仅在确定不再需要控制器时才释放它
_byteArkPlayerController.dispose();
super.dispose();
}
ByteArkPlayerEventChannel
本节设置了事件监听器以处理由ByteArk Player发出的各种事件。监听器订阅流(ByteArkPlayerEventChannel.stream)并根据不同的事件作出反应,这些事件对应于播放器状态的变化,如播放动作、全屏变化或错误。每个事件由ByteArkPlayerEventTypes中的枚举值标识。
事件 | 描述 |
---|---|
playerReady |
当播放器准备好交互时触发。 |
playerLoadingMetadata |
当播放器开始加载媒体元数据时触发。 |
playbackFirstPlay |
当媒体首次开始播放时触发。 |
playbackPlay |
当媒体播放恢复时触发。 |
playbackPause |
当媒体播放暂停时触发。 |
playbackSeeking |
当开始在媒体中搜索时触发。 |
playbackSeeked |
当搜索操作完成时触发。 |
playbackEnded |
当媒体播放到达结尾时触发。 |
playbackTimeupdate |
定期触发以更新当前播放时间。 |
playbackBuffering |
当媒体进入缓冲状态时触发。 |
playbackBuffered |
当缓冲完成时触发。 |
playbackError |
当发生播放错误时触发。 |
playerEnterFullscreen |
当播放器进入全屏模式时触发。 |
playerExitFullscreen |
当播放器退出全屏模式时触发。 |
playerEnterPictureInPictureMode |
当播放器进入画中画模式时触发。 |
playerExitPictureInPictureMode |
当播放器退出画中画模式时触发。 |
playbackResolutionChanged |
当播放分辨率改变时触发。 |
示例用法
// 步骤1: 创建 StreamSubscription 实例
StreamSubscription<dynamic>? _subscription;
// 步骤2: 从原生侧开始监听事件,BytearkPlayerEventTypes.eventName
_subscription = BytearkPlayerEventChannel.stream.listen((event) {
switch (event) {
case BytearkPlayerEventTypes.playerReady:
print('Received event: playerReady');
break;
default:
print('Received unknown event: $event');
}
}, onError: (error) {
print('Error: $error');
});
更多关于Flutter音视频播放插件byteark_player_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter音视频播放插件byteark_player_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
byteark_player_flutter
是一个用于在 Flutter 应用中播放音视频的插件。它基于 ByteArk 的播放器 SDK,提供了丰富的功能,包括支持多种视频格式、自适应码率、DRM 保护等。以下是使用 byteark_player_flutter
的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 byteark_player_flutter
依赖:
dependencies:
flutter:
sdk: flutter
byteark_player_flutter: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在需要使用播放器的 Dart 文件中导入插件:
import 'package:byteark_player_flutter/byteark_player_flutter.dart';
3. 初始化播放器
在使用播放器之前,通常需要先初始化它。可以在 initState
方法中进行初始化:
class VideoPlayerScreen extends StatefulWidget {
@override
_VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}
class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
ByteArkPlayerController _controller;
@override
void initState() {
super.initState();
_controller = ByteArkPlayerController();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('ByteArk Video Player'),
),
body: Container(
child: ByteArkPlayer(
controller: _controller,
),
),
);
}
}
4. 设置视频源
可以通过 ByteArkPlayerController
的 setSource
方法来设置视频源:
_controller.setSource(
'https://example.com/path/to/video.mp4',
type: ByteArkSourceType.network, // 支持 network, file, asset
);
5. 控制播放
ByteArkPlayerController
提供了多种方法来控制视频的播放,例如:
play()
: 开始播放pause()
: 暂停播放seekTo(Duration position)
: 跳转到指定位置setVolume(double volume)
: 设置音量
_controller.play(); // 开始播放
_controller.pause(); // 暂停播放
6. 监听播放状态
你可以监听播放器的状态变化,例如播放完成、播放出错等:
_controller.addListener(() {
if (_controller.value.isPlaying) {
print('Video is playing');
} else if (_controller.value.isCompleted) {
print('Video completed');
} else if (_controller.value.hasError) {
print('Error: ${_controller.value.errorMessage}');
}
});
7. 自定义播放器 UI
你可以通过 ByteArkPlayer
的 controller
属性来自定义播放器的 UI,例如添加播放/暂停按钮、进度条等:
ByteArkPlayer(
controller: _controller,
customControls: Column(
children: [
IconButton(
icon: Icon(_controller.value.isPlaying ? Icons.pause : Icons.play_arrow),
onPressed: () {
if (_controller.value.isPlaying) {
_controller.pause();
} else {
_controller.play();
}
},
),
Slider(
value: _controller.value.position.inMilliseconds.toDouble(),
min: 0,
max: _controller.value.duration.inMilliseconds.toDouble(),
onChanged: (double value) {
_controller.seekTo(Duration(milliseconds: value.toInt()));
},
),
],
),
);
8. 处理生命周期
为了确保播放器在应用生命周期变化时正常工作,可以在 WidgetsBindingObserver
中处理应用的生命周期事件:
class _VideoPlayerScreenState extends State<VideoPlayerScreen> with WidgetsBindingObserver {
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.paused) {
_controller.pause();
} else if (state == AppLifecycleState.resumed) {
_controller.play();
}
}
}
9. 处理全屏
byteark_player_flutter
支持全屏播放。你可以通过 _controller.enterFullScreen()
和 _controller.exitFullScreen()
来控制全屏状态。
IconButton(
icon: Icon(Icons.fullscreen),
onPressed: () {
if (_controller.value.isFullScreen) {
_controller.exitFullScreen();
} else {
_controller.enterFullScreen();
}
},
);
10. 处理 DRM
如果视频需要 DRM 保护,可以通过 setSource
方法传递 DRM 配置:
_controller.setSource(
'https://example.com/path/to/drm_video.mp4',
type: ByteArkSourceType.network,
drmConfig: ByteArkDrmConfig(
licenseUrl: 'https://example.com/drm/license',
customData: 'your_custom_data',
),
);