Flutter视频查看插件video_viewer的使用

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

Flutter视频查看插件video_viewer的使用

video_viewer 是一个功能强大的Flutter插件,用于在应用中显示和播放视频。它提供了丰富的UI/UX、动画效果、字幕支持等特性。

特性

  • 精美的UI/UX设计
  • 华丽的动画效果
  • 支持流媒体聊天
  • 自定义广告支持
  • 完全可定制
  • 支持HLS (m3u8)格式
  • 字幕(Subtitle)支持
  • 视频剪辑(只显示特定时间的视频)
  • 易于实现且功能强大!

预览

可以查看完整的源代码示例:example

视频预览截图

高质量视频演示:高清视频演示

安装

Android

AndroidManifest.xml 文件中添加以下权限:

<manifest>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:usesCleartextTraffic="true"></application>
</manifest>

iOS

Info.plist 文件中添加以下条目:

<key>NSAppTransportSecurity</key>
<dict>
   <key>NSAllowsArbitraryLoads</key>
   <true/>
</dict>

注意: 在iOS模拟器上无法正常运行视频播放器,需要在真实设备上进行开发和测试。

全局手势

  • 单击:显示或隐藏包含播放/暂停控件和进度条的覆盖层
  • 双击
    • 左侧:双击视频左侧会快退,默认10秒。
    • 右侧:双击视频右侧会快进,默认10秒。
  • 水平拖动
    • 向左:向左水平移动会按距离比例快退。
    • 向右:向右水平移动会按距离比例快进。
  • 垂直拖动
    • 向上:按距离比例增加音量。
    • 向下:按距离比例减少音量。
  • 缩放拖动:当视频处于全屏和横屏模式时,可以通过缩放来填满屏幕宽度。

示例代码

使用 VideoViewerController

class UsingVideoControllerExample extends StatefulWidget {
  UsingVideoControllerExample({Key key}) : super(key: key);

  @override
  _UsingVideoControllerExampleState createState() => _UsingVideoControllerExampleState();
}

class _UsingVideoControllerExampleState extends State<UsingVideoControllerExample> {
  final VideoViewerController controller = VideoViewerController();

  @override
  Widget build(BuildContext context) {
    return VideoViewer(
      controller: controller,
      source: {
        "SubRip Text": VideoSource(
          video: VideoPlayerController.network(
              "https://www.speechpad.com/proxy/get/marketing/samples/standard-captions-example.mp4"),
          subtitle: {
            "English": VideoViewerSubtitle.network(
              "https://felipemurguia.com/assets/txt/WEBVTT_English.txt",
              type: SubtitleType.webvtt,
            ),
          },
        )
      },
    );
  }

  VideoPlayerController getVideoPlayer() => controller.controller;
  String getactiveSourceNameName() => controller.activeSourceName;
  String getActiveCaption() => controller.activeCaption;
  bool isFullScreen() => controller.isFullScreen;
  bool isBuffering() => controller.isBuffering;
  bool isPlaying() => controller.isPlaying;
}

HLS网络视频(仅适用于Android和iOS)

class HLSVideoExample extends StatelessWidget {
  const HLSVideoExample({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Map<String, VideoSource>>(
      future: VideoSource.fromM3u8PlaylistUrl(
        "https://sfux-ext.sfux.info/hls/chapter/105/1588724110/1588724110.m3u8",
        formatter: (quality) => quality == "Auto" ? "Automatic" : "${quality.split("x").last}p",
      ),
      builder: (_, data) {
        return data.hasData
            ? VideoViewer(
                source: data.data,
                onFullscreenFixLandscape: true,
                style: VideoViewerStyle(
                  thumbnail: Image.network(
                    "https://play-lh.googleusercontent.com/aA2iky4PH0REWCcPs9Qym2X7e9koaa1RtY-nKkXQsDVU6Ph25_9GkvVuyhS72bwKhN1P",
                  ),
                ),
              )
            : CircularProgressIndicator();
      },
    );
  }
}

网络视频带WebVTT字幕

class WebVTTSubtitleVideoExample extends StatelessWidget {
  const WebVTTSubtitleVideoExample({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return VideoViewer(
      source: {
        "WebVTT Caption": VideoSource(
          video: VideoPlayerController.network(
            //This video has a problem when end
            "https://www.speechpad.com/proxy/get/marketing/samples/standard-captions-example.mp4",
          ),
          subtitle: {
            "English": VideoViewerSubtitle.network(
              "https://felipemurguia.com/assets/txt/WEBVTT_English.txt",
            ),
            "Spanish": VideoViewerSubtitle.network(
              "https://felipemurguia.com/assets/txt/WEBVTT_Spanish.txt",
            ),
          },
        )
      },
    );
  }
}

网络视频带SubRip字幕

class SubRipSubtitleVideoExample extends StatelessWidget {
  const SubRipSubtitleVideoExample({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final String content = '''
      1
      00:00:03,400 --> 00:00:06,177
      In this lesson, we're going to
      be talking about finance. And

      2
      00:00:06,177 --> 00:00:10,009
      one of the most important aspects
      of finance is interest.
      ...
    ''';

    return VideoViewer(
      source: {
        "SubRip Caption": VideoSource(
          video: VideoPlayerController.network(
              "https://www.speechpad.com/proxy/get/marketing/samples/standard-captions-example.mp4"),
          subtitle: {
            "English": VideoViewerSubtitle.content(
              content,
              type: SubtitleType.srt,
            ),
          },
        )
      },
    );
  }
}

完整示例

以下是一个完整的示例,展示了如何使用 video_viewer 插件来创建一个简单的电影页面。

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

void main() => runApp(MyApp());

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

class MoviePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Movie Page'),
      ),
      body: Center(
        child: VideoViewer(
          source: {
            "Trailer": VideoSource(
              video: VideoPlayerController.network(
                  "https://felipemurguia.com/assets/videos/the_witcher_trailer.mp4"),
            )
          },
        ),
      ),
    );
  }
}

以上代码展示了一个基本的电影页面,使用 video_viewer 插件来播放一个网络视频。通过这个插件,您可以轻松地在Flutter应用中集成视频播放功能,并根据需要进行自定义。


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

1 回复

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


当然,以下是如何在Flutter项目中使用video_viewer插件来查看视频的示例代码。假设你已经有一个Flutter项目,并且已经添加了video_viewer插件到pubspec.yaml文件中。

1. 添加依赖

首先,确保在pubspec.yaml文件中添加了video_viewer的依赖:

dependencies:
  flutter:
    sdk: flutter
  video_viewer: ^latest_version  # 替换为最新版本号

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

2. 导入插件

在你需要使用视频查看功能的Dart文件中导入video_viewer插件:

import 'package:video_viewer/video_viewer.dart';

3. 使用VideoViewer

下面是一个简单的示例,展示如何使用VideoViewer来播放视频:

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

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

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

class MyHomePage extends StatelessWidget {
  final List<String> videoUrls = [
    'https://www.example.com/path/to/your/video1.mp4',
    'https://www.example.com/path/to/your/video2.mp4',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Viewer Example'),
      ),
      body: ListView.builder(
        itemCount: videoUrls.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text('Video ${index + 1}'),
            onTap: () => Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => VideoPlayerPage(videoUrl: videoUrls[index])),
            ),
          );
        },
      ),
    );
  }
}

class VideoPlayerPage extends StatelessWidget {
  final String videoUrl;

  VideoPlayerPage({required this.videoUrl});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Play Video'),
      ),
      body: Center(
        child: VideoViewer.builder(
          videoUrl: videoUrl,
          autoPlay: true,  // 自动播放
          aspectRatio: 16 / 9,  // 视频宽高比
          controller: null,  // 如果你需要自定义控制,可以传递一个VideoPlayerController
        ),
      ),
    );
  }
}

4. 运行项目

确保你的项目结构和视频URL是有效的,然后运行你的Flutter项目:

flutter run

这个示例展示了如何使用video_viewer插件来播放视频。你可以根据需要进一步自定义视频播放器,比如添加自定义控制器、调整UI布局等。

注意:实际使用中,请确保视频URL是有效的,并且你的应用有权限访问网络(在AndroidManifest.xmlInfo.plist中配置网络权限)。

回到顶部