Flutter视频播放插件flutter_vlc_player_vconnex的使用

Flutter视频播放插件flutter_vlc_player_vconnex的使用

VLC Player Plugin

一个基于VLC的Flutter视频播放器插件,支持iOS和Android。

单视频播放 多视频播放


安装

iOS

如果无法加载来自外部源的媒体,您应该添加以下内容:

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

如需更多信息或更细粒度地控制您的App Transport Security(ATS)限制,请阅读 Apple官方文档

确保以下行在 <项目根目录>/ios/Podfile 中已取消注释:

platform :ios, '9.0'

注意:虽然Flutter的 video_player 在iOS模拟器上不可用,但此插件 (flutter_vlc_player) 在iOS模拟器上完全可用。

若要启用vlc投射功能以支持外部显示(如Chromecast),还应添加以下内容:

<key>NSLocalNetworkUsageDescription</key>
<string>Used to search for chromecast devices</string>
<key>NSBonjourServices</key>
<array>
  <string>_googlecast._tcp</string>
</array>

Android

为了从互联网加载媒体/字幕,您的应用需要 INTERNET 权限。
这可以通过确保 <项目根目录>/android/app/src/main/AndroidManifest.xml 文件包含对 <uses-permission> 的声明来实现:

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

由于Flutter默认包含此权限,因此该权限很可能已经声明在文件中。

如果您遇到“Cleartext HTTP traffic to * is not permitted”,则需要在 AndroidManifest.xml 文件中添加 android:usesClearTextTraffic="true" 标志,或者定义一个新的“网络安全配置”文件。有关更多信息,请参阅 https://developer.android.com/training/articles/security-config

为了从内部设备存储加载媒体/字幕,您应添加以下权限:

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

在某些情况下,您还需要在 AndroidManifest.xml 文件的应用程序标签中添加 android:requestLegacyExternalStorage="true" 标志。

之后,您可以通过以下路径访问媒体/字幕文件:

"/storage/emulated/0/{FilePath}"
"/sdcard/{FilePath}"

Android构建配置

  1. <项目根目录>/android/app/build.gradle 中添加以下内容:
android {
    packagingOptions {
        // 解决重复库构建问题,当您的项目使用多个依赖C++库的插件时。
        pickFirst 'lib/**/libc++_shared.so'
    }

    buildTypes {
        release {
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }
    }
}
  1. 创建 <项目根目录>/android/app/proguard-rules.pro,并添加以下内容:
-keep class org.videolan.libvlc.** { *; }

Android多窗口支持

要在Android应用程序中启用多窗口支持,您需要修改 <项目根目录>/android/app/src/main/AndroidManifest.xml,添加 android:resizeableActivity 键为主活动,并为应用程序添加 android.allow_multiple_resumed_activities 元数据:

<manifest ...>
  <application ...>
    <activity ...
      android:resizeableActivity="true">
      ...
    </activity>
    ...
    <meta-data
      android:name="android.allow_multiple_resumed_activities"
      android:value="true" />
  </application>
</manifest>

快速开始

要开始使用插件,请复制以下代码或参考示例项目 'flutter_vlc_player/example'

import 'package:flutter/material.dart';
import 'package:flutter_vlc_player/vlc_player_flutter.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  VlcPlayerController _videoPlayerController;

  Future<void> initializePlayer() async {}

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

    _videoPlayerController = VlcPlayerController.network(
      'https://media.w3.org/2010/05/sintel/trailer.mp4',
      hwAcc: HwAcc.FULL,
      autoPlay: false,
      options: VlcPlayerOptions(),
    );
  }

  @override
  void dispose() async {
    super.dispose();
    await _videoPlayerController.stopRendererScanning();
    await _videoPlayerController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: VlcPlayer(
          controller: _videoPlayerController,
          aspectRatio: 16 / 9,
          placeholder: Center(child: CircularProgressIndicator()),
        ),
      ),
    );
  }
}

录制功能

要开始/停止视频录制,您需要分别调用 startRecording(String saveDirectory)stopRecording() 方法。通过调用停止方法,可以从 vlcPlayerController.value.recordPath 获取录制文件的路径。


升级说明

版本5.0升级说明

要升级到版本5.0,首先需要将现有项目迁移到Swift。

  1. 清理仓库:

    git clean -xdf
    
  2. 删除现有的iOS文件夹。如果对iOS应用进行了自定义更改,请将其重命名或复制到项目外。

  3. 重新创建iOS应用:

    flutter create -i swift .
    

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

1 回复

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


flutter_vlc_player_vconnex 是一个基于 libVLC 的 Flutter 视频播放插件,支持播放本地和网络视频流。它提供了强大的视频播放功能,包括支持多种视频格式、字幕、音频轨道切换、播放速度控制等。

以下是如何在 Flutter 项目中使用 flutter_vlc_player_vconnex 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_vlc_player_vconnex 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_vlc_player_vconnex: ^latest_version

然后运行 flutter pub get 来获取依赖。

2. 导入包

在需要使用视频播放器的 Dart 文件中导入包:

import 'package:flutter_vlc_player_vconnex/flutter_vlc_player.dart';

3. 创建 VlcPlayerController

VlcPlayerController 是控制视频播放的核心类。你可以通过它来加载视频、控制播放、暂停、调整音量等。

VlcPlayerController _videoPlayerController;

@override
void initState() {
  super.initState();
  _videoPlayerController = VlcPlayerController.network(
    'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
    autoPlay: true,
    options: VlcPlayerOptions(),
  );
}

@override
void dispose() {
  _videoPlayerController.dispose();
  super.dispose();
}

4. 使用 VlcPlayer 组件

在 UI 中使用 VlcPlayer 组件来显示视频:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('VLC Player Example'),
    ),
    body: Center(
      child: VlcPlayer(
        controller: _videoPlayerController,
        aspectRatio: 16 / 9,
        placeholder: Center(child: CircularProgressIndicator()),
      ),
    ),
  );
}

5. 控制视频播放

你可以使用 VlcPlayerController 来控制视频的播放、暂停、跳转等操作。例如:

FloatingActionButton(
  onPressed: () {
    if (_videoPlayerController.value.isPlaying) {
      _videoPlayerController.pause();
    } else {
      _videoPlayerController.play();
    }
  },
  child: Icon(
    _videoPlayerController.value.isPlaying ? Icons.pause : Icons.play_arrow,
  ),
),

6. 处理播放状态

你可以监听 VlcPlayerController 的状态变化来处理播放事件:

_videoPlayerController.addListener(() {
  if (_videoPlayerController.value.isPlaying) {
    // 视频正在播放
  } else if (_videoPlayerController.value.isEnded) {
    // 视频播放结束
  }
});

7. 其他功能

flutter_vlc_player_vconnex 还支持一些高级功能,如字幕、音频轨道切换、播放速度控制等。你可以通过 VlcPlayerController 提供的 API 来实现这些功能。

// 切换字幕
_videoPlayerController.setSubtitleTrack(1);

// 切换音频轨道
_videoPlayerController.setAudioTrack(1);

// 设置播放速度
_videoPlayerController.setPlaybackSpeed(1.5);

8. 处理错误

你可以通过监听 VlcPlayerController 的错误来处理播放过程中可能出现的错误:

_videoPlayerController.addListener(() {
  if (_videoPlayerController.value.hasError) {
    // 处理错误
    print('Error: ${_videoPlayerController.value.errorMessage}');
  }
});

9. 自定义选项

你可以通过 VlcPlayerOptions 来自定义播放器的一些选项,例如启用硬件加速、设置缓冲时间等:

VlcPlayerOptions options = VlcPlayerOptions(
  advanced: VlcAdvancedOptions([
    '--no-xlib', // 禁用 Xlib
  ]),
  hwAcceleration: HwAcceleration.full, // 启用硬件加速
  autoPlay: true, // 自动播放
);

10. 示例项目

你可以在 GitHub 上找到 flutter_vlc_player_vconnex 的示例项目,查看更多详细用法。

注意事项

  • flutter_vlc_player_vconnex 依赖于 libVLC,因此在使用时需要确保目标平台支持 libVLC
  • 在 Android 平台上,你可能需要在 AndroidManifest.xml 中添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
  • 在 iOS 平台上,确保在 Info.plist 中添加以下内容以允许网络请求:
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>
回到顶部