Flutter音频录制与播放插件flutter_sound的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter音频录制与播放插件flutter_sound的使用

概述

Flutter Sound 是一个允许您在Flutter应用程序中播放和录制音频的包。它支持Android、iOS和Flutter Web平台,并提供了高级API和小部件,以实现播放和录制音频的功能。

Demo

主要特性

  • 支持多种编解码器播放和录制音频或音乐。
  • 播放本地或远程文件(通过URL指定)。
  • 播放资源文件。
  • 使用内置的SoundPlayerUI小部件播放音频。
  • 自定义利用Flutter Sound API的播放界面。
  • 使用内置的SoundRecorderUI小部件录制音频。
  • 自定义利用Flutter Sound API的录音界面。
  • 支持当应用程序暂停/恢复时释放/恢复资源。
  • 录制到Dart Stream。
  • 从Dart Stream回放。
  • 可以从设备锁屏或Apple Watch控制应用程序回放。

示例代码

下面是一个完整的示例应用,展示了如何使用flutter_sound进行简单的音频播放和录制。

import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'dart:io';
import 'dart:async';

class SimplePlayback extends StatefulWidget {
  const SimplePlayback({super.key});

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

class _SimplePlaybackState extends State<SimplePlayback> {
  final FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer();
  bool _isPlaying = false;

  @override
  void initState() {
    super.initState();
    _audioPlayer.openAudioSession();
  }

  @override
  void dispose() {
    _audioPlayer.closeAudioSession();
    super.dispose();
  }

  Future<void> _play() async {
    await _audioPlayer.startPlayer(
      fromURI: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
      whenFinished: () {
        setState(() {
          _isPlaying = false;
        });
      },
    );
    setState(() {
      _isPlaying = true;
    });
  }

  Future<void> _stop() async {
    await _audioPlayer.stopPlayer();
    setState(() {
      _isPlaying = false;
    });
  }

  @override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: const Text('Simple Playback Example'),
    ),
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: _isPlaying ? null : _play,
            child: const Text('Play'),
          ),
          if (_isPlaying)
            ElevatedButton(
              onPressed: _stop,
              child: const Text('Stop'),
            ),
        ],
      ),
    ),
  );
}
}

简单录音示例

import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'dart:io';
import 'dart:async';

class SimpleRecorder extends StatefulWidget {
  const SimpleRecorder({super.key});

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

class _SimpleRecorderState extends State<SimpleRecorder> {
  final FlutterSoundRecorder _audioRecorder = FlutterSoundRecorder();
  String? _recordingPath;
  bool _isRecording = false;

  @override
  void initState() {
    super.initState();
    _audioRecorder.openAudioSession();
  }

  @override
  void dispose() {
    _audioRecorder.closeAudioSession();
    super.dispose();
  }

  Future<void> _startRecording() async {
    if (!await _audioRecorder.isEncoderAvailable(Codec.aacADTS)) {
      print('Encoder not available');
      return;
    }
    final path = './test.aac';
    await _audioRecorder.startRecorder(toFile: path);
    setState(() {
      _recordingPath = path;
      _isRecording = true;
    });
  }

  Future<void> _stopRecording() async {
    final result = await _audioRecorder.stopRecorder();
    setState(() {
      _recordingPath = result;
      _isRecording = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Simple Recorder Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _isRecording ? null : _startRecording,
              child: const Text('Start Recording'),
            ),
            if (_isRecording)
              ElevatedButton(
                onPressed: _stopRecording,
                child: const Text('Stop Recording'),
              ),
          ],
        ),
      ),
    );
  }
}

集成到主应用

为了集成上述功能到您的Flutter应用程序中,您可以创建一个包含这些页面的应用入口点:

void main() {
  runApp(MaterialApp(
    home: ExamplesApp(),
  ));
}

class ExamplesApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Sound Examples',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const ExamplesAppHomePage(title: 'Flutter Sound Examples'),
    );
  }
}

class ExamplesAppHomePage extends StatefulWidget {
  final String? title;

  const ExamplesAppHomePage({Key? key, this.title}) : super(key: key);

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

class _ExamplesHomePageState extends State<ExamplesAppHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                Navigator.push(context, MaterialPageRoute(builder: (context) => const SimplePlayback()));
              },
              child: const Text('Simple Playback'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(context, MaterialPageRoute(builder: (context) => const SimpleRecorder()));
              },
              child: const Text('Simple Recorder'),
            ),
          ],
        ),
      ),
    );
  }
}

以上就是使用flutter_sound插件进行音频播放和录制的基本方法。希望这对您有所帮助!如果您有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter音频录制与播放插件flutter_sound的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频录制与播放插件flutter_sound的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用flutter_sound插件进行音频录制与播放的示例代码。flutter_sound是一个功能强大的插件,支持跨平台的音频录制和播放功能。

首先,你需要在你的pubspec.yaml文件中添加flutter_sound依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_sound: ^9.1.5  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个完整的示例代码,展示如何使用flutter_sound进行音频录制和播放:

import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'dart:typed_data/typed_data.dart';
import 'dart:io';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Sound Demo'),
        ),
        body: AudioControl(),
      ),
    );
  }
}

class AudioControl extends StatefulWidget {
  @override
  _AudioControlState createState() => _AudioControlState();
}

class _AudioControlState extends State<AudioControl> {
  late FlutterSound flutterSound;
  late FlutterSoundRecorder recorder;
  late FlutterSoundPlayer player;
  bool isRecording = false;
  bool isPlaying = false;
  String? filePath;

  @override
  void initState() {
    super.initState();
    flutterSound = FlutterSound();
    recorder = flutterSound.recorder;
    player = flutterSound.player;

    // 配置录音设置
    recorder.setSubscriptionDurationInMs(1000);  // 每秒回调一次
    recorder.setAudioEncoder(AudioEncoder.AAC);
    recorder.setOutputFormat(OutputFormat.THREE_GPP);
    recorder.setAudioSampleRate(44100);
    recorder.setNumberOfChannels(1);
    recorder.setBitRate(128000);

    // 配置播放设置
    player.setVolume(1.0);

    // 初始化FlutterSound
    flutterSound.openRecorder().then((_) {
      print("Recorder initialized");
    }).catchError((e) {
      print("Error initializing recorder: $e");
    });
  }

  @override
  void dispose() {
    flutterSound.close();
    super.dispose();
  }

  void startRecording() async {
    if (!isRecording) {
      filePath = (await getApplicationDocumentsDirectory()).path + "/audio_record.3gp";
      await recorder.startRecorder(filePath!);
      setState(() {
        isRecording = true;
      });
    }
  }

  void stopRecording() async {
    if (isRecording) {
      await recorder.stopRecorder();
      setState(() {
        isRecording = false;
      });
    }
  }

  void playRecording() async {
    if (filePath != null && !isPlaying) {
      await player.startPlayer(filePath!);
      setState(() {
        isPlaying = true;
      });
    }
  }

  void stopPlaying() async {
    if (isPlaying) {
      await player.stopPlayer();
      setState(() {
        isPlaying = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          ElevatedButton(
            onPressed: startRecording,
            child: Text("Start Recording"),
            style: ButtonStyle(
              overlayColor: MaterialStateProperty.all(isRecording ? Colors.red : Colors.blue),
            ),
          ),
          ElevatedButton(
            onPressed: stopRecording,
            child: Text("Stop Recording"),
            style: ButtonStyle(
              overlayColor: MaterialStateProperty.all(isRecording ? Colors.green : Colors.grey),
            ),
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: playRecording,
            child: Text("Play Recording"),
            style: ButtonStyle(
              overlayColor: MaterialStateProperty.all(isPlaying ? Colors.red : Colors.blue),
            ),
          ),
          ElevatedButton(
            onPressed: stopPlaying,
            child: Text("Stop Playing"),
            style: ButtonStyle(
              overlayColor: MaterialStateProperty.all(isPlaying ? Colors.green : Colors.grey),
            ),
          ),
        ],
      ),
    );
  }
}

注意事项

  1. 权限

    • 在Android上,你需要在AndroidManifest.xml中请求录音和写存储权限。
    • 在iOS上,你需要在Info.plist中添加相应的权限描述。
  2. 错误处理

    • 示例代码中没有包含详细的错误处理逻辑,实际项目中应添加必要的错误处理。
  3. UI更新

    • 示例中使用了setState来更新UI状态,确保UI与音频录制和播放状态同步。
  4. 资源管理

    • 确保在dispose方法中关闭FlutterSound实例,以避免资源泄漏。
  5. 路径处理

    • 示例中使用了getApplicationDocumentsDirectory()来获取应用的文档目录路径,用于存储录音文件。

希望这个示例能帮助你理解如何在Flutter中使用flutter_sound插件进行音频录制和播放。

回到顶部