Flutter后台视频录制插件mb_background_video_recorder的使用

Flutter后台视频录制插件mb_background_video_recorder的使用

概述

这是一个用于Android的Flutter插件,允许你在应用运行在后台时无缝录制视频。无论应用是否被最小化、屏幕关闭或设备锁定,都可以继续录制视频。

特性(仅限Android)

  • 兼容Android API 28(Pie)及以上版本。
  • 支持全高清(1080p)视频和音频录制。
  • 即使应用被最小化或终止,录制仍会持续进行。
  • 屏幕关闭或设备锁定时仍可继续录制。
  • 支持前后摄像头。

计划中的功能

  • 音频-only录制。
  • 前台录制时支持相机预览功能。
  • 录制过程中支持闪光灯。

iOS支持

目前该插件不支持iOS。欢迎贡献者为iOS平台添加兼容性!

我们鼓励贡献者、功能请求和反馈来改进此插件。有关实现细节,请参阅提供的示例。


完整示例代码

以下是一个完整的示例代码,展示如何使用mb_background_video_recorder插件在后台录制视频。

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mb_background_video_recorder/mb_bvr.dart';
import 'package:mb_background_video_recorder/mb_bvr_platform_interface.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 控制器实例
  final _flutterBackgroundVideoRecorderPlugin =
      FlutterBackgroundVideoRecorder();

  // 是否正在录制视频
  bool _isRecording = false;

  // 是否正在执行录制任务(如初始化或录制中)
  bool _recorderBusy = false;

  // 当前选择的摄像头方向
  String cameraFacing = "Rear camera";

  // 初始化时获取录制状态
  [@override](/user/override)
  void initState() {
    super.initState();
    getInitialRecordingStatus();
    listenRecordingState();
  }

  // 获取初始录制状态
  Future<void> getInitialRecordingStatus() async {
    _isRecording =
        await _flutterBackgroundVideoRecorderPlugin.getVideoRecordingStatus() ==
            1;
  }

  // 监听录制状态变化
  void listenRecordingState() {
    _flutterBackgroundVideoRecorderPlugin.recorderState.listen((event) {
      switch (event) {
        case 1:
          // 正在录制
          _isRecording = true;
          _recorderBusy = true;
          setState(() {});
          break;
        case 2:
          // 停止录制
          _isRecording = false;
          _recorderBusy = false;
          setState(() {});
          break;
        case 3:
          // 初始化录制资源
          _recorderBusy = true;
          setState(() {});
          break;
        case -1:
          // 出现错误
          _isRecording = false;
          setState(() {});
          break;
        default:
          return;
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: const Text(
            'MB BVR',
            style: TextStyle(
              fontSize: 24,
              fontWeight: FontWeight.w600,
              color: Colors.blueGrey,
            ),
          ),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              // 显示当前摄像头方向
              Padding(
                padding: const EdgeInsets.symmetric(vertical: 20.0),
                child: Text(
                  "$cameraFacing",
                  style: const TextStyle(
                    fontSize: 20,
                    fontWeight: FontWeight.w400,
                    color: Colors.blueGrey,
                  ),
                ),
              ),

              // 切换摄像头按钮
              ElevatedButton(
                style: ButtonStyle(
                    fixedSize: WidgetStateProperty.all(const Size(100, 100)),
                    backgroundColor: WidgetStateProperty.all(Colors.white),
                    shape: WidgetStateProperty.all<RoundedRectangleBorder>(
                        RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(100)))),
                onPressed: () async {
                  if (cameraFacing == "Rear camera") {
                    cameraFacing = "Front camera";
                  } else {
                    cameraFacing = "Rear camera";
                  }
                  setState(() {});
                },
                child: const Icon(
                  Icons.camera_front,
                  color: Colors.blue,
                  size: 50,
                ),
              ),

              const SizedBox(height: 20),

              // 开始/停止录制按钮
              ElevatedButton(
                style: ButtonStyle(
                    fixedSize: WidgetStateProperty.all(const Size(100, 100)),
                    backgroundColor: WidgetStateProperty.all(Colors.white),
                    shape: WidgetStateProperty.all<RoundedRectangleBorder>(
                        RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(100)))),
                onPressed: () async {
                  if (!_isRecording && !_recorderBusy) {
                    // 开始录制
                    await _flutterBackgroundVideoRecorderPlugin.startVideoRecording(
                      folderName: "Example Recorder",
                      cameraFacing: cameraFacing == "Rear camera"
                          ? CameraFacing.rearCamera
                          : CameraFacing.frontCamera,
                      notificationTitle: "Example Notification Title",
                      notificationText: "Example Notification Text",
                      showToast: false,
                    );
                    setState(() {});
                  } else if (_isRecording) {
                    // 停止录制
                    String filePath = await _flutterBackgroundVideoRecorderPlugin
                            .stopVideoRecording() ??
                        "None";
                    setState(() {});
                    debugPrint(filePath);
                  }
                },
                child: _isRecording
                    ? const Icon(
                        Icons.pause,
                        color: Colors.red,
                        size: 55,
                      )
                    : const Icon(
                        Icons.play_arrow,
                        color: Colors.green,
                        size: 55,
                      ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


mb_background_video_recorder 是一个 Flutter 插件,允许你在后台录制视频。这在某些应用场景中非常有用,例如当用户切换到其他应用时仍然保持视频录制。以下是如何使用 mb_background_video_recorder 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  mb_background_video_recorder: ^1.0.0  # 请使用最新版本

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

2. 配置权限

由于在后台录制视频需要访问摄像头和麦克风,你需要在 AndroidManifest.xmlInfo.plist 文件中添加相应的权限。

Android (AndroidManifest.xml)

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

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

iOS (Info.plist)

Info.plist 文件中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>We need access to your camera to record video.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone to record audio.</string>

3. 初始化插件

在你的 Dart 代码中,首先导入插件:

import 'package:mb_background_video_recorder/mb_background_video_recorder.dart';

4. 请求权限

在开始录制之前,确保你已经请求了必要的权限:

bool isPermissionGranted = await MbBackgroundVideoRecorder.requestPermissions();
if (!isPermissionGranted) {
  // 处理权限被拒绝的情况
  return;
}

5. 开始录制

你可以使用 MbBackgroundVideoRecorder.startRecording 方法来开始录制视频:

String filePath = await MbBackgroundVideoRecorder.startRecording();
print("Recording started, file will be saved at: $filePath");

6. 停止录制

使用 MbBackgroundVideoRecorder.stopRecording 方法来停止录制:

await MbBackgroundVideoRecorder.stopRecording();
print("Recording stopped");

7. 处理后台录制

插件会自动处理后台录制,即使应用进入后台,录制也会继续。你可以在应用回到前台时检查录制是否仍在进行。

8. 处理录制文件

录制完成后,视频文件将保存在 filePath 指定的路径中。你可以使用 File 类来处理这个文件:

import 'dart:io';

File videoFile = File(filePath);
if (await videoFile.exists()) {
  // 处理视频文件,例如上传或播放
}

9. 处理错误

在使用插件时,可能会遇到各种错误。你可以使用 try-catch 块来捕获并处理这些错误:

try {
  String filePath = await MbBackgroundVideoRecorder.startRecording();
  print("Recording started, file will be saved at: $filePath");
} catch (e) {
  print("Failed to start recording: $e");
}

10. 清理资源

如果你不再需要录制功能,可以释放资源:

await MbBackgroundVideoRecorder.dispose();
回到顶部