Flutter视频播放插件jw_video_player的使用

Flutter视频播放插件jw_video_player的使用

注意:目前处于测试阶段

包版本:

  • 0.0.2

描述:

使用此包可以将本地视频播放器嵌入到iOS、Android和Web应用中。

该包中的接口包括:

  • JWVideoPlayer:视频播放器小部件
  • JWPlayerController:用于播放、暂停、停止等操作的控制器,并监听播放器值的变化。
  • JWPlayerConfiguration:配置播放器的参数。

示例

查看示例以了解库的实现方式。


使用方法

// 如果你正在使用移动设备,
// 需要在应用中设置你的许可证。
void main() async {
  JWVideoPlayer.setLicenseKey({JW_LICENSE});
  runApp(const App());
}

class App extends StatelessWidget {
  JWPlayerConfiguration config1 = JWPlayerConfiguration(
    file: "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8"
  );

  const App({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Title',
      home: PlayerApp(),
    );
  }
}

class PlayerApp extends StatefulWidget {
  const PlayerApp({Key? key}) : super(key: key);

  @override
  State<PlayerApp> createState() => _PlayerAppState();
}

class _PlayerAppState extends State<PlayerApp> {
  String _platformVersion = 'Unknown';
  final JWPlayerController _controller = JWPlayerController();

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们在异步方法中进行初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用try/catch来处理PlatformException。
    // 我们还处理消息可能返回null的情况。
    try {
      JWVideoPlayer.setLicenseKey(GetLicense.getLicense());
    } catch (e) {
      debugPrint(e.toString());
    }
    try {
      platformVersion = await JWVideoPlayer.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
    // 如果在异步平台消息还在飞行时,小部件从树中移除,我们希望丢弃回复而不是调用setState来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  @override
  Widget build(BuildContext context) {
    double height = MediaQuery.of(context).size.height;
    double width = MediaQuery.of(context).size.width;
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Player version: $_platformVersion'),
        ),
        body: Wrap(
          crossAxisAlignment: WrapCrossAlignment.center,
          children: [
            ConstrainedBox(
              // 如果应用的宽高比为W:h,则限制宽度为70%,如果w:H则使用整个宽度。
              constraints: BoxConstraints(maxWidth: height > width ? width : width * 0.7),
              child: AspectRatio(
                aspectRatio: 2.1,
                child: JWVideoPlayer(
                  config: config1,
                  controller: _controller,
                ),
              ),
            ),
            PlayerStatusView(controller: _controller),
          ],
        ),
        bottomNavigationBar: Padding(
          padding: const EdgeInsets.only(bottom: 15),
          child: ButtonBar(
            alignment: MainAxisAlignment.spaceAround,
            children: [
              IconButton(onPressed: _controller.play, icon: const Icon(Icons.play_arrow)),
              IconButton(onPressed: _controller.pause, icon: const Icon(Icons.pause)),
              IconButton(onPressed: _controller.stop, icon: const Icon(Icons.stop))
            ],
          ),
        ),
      ),
    );
  }
}

class PlayerStatusView extends StatelessWidget {
  const PlayerStatusView({
    Key? key,
    required JWPlayerController controller,
  })  : _controller = controller,
        super(key: key);

  final JWPlayerController _controller;

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: _controller,
      builder: ((context, JWVideoPlayerValue value, child) => Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              const Text(
                "Player Controller Status",
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
              Text("position: ${value.position.toString()}"),
              const Padding(padding: EdgeInsets.all(2)),
              Text("duration: ${value.duration.toString()}"),
              const Padding(padding: EdgeInsets.all(2)),
              Row(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  const Text("buffered: "),
                  CircularProgressIndicator(
                    value: (value.bufferPercentage / 100),
                    backgroundColor: Colors.transparent,
                    valueColor: const AlwaysStoppedAnimation<Color>(Colors.grey),
                  ),
                  const Padding(padding: EdgeInsets.all(2)),
                  const Text("state: "),
                  Icon(value.state == PlayerState.playing
                      ? Icons.play_circle
                      : Icons.pause_circle)
                ],
              ),
            ],
          )),
    );
  }
}

Web端需求

在Dart端与上述相同,但不需要许可证,但需要添加播放器脚本,你可以从你的JWPlayer仪表板或使用JWPlayer管理API获取它。

<!DOCTYPE html>
<html>
<head>
  ...
  <!-- 在这里设置你的JWPlayer脚本 -->
  <!-- 这应该来自JW仪表板或请求更多信息在这里 https://docs.jwplayer.com/platform/docs/players-get-started -->
  <script src="https://cdn.jwplayer.com/libraries/{PLAYER_ID}.js"></script>
  ...
</head>
<body>
  ...
</body>
</html>

更多关于Flutter视频播放插件jw_video_player的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频播放插件jw_video_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用jw_video_player插件来播放视频的示例代码。请注意,你需要先确保你的Flutter环境已经设置好,并且已经添加了jw_video_player依赖到你的pubspec.yaml文件中。

步骤 1: 添加依赖

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  jw_video_player: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

步骤 2: 导入插件

在你想要使用视频播放功能的Dart文件中导入jw_video_player插件:

import 'package:jw_video_player/jw_video_player.dart';

步骤 3: 使用JWVideoPlayer

下面是一个完整的示例,展示如何在Flutter应用中使用jw_video_player插件来播放视频:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Video Player Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: VideoPlayerScreen(),
    );
  }
}

class VideoPlayerScreen extends StatefulWidget {
  @override
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  JWVideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化视频控制器
    _controller = JWVideoPlayerController.network(
      'https://www.example.com/path/to/your/video.mp4', // 替换为你的视频URL
      autoPlay: true,
      looping: false,
    );

    // 监听视频结束事件
    _controller.setVideoCompletedListener(() {
      print('Video completed!');
    });

    // 监听视频错误事件
    _controller.setVideoErrorListener((error) {
      print('Video error: $error');
    });
  }

  @override
  void dispose() {
    // 释放视频控制器资源
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Player Demo'),
      ),
      body: Center(
        child: _controller.value.initialized
            ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: JWVideoPlayer(_controller),
              )
            : Container(
                child: CircularProgressIndicator(),
              ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 控制视频播放/暂停
          setState(() {
            if (_controller.value.isPlaying) {
              _controller.pause();
            } else {
              _controller.play();
            }
          });
        },
        tooltip: 'Play/Pause',
        child: Icon(
          _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:确保在pubspec.yaml中添加了jw_video_player依赖。
  2. 控制器初始化:在initState方法中初始化JWVideoPlayerController,这里使用的是网络视频URL。
  3. 事件监听:添加了视频完成和视频错误的监听器。
  4. UI构建:使用AspectRatioJWVideoPlayer来构建视频播放界面,并在视频未初始化时显示加载指示器。
  5. 播放控制:通过FloatingActionButton实现播放/暂停控制。

请确保替换示例中的视频URL为你自己的视频地址,并根据需要进行进一步的自定义和扩展。

回到顶部