【问题标题】:Is there anyway to access native camera but only video recording in Flutter?无论如何可以访问本机相机,但只能在 Flutter 中录制视频?
【发布时间】:2022-06-28 00:09:37
【问题描述】:

我正在开发我的第一个应用程序。我只想为我的应用录制视频。可用的插件捕捉图片和录制视频。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    只需使用camera plugin 即可。它会向您显示相机预览,只需 Stacking 使用您自己的录制按钮即可。

    此外,如果您想将其保存到默认图库应用,请使用 gallery_saver plugin

    Idle Recording Galley video Gallery preview

    这是改编自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'),
                  ),
                ],
              ),
            )
          ]),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2016-09-23
      • 2013-07-24
      相关资源
      最近更新 更多