Flutter屏幕录制插件screen_recorder的使用
Flutter屏幕录制插件screen_recorder的使用
🚧 注意:此插件仍处于高度实验性阶段,API可能会发生变化。
screen_recorder
是一个用于创建Flutter小部件录制的插件。这些录制可以导出为GIF格式。它是一个纯Flutter/Dart实现,不依赖于任何原生或平台代码,因此可以在所有支持的平台上运行。
然而,请注意,GIF编码需要大量时间,在Web上尤其明显,几乎不可行。
🚀 快速开始
安装
首先,在你的pubspec.yaml
文件中添加screen_recorder
:
dependencies:
flutter:
sdk: flutter
screen_recorder: ^latest_version # 使用pub.dev上的最新版本
然后,在终端中运行flutter packages get
。
示例代码
下面是一个完整的示例demo,展示了如何使用screen_recorder
进行屏幕录制并导出为GIF或帧。
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:screen_recorder/screen_recorder.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _recording = false;
bool _exporting = false;
ScreenRecorderController controller = ScreenRecorderController();
bool get canExport => controller.exporter.hasFrames;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_exporting)
const Center(child: CircularProgressIndicator())
else ...[
ScreenRecorder(
height: 500,
width: 500,
controller: controller,
child: Container(
color: Colors.red,
child: const Center(
child: Text('Record Me!', style: TextStyle(fontSize: 24)),
),
),
),
if (!_recording && !_exporting)
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () {
controller.start();
setState(() {
_recording = true;
});
},
child: const Text('Start'),
),
),
if (_recording && !_exporting)
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () {
controller.stop();
setState(() {
_recording = false;
});
},
child: const Text('Stop'),
),
),
if (canExport && !_exporting)
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () async {
setState(() {
_exporting = true;
});
var gif = await controller.exporter.exportGif();
if (gif == null) {
throw Exception();
}
setState(() => _exporting = false);
showDialog(
context: context as dynamic,
builder: (context) {
return AlertDialog(
content: Image.memory(Uint8List.fromList(gif)),
);
},
);
},
child: const Text('Export as GIF'),
),
),
if (canExport && !_exporting)
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () {
setState(() {
controller.exporter.clear();
});
},
child: const Text('Clear recorded data'),
),
)
]
],
),
),
),
);
}
}
在这个例子中,我们创建了一个简单的应用界面,其中包含一个可录制的小部件。用户可以通过点击按钮来启动和停止录制,并将录制的内容导出为GIF。
⚠️ 已知问题和限制
- 平台视图在截图中是不可见的(如
webview
或Google Maps
)。有关详细信息,请参阅此问题和此问题。 - Web仅支持Flutter的CanvasKit渲染器,更多信息请参阅Flutter Web Renderer文档。
- 该包目前不支持音频录制,也不会在未来支持,除非在纯Dart/Flutter环境中成为可能。
- 该包目前不支持视频导出,也不会在未来支持,除非在纯Dart/Flutter环境中成为可能。
转换GIF为视频
为了将GIF转换为视频,您可以尝试以下库之一。请注意,兼容性未经过测试。
Library | Stats |
---|---|
ffmpeg_kit_flutter | |
flutter_video_compress | |
video_editor | |
video_trimmer | |
video_compress |
关于作者
贡献者
希望这个指南对你有帮助!如果你有任何问题或建议,请随时提问。
更多关于Flutter屏幕录制插件screen_recorder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复