Flutter视频播放插件vlc_flutter_compat的使用

Flutter视频播放插件vlc_flutter_compat的使用

这是libvlc的Flutter包装插件。详情请访问其网站

使用说明

依赖项

pubspec.yaml文件中添加依赖项:

dependencies:
  vlc_flutter: ^0.0.2

导入包

在你的Dart文件中导入以下包:

import 'package:vlc_flutter/vlcplayer.dart';

创建控制器

创建一个VLCController实例:

// "-vvv"选项用于详细日志记录,便于调试
VLCController _controller = VLCController(args: ["-vvv"]);

创建播放视图

创建一个用于播放的视图:

AspectRatio(
  aspectRatio: 16 / 9,
  child: VLCVideoWidget(
    controller: _controller,
  ),
)

播放网络视频

根据uri播放视频:

ElevatedButton(
  child: Text("播放"),
  onPressed: () async {
    await _controller.setDataSource(uri: "rtmp://58.200.131.2:1935/livetv/natlgeo");
    _controller.play();
  },
)

你也可以直接使用play方法:

_controller.play(uri: "rtmp://58.200.131.2:1935/livetv/natlgeo");

播放本地资源

播放本地资源:

_controller.play(path: "/sdcard/test/test.mp4");

监听播放状态

监听播放器的状态变化:

_controller.onPlayerState.listen((event) {
  debugPrint("=*= $event =*=");
});

监听播放事件

监听播放事件:

_controller.onEvent.listen((event) {
  if (event.type == EventType.PositionChanged) {
    debugPrint("==[${event.positionChanged}]==");
  }
});

添加字幕

加载本地字幕并设置显示位置:

// 加载本地字幕
await _controller.addSlave(path: "/sdcard/test/Test.srt");

// 设置字幕显示位置
_controller.setVideoTitleDisplay(Position.Bottom, 1000);

录制视频

指定目录并开始录制:

// 指定目录并开始录制
_controller.startRecord("/sdcard/test/");

// 停止录制
_controller.stopRecord();

添加网络权限

为了播放网络资源,不要忘记在AndroidManifest.xml中添加网络权限:

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

如果需要录制视频,可能还需要以下权限(这些是Android 6.0及以上版本的危险权限,因此你可能还需要flutter_easy_permission插件):

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

示例代码

以下是一个完整的示例代码:

class _MyAppState extends State<MyApp> {
  final VLCController _controller = VLCController(args: [
    "-vvv",
    '--network-caching=300',
    '--live-caching=300',
    '--clock-jitter=10',
    '--clock-synchro=10',
    '--avcodec-hurry-up',
    '--avcodec-fast',
    '--avcodec-dr',
    '--rtsp-mcast',
    '--rtsp-tcp',
  ]);

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller.onEvent.listen((event) {
      if (event.type == EventType.TimeChanged) {
        debugPrint("==[${event.timeChanged}]==");
      }
    });

    _controller.onPlayerState.listen((state) {
      debugPrint("--[$state]--");
    });

    load();
  }

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

  load() async {
    await _controller.setDataSource(uri: "rtsp://192.168.68.103:1935");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('VLCPlayer插件示例'),
        ),
        body: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            AspectRatio(
              aspectRatio: 16 / 9,
              child: VLCVideoWidget(
                controller: _controller,
              ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                TextButton(
                  child: const Text("播放"),
                  onPressed: () async {
                    _controller.play();
                  },
                ),
                TextButton(
                  child: const Text("暂停"),
                  onPressed: () {
                    _controller.pause();
                  },
                ),
                TextButton(
                  child: const Text("停止"),
                  onPressed: () {
                    _controller.stop();
                  },
                ),
                TextButton(
                  child: const Text("开始录制"),
                  onPressed: () {
                    _controller.startRecord("/sdcard/test");
                  },
                ),
                TextButton(
                  child: const Text("停止录制"),
                  onPressed: () {
                    _controller.stopRecord();
                  },
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


vlc_flutter_compat 是一个基于 VLC 引擎的 Flutter 插件,用于在 Flutter 应用中播放视频。它提供了丰富的功能,包括支持多种视频格式、网络流媒体播放、字幕、音轨切换等。以下是如何在 Flutter 项目中使用 vlc_flutter_compat 插件的详细步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  vlc_flutter_compat: ^0.0.1 # 请检查最新版本

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

2. 配置 Android 和 iOS 项目

Android 配置

android/app/build.gradle 文件中,确保 minSdkVersion 至少为 21:

defaultConfig {
    minSdkVersion 21
    targetSdkVersion 30
    ...
}

iOS 配置

ios/Podfile 文件中,确保 platform 设置为 10.0 或更高版本:

platform :ios, '10.0'

然后运行 flutter pub getflutter build ios 来确保所有依赖项都已正确配置。

3. 使用 vlc_flutter_compat 播放视频

以下是一个简单的示例,展示如何在 Flutter 应用中使用 vlc_flutter_compat 播放视频。

import 'package:flutter/material.dart';
import 'package:vlc_flutter_compat/vlc_player_controller.dart';
import 'package:vlc_flutter_compat/vlc_player.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'VLC Flutter Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: VideoPlayerScreen(),
    );
  }
}

class VideoPlayerScreen extends StatefulWidget {
  [@override](/user/override)
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  late VlcPlayerController _vlcPlayerController;

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('VLC Flutter Player'),
      ),
      body: Center(
        child: VlcPlayer(
          controller: _vlcPlayerController,
          aspectRatio: 16 / 9,
          placeholder: Center(child: CircularProgressIndicator()),
        ),
      ),
    );
  }
}
回到顶部