Flutter视频多路复用播放插件video_player_mux的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter视频多路复用播放插件video_player_mux的使用

一个用于Android的Flutter插件,可以在Widget表面播放视频,并将数据发送到Mux进行监控。

支持

Android
支持 SDK 24+

安装

首先,在你的pubspec.yaml文件中添加video_player_mux依赖:

dependencies:
  video_player_mux: ^latest_version

Android

如果你使用的是网络视频,请确保在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.INTERNET"/>

此外,在app级别的build.gradle文件中添加以下配置:

// 构建插件项目时启用所有警告。这被放置在这里而不是插件本身中,以避免破坏构建不同警告(例如,来自更新的SDK)的客户端。
gradle.projectsEvaluated {
    project(":video_player_android_mux") {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:all" << "-Werror"

            // 解决构建时出现的一些警告,这些警告由于上述选项变成了错误,来自于
            // org.checkerframework.checker.nullness.qual 和
            // com.google.errorprone.annotations:
            //
            // 警告:无法在类型 org.checkerframework.checker.nullness.qual.EnsuresNonNull 中找到方法 'value()'
            // 类文件未找到 org.checkerframework.checker.nullness.qual.EnsuresNonNull
            //
            // 警告:无法在类型 com.google.errorprone.annotations.InlineMe 中找到方法 'replacement()'
            // 类文件未找到 com.google.errorprone.annotations.InlineMe
            //
            // 依赖版本取自:
            // https://github.com/google/ExoPlayer/blob/r2.18.1/constants.gradle
            //
            // 未来的参考:依赖项在此处被排除:
            // https://github.com/google/ExoPlayer/blob/r2.18.1/library/common/build.gradle#L33-L34
            dependencies {
                implementation "org.checkerframework:checker-qual:3.13.0"
                implementation "com.google.errorprone:error_prone_annotations:2.10.0"
            }
        }
    }
}

支持的格式

  • 在Android上,后台播放器是ExoPlayer,请参阅这里了解支持的格式列表。

示例

以下是一个基本的示例,展示了如何使用video_player_mux插件来播放视频。

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

void main() => runApp(const VideoApp());

/// 状态小部件,用于获取并显示视频内容。
class VideoApp extends StatefulWidget {
  const VideoApp({super.key});

  [@override](/user/override)
  _VideoAppState createState() => _VideoAppState();
}

class _VideoAppState extends State<VideoApp> {
  late VideoPlayerController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(
        'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
        // ONLY WORKS FOR ANDROID NOW
        data: {
          "env_key": "YOUR_ENV_KEY", // MUST PROVIDE
          "cpd_player_name": "YOUR_PLAYER_NAME",
          "cpd_viewer_user_id": "YOUR_VIEWER_USER_ID",
          "cvd_video_title": "YOUR_VIDEO_TITLE",
          "cvd_video_id": "YOUR_VIDEO_ID",
        })
      ..initialize().then((_) {
        // 确保在视频初始化后显示第一帧,即使播放按钮尚未按下。
        setState(() {});
      });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Video Demo',
      home: Scaffold(
        body: Center(
          child: _controller.value.isInitialized
              ? AspectRatio(
                  aspectRatio: _controller.value.aspectRatio,
                  child: VideoPlayer(_controller),
                )
              : Container(),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            setState(() {
              _controller.value.isPlaying
                  ? _controller.pause()
                  : _controller.play();
            });
          },
          child: Icon(
            _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
          ),
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    _controller.dispose();
  }
}

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

1 回复

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


当然,以下是关于如何使用Flutter中的video_player_mux插件进行视频多路复用播放的一个示例代码案例。这个插件允许你在Flutter应用中同时播放多个视频流,并将它们合并到一个输出中。

首先,确保你的pubspec.yaml文件中包含了video_playervideo_player_mux的依赖项:

dependencies:
  flutter:
    sdk: flutter
  video_player: ^2.2.19 # 请检查最新版本
  video_player_mux: ^0.1.1 # 请检查最新版本

然后,运行flutter pub get来安装这些依赖项。

接下来,创建一个Flutter应用,并在其中使用video_player_mux插件。以下是一个基本的示例代码:

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:video_player_mux/video_player_mux.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoMuxPlayerScreen(),
    );
  }
}

class VideoMuxPlayerScreen extends StatefulWidget {
  @override
  _VideoMuxPlayerScreenState createState() => _VideoMuxPlayerScreenState();
}

class _VideoMuxPlayerScreenState extends State<VideoMuxPlayerScreen> {
  late VideoPlayerController _controller1;
  late VideoPlayerController _controller2;
  late VideoMuxController _muxController;

  @override
  void initState() {
    super.initState();
    // 初始化第一个视频控制器
    _controller1 = VideoPlayerController.network(
      'https://www.example.com/video1.mp4',
    )
      ..initialize().then((_) {
        // 确保在视频初始化完成后设置循环播放
        setState(() {});
      });

    // 初始化第二个视频控制器
    _controller2 = VideoPlayerController.network(
      'https://www.example.com/video2.mp4',
    )
      ..initialize().then((_) {
        // 确保在视频初始化完成后设置循环播放
        setState(() {});
      });

    // 初始化多路复用控制器
    _muxController = VideoMuxController([_controller1, _controller2]);
  }

  @override
  void dispose() {
    _controller1.dispose();
    _controller2.dispose();
    _muxController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Mux Player'),
      ),
      body: Center(
        child: _controller1.value.isInitialized && _controller2.value.isInitialized
            ? AspectRatio(
                aspectRatio: _controller1.value.aspectRatio,
                child: VideoMuxPlayer(_muxController),
              )
            : Container(
                child: CircularProgressIndicator(),
              ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            // 播放/暂停多路复用视频
            _muxController.value.isPlaying
                ? _muxController.pause()
                : _muxController.play();
          });
        },
        child: Icon(
          _muxController.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }
}

在这个示例中,我们创建了两个VideoPlayerController实例来分别加载两个不同的视频流。然后,我们使用VideoMuxController来将这两个视频控制器合并到一个多路复用控制器中。VideoMuxPlayer小部件用于显示合并后的视频流。

请注意,video_player_mux插件的具体API和实现可能会随着版本更新而变化,因此建议查阅最新的官方文档和示例代码以获取最新信息。

此外,由于视频多路复用是一个相对复杂的操作,可能涉及到同步、解码和资源管理等多个方面,因此在实际应用中可能需要根据具体需求进行更多的配置和优化。

回到顶部