Flutter音频录制插件flutter_audio_capture的使用

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

Flutter音频录制插件flutter_audio_capture的使用

flutter_audio_capture 是一个用于在 iOS 和 Android 设备上通过麦克风捕获音频流缓冲区的 Flutter 插件。支持的最低系统版本为 iOS 13+ 或 Android 23+。

开始使用

添加依赖

首先,在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_audio_capture: ^1.1.8

然后运行以下命令以获取包:

$ flutter pub get

配置权限

Android

如果要在 Android 上使用该插件,需要在 AndroidManifest.xml 中添加录音权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.ymd.flutter_audio_capture">
  ...
  <!-- Add this line -->
  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>

iOS

如果要在 iOS 上使用该插件,需要在 Info.plist 中添加麦克风使用描述:

<dict>
    <key>NSMicrophoneUsageDescription</key>
    <string>Need microphone access to capture audio</string>
    ...
</dict>

Linux

在 Linux 上,该插件使用 parec 来录制音频。确保目标设备上安装了 pulseaudio

示例代码

以下是一个完整的示例,展示了如何使用 flutter_audio_capture 插件来捕获和停止音频流缓冲区。

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

import 'package:flutter_audio_capture/flutter_audio_capture.dart';

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

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

class _MyAppState extends State<MyApp> {
  FlutterAudioCapture _plugin = FlutterAudioCapture();

  @override
  void initState() {
    super.initState();
    // 初始化插件(注意这是一个异步操作)
    _plugin.init();
  }

  Future<void> _startCapture() async {
    await _plugin.start(listener, onError, sampleRate: 16000, bufferSize: 3000);
  }

  Future<void> _stopCapture() async {
    await _plugin.stop();
  }

  void listener(dynamic obj) {
    var buffer = Float64List.fromList(obj.cast<double>());
    print(buffer);
  }

  void onError(Object e) {
    print(e);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Audio Capture Plugin'),
        ),
        body: Column(children: [
          Expanded(
              child: Row(
            children: [
              Expanded(
                  child: Center(
                      child: FloatingActionButton(
                          onPressed: _startCapture, child: Text("Start")))),
              Expanded(
                  child: Center(
                      child: FloatingActionButton(
                          onPressed: _stopCapture, child: Text("Stop")))),
            ],
          ))
        ]),
      ),
    );
  }
}

解释

  • 初始化:在 initState 方法中调用 _plugin.init() 来初始化插件。
  • 开始录制:通过 _startCapture 方法启动音频录制,传入回调函数 listener 和错误处理函数 onError
  • 停止录制:通过 _stopCapture 方法停止音频录制。
  • 回调函数listener 函数接收音频流缓冲区,并将其转换为 Float64List 打印出来。
  • 错误处理onError 函数处理录制过程中可能出现的错误。

以上就是 flutter_audio_capture 插件的基本使用方法和一个简单的示例应用。你可以根据实际需求进行扩展和修改。


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

1 回复

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


当然,以下是一个关于如何使用Flutter音频录制插件flutter_audio_capture的示例代码。这个插件允许你在Flutter应用中录制音频。

首先,确保你已经在pubspec.yaml文件中添加了flutter_audio_capture依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_audio_capture: ^x.y.z  # 替换为最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_audio_capture进行音频录制。

1. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_audio_capture/flutter_audio_capture.dart';

2. 初始化插件

在需要录制音频的地方,初始化FlutterAudioCapture实例:

FlutterAudioCapture audioCapture = FlutterAudioCapture();

3. 请求权限(如果需要)

在Android和iOS上,你可能需要请求麦克风权限。这通常在你的应用启动时完成,或者在你尝试开始录制之前。以下是一个简单的权限请求示例(注意:实际权限请求可能需要更复杂的处理,特别是当涉及到平台特定代码时):

Future<void> requestPermissions() async {
  if (await Permission.microphone.status.isDenied ||
      await Permission.microphone.status.isPermanentlyDenied) {
    await Permission.microphone.request();
  }

  if (await Permission.storage.status.isDenied ||
      await Permission.storage.status.isPermanentlyDenied) {
    await Permission.storage.request();
  }
}

4. 开始和停止录制

你可以使用startstop方法来开始和停止录制:

String? audioFilePath;

void startRecording() async {
  // 指定输出文件的路径(在Android上可以是应用的缓存目录)
  final Directory appDocDir = await getApplicationDocumentsDirectory();
  String appDocPath = appDocDir.path;
  audioFilePath = '$appDocPath/audio_output.aac';

  await audioCapture.start(
    path: audioFilePath!,
    format: AudioFormat.aac,
    codec: AudioCodec.aacLc,
    bitRate: 128000,
    sampleRate: 44100,
    numChannels: 2,
    enableNoiseReduction: true,
    enableEchoCancellation: true,
  );
}

void stopRecording() async {
  final String? recordedFilePath = await audioCapture.stop();
  print('Audio saved at $recordedFilePath');
}

5. 释放资源

完成录制后,记得释放资源:

void releaseResources() async {
  await audioCapture.dispose();
}

6. 完整示例

以下是一个完整的示例,将上述步骤整合在一起:

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_audio_capture/flutter_audio_capture.dart';
import 'package:path_provider/path_provider.dart';

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

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

class AudioRecorderScreen extends StatefulWidget {
  @override
  _AudioRecorderScreenState createState() => _AudioRecorderScreenState();
}

class _AudioRecorderScreenState extends State<AudioRecorderScreen> {
  FlutterAudioCapture? audioCapture;
  bool isRecording = false;

  @override
  void initState() {
    super.initState();
    audioCapture = FlutterAudioCapture();
    requestPermissions();
  }

  Future<void> requestPermissions() async {
    if (await Permission.microphone.status.isDenied ||
        await Permission.microphone.status.isPermanentlyDenied) {
      await Permission.microphone.request();
    }

    if (await Permission.storage.status.isDenied ||
        await Permission.storage.status.isPermanentlyDenied) {
      await Permission.storage.request();
    }
  }

  void startRecording() async {
    if (isRecording) return;

    final Directory appDocDir = await getApplicationDocumentsDirectory();
    String appDocPath = appDocDir.path;
    String filePath = '$appDocPath/audio_output.aac';

    await audioCapture!.start(
      path: filePath,
      format: AudioFormat.aac,
      codec: AudioCodec.aacLc,
      bitRate: 128000,
      sampleRate: 44100,
      numChannels: 2,
      enableNoiseReduction: true,
      enableEchoCancellation: true,
    );

    setState(() {
      isRecording = true;
    });
  }

  void stopRecording() async {
    if (!isRecording) return;

    final String? recordedFilePath = await audioCapture!.stop();
    print('Audio saved at $recordedFilePath');

    setState(() {
      isRecording = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Recorder'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: isRecording ? stopRecording : startRecording,
              child: Text(isRecording ? 'Stop Recording' : 'Start Recording'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    audioCapture?.dispose();
    super.dispose();
  }
}

这个示例展示了如何使用flutter_audio_capture插件进行音频录制,包括初始化插件、请求权限、开始和停止录制,以及释放资源。注意,这个示例代码使用了permission_handler插件来处理权限请求,你需要确保也在pubspec.yaml中添加了该依赖。

回到顶部