首页 > 解决方案 > 在 Flutter 中播放相机快门声音

问题描述

我想在开始/停止录制视频时播放声音。Flutter 中是否有一种简单的方法可以做到这一点?

或者我需要拥有自己的声音并使用例如https://pub.dev/packages/just_audio来播放它?

标签: flutter

解决方案


您可以在下面复制粘贴运行完整代码,完整代码已在真实设备上测试并且工作正常
来自https://medium.com/swlh/build-a-dog-camera-using-flutter-and-tensorflow-312022b716c6
您可以使用打包https://pub.dev/packages/soundpool并下载快门声音
相机快门声音由用户Snapper4298录制freesound.orghttps://freesound.org/people/Snapper4298/sounds/178186/
下载并放在项目assets文件夹中。
代码片段

Soundpool _soundpool;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  _soundpool = Soundpool(streamType: StreamType.notification);
  runApp(MyApp());
}

...
  Future<int> _soundId;
  int _alarmSoundStreamId;

  Future<int> _loadSound() async {
    var asset = await rootBundle
        .load("assets/178186__snapper4298__camera-click-nikon.wav");
    return await _soundpool.load(asset);
  }

  Future<void> _playSound() async {
    var _alarmSound = await _soundId;
    _alarmSoundStreamId = await _soundpool.play(_alarmSound);
  }

  void _incrementCounter() async {
    _playSound();

    setState(() {
      _counter++;
    });
  }

  @override
  void initState() {
    _soundId = _loadSound();
  }

完整代码

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:soundpool/soundpool.dart';
import 'package:flutter/services.dart';
import 'package:flutter/foundation.dart';

Soundpool _soundpool;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  _soundpool = Soundpool(streamType: StreamType.notification);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  Future<int> _soundId;
  int _alarmSoundStreamId;

  Future<int> _loadSound() async {
    var asset = await rootBundle
        .load("assets/178186__snapper4298__camera-click-nikon.wav");
    return await _soundpool.load(asset);
  }

  Future<void> _playSound() async {
    print('play');
    var _alarmSound = await _soundId;
    _alarmSoundStreamId = await _soundpool.play(_alarmSound);
  }

  void _incrementCounter() async {
    _playSound();

    setState(() {
      _counter++;
    });
  }

  @override
  void initState() {
    _soundId = _loadSound();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

推荐阅读