Flutter音频录制插件flutter_audio_recorder4的使用

Flutter音频录制插件flutter_audio_recorder4的使用

flutter_audio_recorder4 是一个支持录制、暂停、恢复和停止音频,并且提供音频级别表属性访问的插件。它基于 flutter_audio_recorder1/2/3 进行了改进。

主要原因

  1. 其他仓库没有跟上时代的步伐。
  2. 修复以下 Android 警告:
    The plugin flutter_audio_recorder3 uses a deprecated version of the Android embedding.
    
  3. 修复在 Mac Sonoma 上的 Android Gradle 插件错误:
    The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher.
    

支持平台

该插件支持 AndroidiOS 平台。

安装

pubspec.yaml 文件中添加 flutter_audio_recorder4

dependencies:
  flutter_audio_recorder4: ^版本号

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

iOS权限

1. 添加描述到 Info.plist

<key>NSMicrophoneUsageDescription</key>
<string>Can We Use Your Microphone Please</string>

2. 使用 hasPermission API 请求权限

bool hasPermission = await FlutterAudioRecorder4.hasPermissions;

Android权限

1. 在 AndroidManifest.xml 中添加权限

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2. 使用 hasPermission API 请求权限

bool hasPermission = await FlutterAudioRecorder4.hasPermissions;

配置

iOS

确保 iOS 的部署目标为 8.0 或更高版本。

Android

  • 使用最新版本的 AndroidX(0.5.x
  • 使用旧版本的 Legacy Android(0.4.9

使用方法

推荐的 API 使用顺序:hasPermission => init => start -> (pause <-> resume) * n -> stop。在开始新的录音之前,再次调用 init

检查权限

bool hasPermission = await FlutterAudioRecorder4.hasPermissions;

初始化

var recorder = FlutterAudioRecorder4("file_path.mp4"); // .wav .aac .m4a
await recorder.initialized;

或者指定音频格式:

var recorder = FlutterAudioRecorder4("file_path", audioFormat: AudioFormat.AAC); // 或者 AudioFormat.WAV
await recorder.initialized;

设置采样率:

var recorder = FlutterAudioRecorder4("file_path", audioFormat: AudioFormat.AAC, sampleRate: 22000); // 默认采样率为 16000
await recorder.initialized;

开始录音

await recorder.start();
var recording = await recorder.current(channel: 0);

获取录音详情

var current = await recording.current(channel: 0);
// 打印当前状态
// print(current.status);

// 使用定时器每 50ms 访问一次详情
new Timer.periodic(tick, (Timer t) async {
    var current = await recording.current(channel: 0);
    // 打印当前状态
    // print(current.status);
    setState(() {});
});

录音对象属性

名称 类型
path String
extension String
duration Duration
audioFormat AudioFormat
metering AudioMetering
status RecordingStatus

录音对象计量属性

名称 类型
peakPower double
averagePower double
isMeteringEnabled bool

录音状态

状态
Unset
Initialized
Recording
Paused
Stopped

暂停

await recorder.pause();

恢复

await recorder.resume();

停止

var result = await recorder.stop();
File file = widget.localFileSystem.file(result.path);

示例代码

以下是一个完整的示例代码:

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

import 'package:flutter/services.dart';
import 'package:flutter_audio_recorder4/flutter_audio_recorder4.dart';
import 'package:flutter_audio_recorder4_example/RecorderExample.dart';
import 'package:package_info_plus/package_info_plus.dart';

void main() {
  // 确保在 runApp() 之前初始化
  WidgetsFlutterBinding.ensureInitialized();

  SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
  runApp(const MyApp());
}

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  String _appName = "Unknown";
  String _packageName = "Unknown";
  String _version = "Unknown";
  String _buildNumber = "Unknown";

  String _platformVersion = "Unknown";

  final _flutterAudioRecorder4Plugin = FlutterAudioRecorder4(null);

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 异步初始化平台状态
  Future<void> initPlatformState() async {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();

    String platformVersion;
    try {
      platformVersion = await _flutterAudioRecorder4Plugin.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _appName = packageInfo.appName;
      _packageName = packageInfo.packageName;
      _version = packageInfo.version;
      _buildNumber = packageInfo.buildNumber;
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Column(
            children: [
              Text(_appName),
              Text(' $_version +$_buildNumber on $_platformVersion'),
            ],
          )
        ),
        body: const SafeArea(
          child: RecorderExample()
        )
      ),
    );
  }
}

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

1 回复

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


flutter_audio_recorder4 是一个用于在 Flutter 应用中录制音频的插件。它提供了简单的 API 来开始、停止和暂停音频录制,并支持保存录制的音频文件。以下是使用 flutter_audio_recorder4 插件的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_audio_recorder4 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_audio_recorder4: ^1.0.0  # 请检查最新版本

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

2. 配置权限

在 Android 和 iOS 上,你需要为应用配置音频录制权限。

Android

android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

iOS

ios/Runner/Info.plist 文件中添加以下权限:

<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风以录制音频。</string>

3. 初始化录音器

在你的 Dart 代码中,初始化 FlutterAudioRecorder4

import 'package:flutter_audio_recorder4/flutter_audio_recorder4.dart';
import 'package:permission_handler/permission_handler.dart';

class AudioRecorder {
  FlutterAudioRecorder4? _recorder;

  Future<void> init() async {
    // 检查并请求录音权限
    var status = await Permission.microphone.status;
    if (!status.isGranted) {
      await Permission.microphone.request();
    }

    // 初始化录音器
    _recorder = FlutterAudioRecorder4('path/to/save/audio.mp4', audioFormat: AudioFormat.AAC);
    await _recorder!.initialized;
  }
}

4. 开始录音

使用 start() 方法开始录音。

Future<void> startRecording() async {
  await _recorder!.start();
}

5. 暂停/恢复录音

你可以使用 pause()resume() 方法来暂停和恢复录音。

Future<void> pauseRecording() async {
  await _recorder!.pause();
}

Future<void> resumeRecording() async {
  await _recorder!.resume();
}

6. 停止录音

使用 stop() 方法停止录音,并获取录制的音频文件。

Future<String> stopRecording() async {
  var recording = await _recorder!.stop();
  return recording.path;  // 返回录音文件的路径
}

7. 完整示例

以下是一个简单的完整示例,展示了如何使用 flutter_audio_recorder4 来录制音频。

import 'package:flutter/material.dart';
import 'package:flutter_audio_recorder4/flutter_audio_recorder4.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

class AudioRecorderPage extends StatefulWidget {
  [@override](/user/override)
  _AudioRecorderPageState createState() => _AudioRecorderPageState();
}

class _AudioRecorderPageState extends State<AudioRecorderPage> {
  FlutterAudioRecorder4? _recorder;
  bool _isRecording = false;
  String? _audioPath;

  [@override](/user/override)
  void initState() {
    super.initState();
    initRecorder();
  }

  Future<void> initRecorder() async {
    var status = await Permission.microphone.status;
    if (!status.isGranted) {
      await Permission.microphone.request();
    }

    _recorder = FlutterAudioRecorder4('path/to/save/audio.mp4', audioFormat: AudioFormat.AAC);
    await _recorder!.initialized;
  }

  Future<void> startRecording() async {
    await _recorder!.start();
    setState(() {
      _isRecording = true;
    });
  }

  Future<void> stopRecording() async {
    var recording = await _recorder!.stop();
    setState(() {
      _isRecording = false;
      _audioPath = recording.path;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Recorder'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _isRecording
                ? Text('Recording...')
                : Text('Press the button to start recording'),
            SizedBox(height: 20),
            _audioPath != null
                ? Text('Audio saved at: $_audioPath')
                : Container(),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _isRecording ? stopRecording : startRecording,
              child: Text(_isRecording ? 'Stop Recording' : 'Start Recording'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部