Flutter后台视频录制插件flutter_background_video_recorder的使用
Flutter 后台视频录制插件 flutter_background_video_recorder 的使用 #
这是一个用于 Android 平台的 Flutter 插件,可以在应用处于后台时录制视频。
开始使用 #
这个简单的插件允许你在 Android 应用中,在应用处于后台或屏幕关闭锁定的情况下录制视频。
支持的功能(Android) #
- 支持 Android API 28(Pie)及更高版本
- 全高清(1080p)视频和音频录制
- 即使应用在后台或已关闭,录制也会继续进行
- 即使屏幕关闭或锁定,录制也会继续进行
- 支持前置和后置摄像头
未来添加 #
- 仅音频录制器
- 当应用在前台时预览相机
- 闪光灯
关于 iOS 版本 #
该插件不适用于 iOS 平台。如果有人能够使其在 iOS 上工作,他们可以为该包做出贡献。
任何有助于增加或改进功能的贡献或请求都受到欢迎。
查看示例以获取实现细节
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
更多关于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();
}
}
注意事项
- 权限:确保在
AndroidManifest.xml
和Info.plist
中添加了必要的权限,如相机、麦克风和写存储权限。 - 路径:
'/path/to/output/directory'
需要替换为实际可用的路径。在 Android 上,可以使用应用的外部存储目录,而在 iOS 上,通常使用应用的文档目录。 - 后台运行:为了确保应用在后台时仍能录制视频,需要配置相应的后台模式。对于 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>
请根据你的具体需求调整上述代码和配置。