Flutter音频录制插件next_audio_recorder的使用

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

Flutter音频录制插件next_audio_recorder的使用

简介

next_audio_recorder 是一个用于在Flutter应用程序中录制音频的插件,它提供了设置订阅持续时间等额外功能。

功能特性

  • 在Flutter应用中录制音频。
  • 设置录音的订阅持续时间。

开始使用

要使用此插件,首先需要在 pubspec.yaml 文件中添加 next_audio_recorder 作为依赖项。

dependencies:
  next_audio_recorder: ^最新版本号

权限设置

在开始录音之前,确保为Android项目添加音频权限,并使用 PermissionHandler 包请求权限。

1. 修改 AndroidManifest.xml 文件,添加以下权限:

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

2. 使用 PermissionHandler 请求音频权限:

import 'package:permission_handler/permission_handler.dart';

Future<bool> _requestPermission() async {
  var status = await Permission.microphone.request();
  if (status != PermissionStatus.granted) {
    return false;
  }
  return true;
}

示例代码

以下是一个完整的示例代码,展示了如何使用 next_audio_recorder 插件进行音频录制和停止录音。

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:next_audio_recorder/next_audio_recorder.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Next Audio Recorder',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _nextAudioRecorder = NextAudioRecorder();
  // 控制音频订阅的刷新时间
  final double _subscriptionDuration = 100;

  // 开始录音
  startRecording() async {
    bool recordPermission = await _requestPermission();
    if (recordPermission) {
      await _nextAudioRecorder.startRecorder('output.mp4'); // 开始录音并指定输出文件名
      await _nextAudioRecorder.setSubscriptionDuration(_subscriptionDuration); // 设置订阅持续时间
      _nextAudioRecorder.startRecorderSubscriptions((e) async {
        // 可以在此处触发函数或监听特定任务,例如检测用户停止说话
      });
    } else {
      if (kDebugMode) {
        print('需要音频权限。');
      }
    }
  }

  // 停止录音
  stopRecorder() async {
    if (kDebugMode) {
      print('[StartRecordEvent] 停止录音');
    }
    _nextAudioRecorder.cancelRecorderSubscriptions(); // 取消订阅
    String? outputFilePath = await _nextAudioRecorder.stopRecorder(); // 停止录音并获取输出文件路径
    if (outputFilePath != null) {
      if (kDebugMode) {
        print('[StartRecordEvent] 输出录音文件路径: $outputFilePath');
      }
    } else {
      if (kDebugMode) {
        print('[StartRecordEvent] 未找到输出文件路径。');
      }
    }
  }

  // 请求音频权限
  Future<bool> _requestPermission() async {
    var status = await Permission.microphone.request();
    if (status != PermissionStatus.granted) {
      return false;
    }
    return true;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Next Audio Recorder'),
      ),
      body: Center(
        child: Column(children: [
          const SizedBox(height: 50),
          FilledButton(
            onPressed: startRecording,
            child: const Text('开始录音'),
          ),
          FilledButton(
            onPressed: stopRecorder,
            child: const Text('停止录音'),
          ),
          const Spacer(),
          const Text('Zeroboy'),
          const SizedBox(height: 50),
        ]),
      ),
    );
  }
}

自动停止录音

next_audio_recorder 还支持在检测到用户停止说话后自动停止录音。可以通过 startRecorderWithAutoStop 方法实现:

await _audioRecorder.startRecorderWithAutoStop(
  silentDecibelThreshold: 42, // 设置静音阈值(分贝)
  silentDurationSecond: 2, // 设置静音持续时间(秒)
  targetFilePath: 'output.mp4', // 指定输出文件路径
  onFinished: (outputFilePath) {
    // 录音完成后的回调
  },
);

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用next_audio_recorder插件进行音频录制的示例代码。这个插件允许你以相对简单的方式在Flutter应用中实现音频录制功能。

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

dependencies:
  flutter:
    sdk: flutter
  next_audio_recorder: ^latest_version  # 请替换为最新的版本号

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

接下来,在你的Flutter项目中创建一个页面,用于实现音频录制功能。以下是一个简单的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Audio Recorder Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AudioRecorderPage(),
    );
  }
}

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

class _AudioRecorderPageState extends State<AudioRecorderPage> {
  late NextAudioRecorder _recorder;
  late String _recordingPath;
  bool _isRecording = false;

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

  Future<void> _initRecorder() async {
    final Directory appDocDir = await getApplicationDocumentsDirectory();
    String appDocPath = appDocDir.path;
    _recordingPath = '$appDocPath/audio_${DateTime.now().millisecondsSinceEpoch}.wav';

    _recorder = NextAudioRecorder(
      audioFormat: AudioFormat.wav,
      codec: AudioCodec.aac,
      channel: AudioChannel.stereo,
      sampleRate: 44100,
      bitRate: 128000,
    );

    _recorder.recorderHandler = (event, map) {
      if (event == RecorderEvent.recorderStart) {
        setState(() {
          _isRecording = true;
        });
      } else if (event == RecorderEvent.recorderStop ||
          event == RecorderEvent.recorderCancel ||
          event == RecorderEvent.recorderError) {
        setState(() {
          _isRecording = false;
        });
      }
    };
  }

  Future<void> _startRecording() async {
    if (!_isRecording) {
      try {
        await _recorder.start(_recordingPath);
      } catch (e) {
        print('Start recording failed: $e');
      }
    }
  }

  Future<void> _stopRecording() async {
    if (_isRecording) {
      try {
        await _recorder.stop();
      } catch (e) {
        print('Stop recording failed: $e');
      }
    }
  }

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

  @override
  void dispose() {
    _recorder.dispose();
    super.dispose();
  }
}

解释

  1. 依赖管理:在pubspec.yaml中添加next_audio_recorder依赖。
  2. 页面布局:创建一个简单的Flutter页面,包含两个按钮用于开始和停止录音。
  3. 初始化录音器:在initState方法中初始化NextAudioRecorder实例,并设置录音文件的保存路径。
  4. 录音控制:提供_startRecording_stopRecording方法用于控制录音的开始和停止。
  5. UI更新:根据录音状态更新按钮的文本和可用性。
  6. 资源释放:在dispose方法中释放录音器资源。

这个示例展示了如何使用next_audio_recorder插件进行基本的音频录制功能。你可以根据需要进一步扩展和自定义功能。

回到顶部