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

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

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

这是一个用于 Android 平台的 Flutter 插件,可以在应用处于后台时录制视频。

开始使用 #

这个简单的插件允许你在 Android 应用中,在应用处于后台或屏幕关闭锁定的情况下录制视频。

支持的功能(Android) #

  • 支持 Android API 28(Pie)及更高版本
  • 全高清(1080p)视频和音频录制
  • 即使应用在后台或已关闭,录制也会继续进行
  • 即使屏幕关闭或锁定,录制也会继续进行
  • 支持前置和后置摄像头

未来添加 #

  • 仅音频录制器
  • 当应用在前台时预览相机
  • 闪光灯

关于 iOS 版本 #

该插件不适用于 iOS 平台。如果有人能够使其在 iOS 上工作,他们可以为该包做出贡献。

任何有助于增加或改进功能的贡献或请求都受到欢迎。

查看示例以获取实现细节

示例代码:example/lib/main.dart

import 'dart:async';

import ‘package:flutter/material.dart’; import ‘package:flutter_background_video_recorder/flutter_bvr.dart’; import ‘package:flutter_background_video_recorder/flutter_bvr_platform_interface.dart’;

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

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

@override State<MyApp> createState() => _MyAppState(); }

class _MyAppState extends State<MyApp> { // 录像变量,用于跟踪录像状态 // _isRecording 当设置为 true 时表示正在录像 // _recorderBusy 当设置为 true 时表示录像机正在忙碌 // - 它可以表示录像机正在初始化资源 // - 或者录像机正在录像。 // 在任何情况下,当 _recorderBusy 设置为 true 时,不应调用开始/停止录像。 bool _isRecording = false; bool _recorderBusy = false;

// StreamSubscription 用于从本地平台获取实时录像事件 // - 1: 正在录像 // - 2: 停止录像 // - 3: 录像机正在初始化并准备开始录像 // - -1: 录像机遇到错误 StreamSubscription<int?>? _streamSubscription; final _flutterBackgroundVideoRecorderPlugin = FlutterBackgroundVideoRecorder();

// 指示使用哪个摄像头进行录像 // 可以取以下值: // - 后置摄像头 // - 前置摄像头 String cameraFacing = “Rear camera”;

@override void initState() { super.initState(); getInitialRecordingStatus(); listenRecordingState(); }

@override void dispose() { _streamSubscription?.cancel(); super.dispose(); }

// 检查当返回到应用时录像是否已经开始 Future<void> getInitialRecordingStatus() async { _isRecording = await _flutterBackgroundVideoRecorderPlugin.getVideoRecordingStatus() == 1; }

// 监听录像状态变化以更新 UI // 切换值根据 StreamSubscription 文档 void listenRecordingState() { _streamSubscription = _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 Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( appBar: AppBar( title: const Text(‘后台视频录制器’), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Padding( padding: const EdgeInsets.symmetric(vertical: 20.0), child: Text( “摄像头: $cameraFacing”, style: const TextStyle( fontSize: 20, ), ), ), ElevatedButton( style: ElevatedButtonTheme.of(context).style?.copyWith( backgroundColor: MaterialStateProperty.resolveWith( (states) => (!_isRecording && !_recorderBusy) ? null : Colors.grey)), onPressed: () { if (!_isRecording && !_recorderBusy) { if (cameraFacing == “Rear camera”) { cameraFacing = “Front camera”; } else { cameraFacing = “Rear camera”; } setState(() {}); } }, child: const Text(“切换摄像头方向”), ), ElevatedButton( onPressed: () async { if (!_isRecording && !_recorderBusy) { await _flutterBackgroundVideoRecorderPlugin .startVideoRecording( folderName: “Example Recorder”, cameraFacing: CameraFacing.frontCamera, notificationTitle: “Example Notification Title”, notificationText: “Example Notification Text”, showToast: false ); setState(() {}); } else if (!_isRecording && _recorderBusy) { return; } else { String filePath = await _flutterBackgroundVideoRecorderPlugin .stopVideoRecording() ?? “None”; setState(() {}); debugPrint(filePath); } }, child: Text( _isRecording ? “停止录像” : “开始录像”, ), ) ], ), ), ), ); } }


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

1 回复

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


当然,以下是一个关于如何使用 flutter_background_video_recorder 插件进行后台视频录制的代码示例。这个示例展示了如何初始化插件、开始录制视频、停止录制以及处理录制完成后的视频文件。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_background_video_recorder 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_background_video_recorder: ^x.y.z  # 替换为最新版本号

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

接下来是代码示例:

import 'package:flutter/material.dart';
import 'package:flutter_background_video_recorder/flutter_background_video_recorder.dart';
import 'dart:io';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  FlutterBackgroundVideoRecorder _videoRecorder = FlutterBackgroundVideoRecorder();
  String _videoPath = "";

  @override
  void initState() {
    super.initState();
    // 初始化插件
    _initVideoRecorder();
  }

  Future<void> _initVideoRecorder() async {
    // 配置录制参数
    final Map<String, dynamic> config = {
      'output_format': 'mp4',
      'video_bitrate': 5000000,
      'audio_bitrate': 160000,
      'preset': FlutterBackgroundVideoRecorder.PRESET_ULTRA_HIGH,
    };

    // 初始化录制器
    await _videoRecorder.initialize(config);
  }

  Future<void> _startRecording() async {
    // 开始录制视频
    final String? path = await _videoRecorder.startRecording(
      '/path/to/output/directory', // 替换为实际输出目录
      'output_video', // 输出文件名(不含扩展名)
    );

    if (path != null) {
      setState(() {
        _videoPath = path;
      });
      print('Recording started. Video path: $_videoPath');
    } else {
      print('Failed to start recording.');
    }
  }

  Future<void> _stopRecording() async {
    // 停止录制视频
    final File? videoFile = await _videoRecorder.stopRecording();

    if (videoFile != null) {
      print('Recording stopped. Video saved to ${videoFile.path}');
      // 这里可以执行其他操作,比如上传视频文件
    } else {
      print('Failed to stop recording.');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Background Video Recorder Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: _startRecording,
                child: Text('Start Recording'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _stopRecording,
                child: Text('Stop Recording'),
              ),
              SizedBox(height: 20),
              if (_videoPath.isNotEmpty)
                Text('Video Path: $_videoPath'),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 释放资源
    _videoRecorder.dispose();
    super.dispose();
  }
}

注意事项

  1. 权限:确保在 AndroidManifest.xmlInfo.plist 中添加了必要的权限,如相机、麦克风和写存储权限。
  2. 路径'/path/to/output/directory' 需要替换为实际可用的路径。在 Android 上,可以使用应用的外部存储目录,而在 iOS 上,通常使用应用的文档目录。
  3. 后台运行:为了确保应用在后台时仍能录制视频,需要配置相应的后台模式。对于 Android,可以在 AndroidManifest.xml 中添加相关权限和服务声明;对于 iOS,需要配置后台任务。

权限配置示例(Android)

AndroidManifest.xml 中添加:

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

权限配置示例(iOS)

Info.plist 中添加:

<key>NSCameraUsageDescription</key>
<string>App needs access to the camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>App needs access to the microphone</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>App needs access to save photos</string>

请根据你的具体需求调整上述代码和配置。

回到顶部