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集成

添加依赖

  1. 在终端运行以下命令以添加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小部件

  1. 现在,您可以在Dart代码中导入并开始使用ByteArk Player插件:
    import 'package:byteark_player_flutter/presentation/byteark_player.dart';
    .
    .
    ByteArkPlayer(playerConfig: playerConfig)
    

iOS配置

要使用CocoaPods将ByteArk Player集成到您的Flutter iOS项目中,请按以下步骤操作:

  1. 如果您尚未为GitHub帐户设置SSH密钥,请先按照Github网站上的文档添加一个新的SSH密钥(文档链接已去掉)。

  2. 打开Podfile

    1. 导航到您的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'
      
  3. 安装Pods

    1. 打开终端窗口并导航到您的Flutter项目的ios目录,运行以下命令以安装CocoaPods依赖项并更新仓库:
      pod install --repo-update
      
  4. 打开工作区

    1. 运行pod install --repo-update后,CocoaPods将创建一个Xcode工作区文件(.xcworkspace),请在Xcode中打开此工作区。
  5. 构建并运行

    1. 在进行上述更改后,请构建并运行您的项目到iOS模拟器或物理设备上以验证集成。

Android配置

要将ByteArk Player集成到您的Flutter Android项目中,请按以下步骤操作:

  1. 修改AndroidManifest.xml

    1. 导航到android/app/src/main/AndroidManifest.xml并进行以下更改:
      1. 添加所需的权限以允许网络访问、前台服务和启动接收。在<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"/>
        
      2. 使用@style/Theme.AppCompat属性设置android:resource以使用<activity>内的主题。这允许您应用与FlutterFragmentActivity兼容的主题,例如@style/Theme.AppCompat或其他基于AppCompatMaterialComponents的主题。
        <meta-data
               android:name="io.flutter.embedding.android.NormalTheme"
               android:resource="@style/Theme.AppCompat"/>
        
      3. <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>
        
      4. <application>内添加Nielsen以启用Nielsen服务功能:
        <!--Nielsen-->
        <meta-data
              android:name="com.google.android.gms.ads.APPLICATION_ID"
              android:value="ca-app-pub-3940256099942544~3347511713"/>
        
  2. 更新主活动

    1. 导航到android/app/src/main/kotlin/com/example/your_project_name/MainActivity.kt并更新主活动:
      1. 继承FlutterFragmentActivity()以确保正确的集成:
        import io.flutter.embedding.android.FlutterFragmentActivity
        
        class MainActivity: FlutterFragmentActivity()
        
  3. 配置本地属性

    1. android/local.properties文件中,设置ByteArk Player和ByteArk LightHouse的GitLab私有令牌。
    2. 添加以下行,用您从ByteArk团队获得的令牌替换[YOUR_PRIVATE_TOKEN]
      gitLabByteArkPlayerPrivateToken=[YOUR_PRIVATE_TOKEN]
      gitLabByteArkLighthousePrivateToken=[YOUR_PRIVATE_TOKEN]
      
  4. 构建并运行

    1. 在进行上述更改后,请构建并运行您的项目到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

1 回复

更多关于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. 设置视频源

可以通过 ByteArkPlayerControllersetSource 方法来设置视频源:

_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

你可以通过 ByteArkPlayercontroller 属性来自定义播放器的 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',
  ),
);
回到顶部