如何在 flutter 中使用 Camera Plugin 录制视频?
How to record a video with Camera Plugin in flutter?
我有这个页面,其中相机已初始化并准备就绪,带有一个按钮可以录制和停止视频,所以我尝试了这个:
FlatButton(
onPressed: () => {
!isRecording
? {
setState(() {
isRecording = true;
}),
cameraController.prepareForVideoRecording(),
cameraController.startVideoRecording('assets/Videos/test.mp4')
}
: cameraController.stopVideoRecording(),
},
............
但抛出此错误:nhandled Exception: CameraException(videoRecordingFailed, assets/Videos/test.mp4: open failed: ENOENT (No such file or directory))
。
我不明白,我不想打开这个文件我想把它保存在那里,我的代码有什么问题吗?
您正试图将视频保存在资产文件夹中,但这是不可能的,
您需要做的是将下载或应用程序目录等常用文件夹本地保存到设备。
这是一个如何着手的例子
dependencies:
path_provider:
Flutter plugin for getting commonly used locations on host platform
file systems, such as the temp and app data directories.
我们会将视频保存到应用程序目录。
我们需要获取文件所在目录的路径。通常一个文件放在应用程序的文档目录、应用程序的缓存目录或外部存储目录中。为了方便获取路径,减少打字的几率,我们可以使用PathProvider
Future<String> _startVideoRecording() async {
if (!controller.value.isInitialized) {
return null;
}
// Do nothing if a recording is on progress
if (controller.value.isRecordingVideo) {
return null;
}
//get storage path
final Directory appDirectory = await getApplicationDocumentsDirectory();
final String videoDirectory = '${appDirectory.path}/Videos';
await Directory(videoDirectory).create(recursive: true);
final String currentTime = DateTime.now().millisecondsSinceEpoch.toString();
final String filePath = '$videoDirectory/${currentTime}.mp4';
try {
await controller.startVideoRecording(filePath);
videoPath = filePath;
} on CameraException catch (e) {
_showCameraException(e);
return null;
}
//gives you path of where the video was stored
return filePath;
}
在新版本中,静态方法startRecordingVideo 不接受任何字符串参数。
当你想开始录制时,看看是否已经录制了视频,如果没有开始
if (!_controller.value.isRecordingVideo) {
_controller.startVideoRecording();
}
当你想完成录制时,你可以调用静态方法 stopVideoRecording() 它会给你一个 class XFile 的对象,它会有你的视频的路径。
if (_controller.value.isRecordingVideo) {
XFile videoFile = await _controller.stopVideoRecording();
print(videoFile.path);//and there is more in this XFile object
}
这东西对我有用。我是 flutter 的新手,如果你知道更多,请改进我的答案。
我有这个页面,其中相机已初始化并准备就绪,带有一个按钮可以录制和停止视频,所以我尝试了这个:
FlatButton(
onPressed: () => {
!isRecording
? {
setState(() {
isRecording = true;
}),
cameraController.prepareForVideoRecording(),
cameraController.startVideoRecording('assets/Videos/test.mp4')
}
: cameraController.stopVideoRecording(),
},
............
但抛出此错误:nhandled Exception: CameraException(videoRecordingFailed, assets/Videos/test.mp4: open failed: ENOENT (No such file or directory))
。
我不明白,我不想打开这个文件我想把它保存在那里,我的代码有什么问题吗?
您正试图将视频保存在资产文件夹中,但这是不可能的,
您需要做的是将下载或应用程序目录等常用文件夹本地保存到设备。
这是一个如何着手的例子
dependencies:
path_provider:
Flutter plugin for getting commonly used locations on host platform file systems, such as the temp and app data directories.
我们会将视频保存到应用程序目录。
我们需要获取文件所在目录的路径。通常一个文件放在应用程序的文档目录、应用程序的缓存目录或外部存储目录中。为了方便获取路径,减少打字的几率,我们可以使用PathProvider
Future<String> _startVideoRecording() async {
if (!controller.value.isInitialized) {
return null;
}
// Do nothing if a recording is on progress
if (controller.value.isRecordingVideo) {
return null;
}
//get storage path
final Directory appDirectory = await getApplicationDocumentsDirectory();
final String videoDirectory = '${appDirectory.path}/Videos';
await Directory(videoDirectory).create(recursive: true);
final String currentTime = DateTime.now().millisecondsSinceEpoch.toString();
final String filePath = '$videoDirectory/${currentTime}.mp4';
try {
await controller.startVideoRecording(filePath);
videoPath = filePath;
} on CameraException catch (e) {
_showCameraException(e);
return null;
}
//gives you path of where the video was stored
return filePath;
}
在新版本中,静态方法startRecordingVideo 不接受任何字符串参数。 当你想开始录制时,看看是否已经录制了视频,如果没有开始
if (!_controller.value.isRecordingVideo) {
_controller.startVideoRecording();
}
当你想完成录制时,你可以调用静态方法 stopVideoRecording() 它会给你一个 class XFile 的对象,它会有你的视频的路径。
if (_controller.value.isRecordingVideo) {
XFile videoFile = await _controller.stopVideoRecording();
print(videoFile.path);//and there is more in this XFile object
}
这东西对我有用。我是 flutter 的新手,如果你知道更多,请改进我的答案。