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
更多关于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.xml
和 Info.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();