返回顶部
首页 > 资讯 > 移动开发 >基于flutter sound插件实现录音与播放功能
  • 336
分享到

基于flutter sound插件实现录音与播放功能

2024-04-02 19:04:59 336人浏览 八月长安
摘要

目录插件介绍:插件信息:插件使用前的准备工作设置麦克风权限描述权限管理插件 permission_handler音频硬件配置插件 audio_session动画插件常用的方法录音常见

插件介绍:

Flutter_sound这个插件可以实现iOSAndroid平台的录音和播放功能。即可以播放本地音频文件,也可以播放远程URL文件。在这里我讲介绍这个插件的用法以及碰到的一些常见问题如何解决。

  • flutter_sound支持多种录音格式

  • flutter_sound支持多种播放格式

  • flutter_sound支持音频振幅大小

插件信息:

插件地址:GitHub.com/ryanheise/a…

插件版本:9.2.9

插件使用前的准备工作

设置麦克风权限描述

  • iOS:需要在info.plist文件添加一下权限
<key>NSMicrophoneUsageDescription</key>
<string>描述你使用麦克风用来干嘛</string>

注意:还需要在Podfile文件中配置

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  target.build_configurations.each do |config|
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
          '$(inherited)',
          ## dart: PermissionGroup.microphone
          'PERMISSION_MICROPHONE=1',
        ]
      end
    end
  end

还需要在iOS工程中增加libc++.tbd库,具体路径

  • Android:需要设置AndroidManifest.xml
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这里还用了下面几个插件

权限管理插件 permission_handler

插件信息:permission_handler: ^9.2.0

插件地址:pub.flutter-io.cn/packages/pe…

音频硬件配置插件 audio_session

插件信息:audio_session: ^0.1.6

插件地址:github.com/ryanheise/a…

动画插件

插件信息:lottie: 1.2.1

插件地址:pub.flutter-io.cn/packages/fl…

常用的方法

录音常见的方法

初始化录音对象

FlutterSoundRecorder recorderModule = FlutterSoundRecorder();

开启录音

Future<void> init() async {
  //开启录音
  await recorderModule.openRecorder();
  //设置订阅计时器
  await recorderModule
      .setSubscriptionDuration(const Duration(milliseconds: 10));
  //初始化日期插件
  await initializeDateFORMatting();
}

麦克风权限

Future<bool> getPermissionStatus() async {
  Permission permission = Permission.microphone;
  //granted 通过,denied 被拒绝,permanentlyDenied 拒绝且不在提示
  PermissionStatus status = await permission.status;
  if (status.isGranted) {
    return true;
  } else if (status.isDenied) {
    requestPermission(permission);
  } else if (status.isPermanentlyDenied) {
    openAppSettings();
  } else if (status.isRestricted) {
    requestPermission(permission);
  } else {}
  return false;
}

///申请权限
void requestPermission(Permission permission) async {
  PermissionStatus status = await permission.request();
  if (status.isPermanentlyDenied) {
    openAppSettings();
  }
}

开始录音

/// 开始录音
_startRecorder() async {
  try {
    //获取麦克风权限
    await getPermissionStatus().then((value) async {
      if (!value) {
        return;
      }
      //用户允许使用麦克风之后开始录音
      Directory tempDir = await getTemporaryDirectory();
      var time = DateTime.now().millisecondsSinceEpoch;
      String path = '${tempDir.path}/$time${ext[Codec.aacADTS.index]}';
      
      //这里我录制的是aac格式的,还有其他格式
      await recorderModule.startRecorder(
        toFile: path,
        codec: Codec.aacADTS,
        bitRate: 8000,
        numChannels: 1,
        sampleRate: 8000,
      );
      /// 监听录音
      _recorderSubscription = recorderModule.onProgress!.listen((e) {
        var date = DateTime.fromMillisecondsSinceEpoch(
            e.duration.inMilliseconds,
            isUtc: true);
        var txt = DateFormat('mm:ss:SS', 'en_GB').format(date);
        //设置了最大录音时长
        if (date.second >= _maxLength) {
          _stopRecorder();
          return;
        }
        setState(() {
          //更新录音时长
          _recordText = txt.substring(1, 5);
        });
      });
      setState(() {
         //更新录音状态和录音文件路径
        _state = RecordPlayState.recording;
        _path = path;
      });
    });
  } catch (err) {
    setState(() {
      _stopRecorder();
      _state = RecordPlayState.record;
      _cancelRecorderSubscriptions();
    });
  }
}

结束录音

/// 结束录音
_stopRecorder() async {
  try {
    await recorderModule.stopRecorder();
    _cancelRecorderSubscriptions();
    // _getDuration();
  } catch (err) {}
  setState(() {
    _state = RecordPlayState.record;
  });
}
///销毁录音
void dispose() {
  super.dispose();
  _cancelRecorderSubscriptions();
  _releaseFlauto();
}
/// 取消录音监听
void _cancelRecorderSubscriptions() {
  if (_recorderSubscription != null) {
    _recorderSubscription!.cancel();
    _recorderSubscription = null;
  }
}
/// 释放录音
Future<void> _releaseFlauto() async {
  try {
    await recorderModule.closeRecorder();
  } catch (e) {}
}
/// 判断文件是否存在
Future<bool> _fileExists(String path) async {
  return await File(path).exists();
}

播放常见的方法

初始化播放器

FlutterSoundPlayer playerModule = FlutterSoundPlayer();

初始化操作

init() async {
  await playerModule.closePlayer();
  await playerModule.openPlayer();
  await playerModule
      .setSubscriptionDuration(const Duration(milliseconds: 10));
//这块是设置音频,暂时没用到可以不用设置
  final session = await AudioSession.instance;
  await session.configure(AudioSessionConfiguration(
    avAudioSessionCateGory: AVAudioSessionCategory.playAndRecord,
    avAudioSessionCategoryOptions:
        AVAudioSessionCategoryOptions.allowBluetooth |
            AVAudioSessionCategoryOptions.defaultToSpeaker,
    avAudioSessionMode: AVAudioSessionMode.spokenAudio,
    avAudioSessionRouteSharingPolicy:
        AVAudioSessionRouteSharingPolicy.defaultPolicy,
    avAudioSessionSetActiveOptions: AVAudioSessionSetActiveOptions.none,
    androidAudioAttributes: const AndroidAudioAttributes(
      contentType: AndroidAudiocontentType.speech,
      flags: AndroidAudioFlags.none,
      usage: AndroidAudioUsage.voiceCommunication,
    ),
    androidAudioFocusGainType: AndroidAudioFocusGainType.gain,
    androidWillPauseWhenDucked: true,
  ));
}

开始播放

///开始播放,这里做了一个播放状态的回调
void startPlayer(PlayStateBack callBack) async {
  try {
    if (path.contains('Http')) {
      await playerModule.startPlayer(
          fromURI: path,
          codec: Codec.mp3,
          sampleRate: 44000,
          whenFinished: () {
            stopPlayer();
            callBack(0);
          });
    } else {
      //判断文件是否存在
      if (await _fileExists(path)) {
        if (playerModule.isPlaying) {
          playerModule.stopPlayer();
        }
        await playerModule.startPlayer(
            fromURI: path,
            codec: Codec.aacADTS,
            sampleRate: 44000,
            whenFinished: () {
              stopPlayer();
              callBack(0);
            });
      } else {}
    }
    //监听播放进度
    _playerSubscription = playerModule.onProgress!.listen((e) {});
    callBack(1);
  } catch (err) {
    callBack(0);
  }
}

结束播放

/// 结束播放
void stopPlayer() async {
  try {
    await playerModule.stopPlayer();
    cancelPlayerSubscriptions();
  } catch (err) {}
}
/// 取消播放监听
void cancelPlayerSubscriptions() {
  if (_playerSubscription != null) {
    _playerSubscription!.cancel();
    _playerSubscription = null;
  }
}
///获取播放状态
Future<PlayerState> getPlayState() async {
  return await playerModule.getPlayerState();
}
/// 释放播放器
void releaseFlauto() async {
  try {
    await playerModule.closePlayer();
  } catch (e) {
    print(e);
  }
}
/// 判断文件是否存在
Future<bool> _fileExists(String path) async {
  return await File(path).exists();
}

动画实现

在进行录音和播放的过程中难免使用到动画,这里我说下如何加载gif和动画文件

加载GIF动画

Visibility(
  visible: (item.playing.value == 1) ? true : false,
  child: Image.asset('assets/-comm/comm_audio_paly.gif', width: 20, height: 20,),
  replacement: const Image(
    image: AssetImage('assets/-comm/comm_audio_icon.png'),
    width: 20,
    height: 20,
  ),
)

加载动画文件

Lottie.asset('assets/-comm/record_audio_animation.JSON',
    height: 25,
    width: ScreenAdapter.screenWidth() -ScreenAdapter.width(160),
    animate: true)

上传文件

上传音频文件

var map = {
  "file": MultipartFile.fromBytes(
      await File.fromUri(Uri(path: path)).readAsBytes(),
      filename: "$fileName.mp3",
      contentType: MediaType.parse("audio/mp3"))
};

总结

上面介绍了如何录音,如何播放本地和远程音频文件,以及如何实现动画,在录制完音频文件后如何上传,这些都是我们平常使用这个功能会遇到的问题。在使用的过程中遇到的问题也有列出,希望对您有所帮助。

到此这篇关于基于flutter sound插件实现录音与播放功能的文章就介绍到这了,更多相关flutter sound录音与播放内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 基于flutter sound插件实现录音与播放功能

本文链接: https://lsjlt.com/news/149050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于flutter sound插件实现录音与播放功能
    目录插件介绍:插件信息:插件使用前的准备工作设置麦克风权限描述权限管理插件 permission_handler音频硬件配置插件 audio_session动画插件常用的方法录音常见...
    99+
    2024-04-02
  • java实现录音播放功能
    本文实例为大家分享了java实现录音播放的具体代码,供大家参考,具体内容如下 需求: 1.实现可以从麦克风进行录音 2.可以停止录音 3.实现播放录音内容 4.并将所录的mp3文件全...
    99+
    2022-11-13
    java 录音 播放
  • 微信小程序实现录音与音频播放功能
    目录1、录音1.1 案例2、音频播放控制2.1 案例小程序继承了微信强大的语音处理功能,提供了录音、音频播放控制和背景音乐等功能,它们的功能不同,但有相似性。 1、录音 小程序提供了...
    99+
    2024-04-02
  • 微信小程序如何实现录音与播放录音功能
    这篇文章主要为大家展示了“微信小程序如何实现录音与播放录音功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序如何实现录音与播放录音功能”这篇文章吧。小...
    99+
    2024-04-02
  • Android实现音频录音与播放
    目录一、PCM 、WAV、AAC 的文件头介绍二、使用 AudioRecord 实现录音生成 PCM 文件三、PCM 转化为 WAV四、PCM 转化为 AAC 文件格式五、Audio...
    99+
    2022-11-13
    Android音频录音 Android音频播放 Android录音播放
  • Vue+node实现音频录制播放功能
    实现效果: 主要实现代码逻辑部分,具体页面结构就不一一介绍了。 vue部分: 安装recorderx cnpm install recorderx --save 或者 ...
    99+
    2024-04-02
  • Android 录音与播放功能的简单实例
     Android 录音与播放功能的简单实例最近在研究Android中一些常用的功能,像地图、拍照、录音和播放的实现等等,还有一些侧滑、动画等是如何实现的。今天就把录音和播放的实现分享一下,录音和播放比较简单,利用android内部...
    99+
    2023-05-31
    android 录音 播放
  • 微信小程序如何实现录音与音频播放功能
    这篇文章将为大家详细讲解有关微信小程序如何实现录音与音频播放功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。小程序继承了微信强大的语音处理功能,提供了录音、音频播放控制和背景音乐等功能,它们的功能不同,...
    99+
    2023-06-29
  • Android基于service实现音乐的后台播放功能示例
    本文实例讲述了Android基于service实现音乐的后台播放功能。分享给大家供大家参考,具体如下: Service是一个生命周期长且没有用户界面的程序,当程序在各个acti...
    99+
    2022-06-06
    service 示例 音乐 Android
  • Android使用Flutter实现录音插件
    目录安卓部分手动注册Android和Dart的通讯安卓录音Dart module部分iOS部分手动注册插件iOS插件Dart调用部分原生提供功能,Dart module 通过 met...
    99+
    2022-11-13
    Android Flutter录音 Android 录音功能
  • 基于Qt实现视频播放器功能
    目录一、功能介绍二、代码三、运行一、功能介绍 能实现视频播放 二、代码 mainwindow.h #ifndef MAINWINDOW_H #define MAINWIND...
    99+
    2024-04-02
  • C#基于winform实现音乐播放器
    本文实例为大家分享了C#基于winform实现音乐播放器的具体代码,供大家参考,具体内容如下 首先,右键工具箱的组件,找到选择项,找到Windows Media Player组件并添...
    99+
    2024-04-02
  • HTML5中怎么实现声音录制/播放功能
    这篇文章主要介绍HTML5中怎么实现声音录制/播放功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!html代码:<!DOCTYPE html><html>  &...
    99+
    2023-06-09
  • 基于Python怎么实现音乐播放器
    本篇内容主要讲解“基于Python怎么实现音乐播放器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python怎么实现音乐播放器”吧!一、环境设置第一步引入必须的各类包import ...
    99+
    2023-06-30
  • recorder.js如何实现基于Html5录音功能
    这篇文章将为大家详细讲解有关recorder.js如何实现基于Html5录音功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。recorder.jsmicrophone基于HTML5的录音功能,输出格式为...
    99+
    2023-06-09
  • 在Android应用中实现一个录音播放功能
    这期内容当中小编将会给大家带来有关在Android应用中实现一个录音播放功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。播放音频文件public class PlayManager { private ...
    99+
    2023-05-31
    android roi
  • Android语音播放功能怎么实现
    Android平台上可以使用MediaPlayer或者SoundPool来实现语音播放功能。 使用MediaPlayer实现语音播...
    99+
    2023-10-22
    Android
  • C++ Qt实现音视频播放功能
    由于最近着手的Qt项目需要视频播放 自己做的时候踩了很多坑 避免以后踩坑 故在此记录实现过程  Qt版本 5.9 基于C++11 Qt核心组件与附加组件安装时请打钩 否则可能出现项目...
    99+
    2024-04-02
  • android语音即时通讯之录音、播放功能实现代码
    在android中,实现录音与语音播放的功能算是比较简单的,但是作为参考,还是很有必要将语音相关的知识做一个简要的记录。首先,在android中,支持录音支持两种方式。主要包括:字节流模式和文件流模式。用文件流模式进行录音操作比较简单,而且...
    99+
    2023-05-30
    android 语音 通讯
  • Android一个类实现录音与播放实例
    目录前言实现效果代码实现XML静态权限动态权限总结前言 最近混合开发的项目 在做语音识别时 h5拿不到麦克风的权限几经周折 开发任务又落到了原生开发这里 先写一个demo实现录音和播...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作