【发布时间】:2022-06-28 00:09:37
【问题描述】:
我正在开发我的第一个应用程序。我只想为我的应用录制视频。可用的插件捕捉图片和录制视频。
【问题讨论】:
我正在开发我的第一个应用程序。我只想为我的应用录制视频。可用的插件捕捉图片和录制视频。
【问题讨论】:
只需使用camera plugin 即可。它会向您显示相机预览,只需 Stacking 使用您自己的录制按钮即可。
此外,如果您想将其保存到默认图库应用,请使用 gallery_saver plugin。
这是改编自camera plugin example的代码
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
late List<CameraDescription> _cameras;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
_cameras = await availableCameras();
runApp(const CameraApp());
}
/// CameraApp is the Main Application.
class CameraApp extends StatefulWidget {
/// Default Constructor
const CameraApp({Key? key}) : super(key: key);
@override
State<CameraApp> createState() => _CameraAppState();
}
class _CameraAppState extends State<CameraApp> {
late CameraController controller;
var isRecording = false;
@override
void initState() {
super.initState();
controller = CameraController(_cameras[0], ResolutionPreset.max);
controller.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
}).catchError((Object e) {
if (e is CameraException) {
switch (e.code) {
case 'CameraAccessDenied':
print('User denied camera access.');
break;
default:
print('Handle other errors.');
break;
}
}
});
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (!controller.value.isInitialized) {
return Container();
}
return MaterialApp(
home: Stack(children: [
CameraPreview(controller),
Positioned(
bottom: 12,
left: 0,
right: 0,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (!isRecording) ElevatedButton.icon(
onPressed: () {
setState(() => isRecording = true);
controller.startVideoRecording();
},
icon: const Icon(Icons.camera),
label: const Text('Record'),
),
if (isRecording) ElevatedButton.icon(
onPressed: () async {
setState(() => isRecording = false);
final video = await controller.stopVideoRecording();
await GallerySaver.saveVideo(video.path);
File(video.path).deleteSync();
},
icon: const Icon(Icons.stop),
label: const Text('Stop'),
),
],
),
)
]),
);
}
}
【讨论】: