Flutter音频录制插件record的使用

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

Flutter音频录制插件record的使用

插件简介

record 是一个用于从麦克风录制音频到给定文件路径或流的Flutter插件。它在不同平台上依赖不同的技术实现:

  • Android: 使用 AudioRecordMediaCodecMediaRecorder
  • iOS 和 macOS: 使用 AVFoundation
  • Windows: 使用 MediaFoundation
  • Web: 依赖浏览器及其底层平台
  • Linux: 编码由 fmedia 提供,必须单独安装

平台特性对等矩阵

Feature Android iOS web Windows macOS linux
pause/resume ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
amplitude(dBFS) ✔️ ✔️ ✔️ ✔️ ✔️
permission check ✔️ ✔️ ✔️ ✔️
num of channels ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
device selection ✔️ 1/2 自动 ✔️ ✔️ ✔️ ✔️
auto gain ✔️ 2 总是开启? ✔️
echo cancel ✔️ 2 ✔️
noise suppression ✔️ 2 ✔️

文件编码支持

Encoder Android iOS web Windows macOS linux
aacLc ✔️ ✔️ ? ✔️ ✔️ ✔️
aacEld ✔️ ✔️ ? ✔️
aacHe ✔️ ? ✔️
amrNb ✔️ ? ✔️
amrWb ✔️ ?
opus ✔️ ? ✔️
wav ✔️ 2 ✔️ ✔️ ✔️ ✔️ ✔️
flac ✔️ 2 ✔️ ? ✔️ ✔️ ✔️
pcm16bits ✔️ 2 ✔️ ✔️ ✔️ ✔️

流编码支持

Encoder Android iOS web Windows macOS linux
aacLc * ✔️ 2
aacEld * ✔️ 2
aacHe * ✔️ 2
pcm16bits ✔️ 2 ✔️ ✔️ ✔️ ✔️
  • AAC is streamed with raw AAC with ADTS headers, so it’s directly readable through a file!

使用示例

import 'package:record/record.dart';

final record = AudioRecorder();

// 检查并请求权限(如果需要)
if (await record.hasPermission()) {
  // 开始录音到文件
  await record.start(const RecordConfig(), path: 'aFullPath/myFile.m4a');
  // ... 或者开始录音到流
  final stream = await record.startStream(const RecordConfig(encoder: AudioEncoder.pcm16bits));
}

// 停止录音...
final path = await record.stop();
// ... 或者取消录音(并隐式删除文件/blob)
await record.cancel();

record.dispose(); // 不要忘记这一步

设置权限和其他配置

Android

根据需要跟随Gradle设置

添加以下权限到 AndroidManifest.xml

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 可选:如果你想要使用蓝牙电话设备如耳机/耳塞 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 可选:如果你想要将录音保存到公共文件夹 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 最低SDK版本:23 (amrNb/amrWb: 26, Opus: 29)

iOS

Info.plist 中添加以下内容:

<key>NSMicrophoneUsageDescription</key>
<string>描述为什么你需要这个权限</string>
  • 最低SDK版本:11.0

macOS

Info.plist 中添加以下内容:

<key>NSMicrophoneUsageDescription</key>
<string>描述为什么你需要这个权限</string>

或者直接在 *.entitlements 文件中:

<key>com.apple.security.device.audio-input</key>
<true/>
  • 最低SDK版本:10.15

Web

Web平台使用 package web >=0.5.1,这是从 Flutter >=3.22 版本开始提供的。

完整示例代码

下面是一个完整的示例代码,展示了如何使用 record 插件进行录音和播放:

import 'package:flutter/material.dart';
import 'package:record/record.dart';
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool showPlayer = false;
  String? audioPath;

  final Record _audioRecorder = Record();

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    if (!await _audioRecorder.hasPermission()) {
      await _audioRecorder.requestPermission();
    }
  }

  Future<void> startRecording() async {
    try {
      final directory = await getApplicationDocumentsDirectory();
      final path = '${directory.path}/test.m4a';
      if (await _audioRecorder.isPaused()) {
        await _audioRecorder.resume();
      } else {
        await _audioRecorder.start(
          path: path,
          encoder: AudioEncoder.aacLc,
          bitRate: 128000,
          samplingRate: 44100,
        );
      }
      setState(() {
        audioPath = path;
      });
    } catch (e) {
      print('Error starting recording: $e');
    }
  }

  Future<void> stopRecording() async {
    final path = await _audioRecorder.stop();
    setState(() {
      audioPath = path;
      showPlayer = true;
    });
  }

  Future<void> cancelRecording() async {
    await _audioRecorder.cancel();
    setState(() {
      audioPath = null;
      showPlayer = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Audio Recorder Example'),
        ),
        body: Center(
          child: showPlayer
              ? Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 25),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text('Recorded file path: $audioPath'),
                      ElevatedButton(
                        onPressed: () async {
                          await stopRecording();
                        },
                        child: const Text('Stop Recording'),
                      ),
                      ElevatedButton(
                        onPressed: () async {
                          await cancelRecording();
                        },
                        child: const Text('Cancel Recording'),
                      ),
                    ],
                  ),
                )
              : Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    ElevatedButton(
                      onPressed: () async {
                        await startRecording();
                      },
                      child: const Text('Start Recording'),
                    ),
                    ElevatedButton(
                      onPressed: () async {
                        await stopRecording();
                      },
                      child: const Text('Stop Recording'),
                    ),
                  ],
                ),
        ),
      ),
    );
  }
}

这个示例展示了如何使用 record 插件进行录音、停止录音以及取消录音,并在界面上显示相应的按钮和状态。希望这些信息能帮助你更好地理解和使用 record 插件!


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

1 回复

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


当然,以下是一个使用Flutter音频录制插件record的示例代码。这个插件允许你在Flutter应用中录制音频。首先,你需要在你的pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  record: ^2.0.0  # 请确保使用最新版本

然后运行flutter pub get来获取依赖项。

接下来,在你的Flutter项目中创建一个新的Dart文件,例如audio_recorder.dart,并编写以下代码:

import 'package:flutter/material.dart';
import 'package:record/record.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AudioRecorderPage(),
    );
  }
}

class AudioRecorderPage extends StatefulWidget {
  @override
  _AudioRecorderPageState createState() => _AudioRecorderPageState();
}

class _AudioRecorderPageState extends State<AudioRecorderPage> {
  late Recorder recorder;
  String? recordedFilePath;
  bool isRecording = false;

  @override
  void initState() {
    super.initState();
    // 初始化Recorder实例
    recorder = Recorder();
    recorder.initialize().then((_) {
      // 初始化成功后设置状态
      setState(() {});
    }).catchError((e) {
      print("初始化Recorder时出错: $e");
    });
  }

  @override
  void dispose() {
    // 释放Recorder资源
    recorder.dispose();
    super.dispose();
  }

  void startRecording() async {
    if (!isRecording) {
      setState(() {
        isRecording = true;
      });

      // 开始录制音频
      File? audioFile = await recorder.start(path: "${(await getApplicationDocumentsDirectory()).path}/audio_record.wav");
      if (audioFile != null) {
        setState(() {
          recordedFilePath = audioFile.path;
        });
      }

      // 停止录制(这里为了演示,录制5秒后停止)
      Future.delayed(Duration(seconds: 5), () {
        stopRecording();
      });
    }
  }

  void stopRecording() async {
    if (isRecording) {
      setState(() {
        isRecording = false;
      });

      // 停止录制音频
      await recorder.stop();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("音频录制示例"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: startRecording,
              child: Text(isRecording ? "停止录制" : "开始录制"),
            ),
            if (recordedFilePath != null)
              Text("录制文件路径: $recordedFilePath"),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何使用record插件进行基本的音频录制功能。以下是一些关键点:

  1. 初始化Recorder实例:在initState方法中初始化Recorder实例,并处理初始化成功或失败的情况。
  2. 开始录制音频:通过调用recorder.start方法开始录制音频,并保存音频文件路径。
  3. 停止录制音频:通过调用recorder.stop方法停止录制音频。
  4. 释放资源:在dispose方法中释放Recorder实例资源,以防止内存泄漏。

请注意,这个示例中录制5秒后自动停止录制,实际应用中你可能需要根据具体需求调整这部分逻辑。此外,请确保你的应用有适当的权限来访问存储和录制音频。

回到顶部