{"id":18885174,"url":"https://github.com/bozaigao/flutter_plugin_record","last_synced_at":"2025-07-09T09:41:27.281Z","repository":{"id":44395617,"uuid":"512448096","full_name":"bozaigao/flutter_plugin_record","owner":"bozaigao","description":"flutter_plugin_record","archived":false,"fork":false,"pushed_at":"2022-07-10T13:55:20.000Z","size":8380,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-31T04:41:34.543Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bozaigao.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-07-10T13:54:18.000Z","updated_at":"2022-07-10T13:55:23.000Z","dependencies_parsed_at":"2022-07-15T02:33:06.199Z","dependency_job_id":null,"html_url":"https://github.com/bozaigao/flutter_plugin_record","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bozaigao%2Fflutter_plugin_record","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bozaigao%2Fflutter_plugin_record/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bozaigao%2Fflutter_plugin_record/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bozaigao%2Fflutter_plugin_record/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bozaigao","download_url":"https://codeload.github.com/bozaigao/flutter_plugin_record/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239858422,"owners_count":19708856,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T07:17:10.352Z","updated_at":"2025-02-20T14:42:50.576Z","avatar_url":"https://github.com/bozaigao.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"[TOC]\n\n\n# 使用Flutter实现 仿微信录音的插件 \n插件支持android 和IOS\n\n\n-------\n插件提供的功能\n录制\n1. 录制语音,\n2. 播放录音,\n3. 录制声音大小的监听\n4. 提供录制时长的监听\n5. 提供类似微信的录制组件\n6. 提供播放音频结束的监听\n7. 提供根据传递的路径进行语音录制\n8. 提供录制wav,mp3格式  具体可参考example\n\n播放\n1. 提供播放指定路径的音频文件\n2. 提供播放指定Url地址的wav,MP3格式文件\n3. 提供播放完成的回调监听\n4. 提供暂停和继续播放的功能\n5. 提供停止播放的功能\n\n\n\n\n## 1,引入\n在pubspec.yaml 文件上引入如下配置\n\n\n    引入方式1(引入最新的版本)\n    flutter_plugin_record:\n        git:\n          url: https://github.com/yxwandroid/flutter_plugin_record.git\n    \n    引入方式2 (引入指定某次commit)\n    flutter_plugin_record:\n        git:\n          url: https://github.com/yxwandroid/flutter_plugin_record.git\n          ref: 29c02b15835907879451ad9f8f88c357149c6085\n          \n    引入方式3 (引入Flutter仓库的library)\n          \n    dependencies:\n      flutter_plugin_record: ^1.0.1\n              \n              \n          \n          \n          \n          \n        \n\n\n### 使用\n### 1, 初始化录制\n#### 1.1, 初始化录制(wav)\n可以在页面初始化的时候进行初始化比如: 在initState方法中进行初始化\n\n    //实例化对象 \n    FlutterPluginRecord   recordPlugin = new FlutterPluginRecord();\n    //    初始化\n    recordPlugin.init()\n   \n\n#### 1.2, 初始化录制(Mp3)\n可以在页面初始化的时候进行初始化比如: 在initState方法中进行初始化\n\n    //实例化对象 \n    FlutterPluginRecord   recordPlugin = new FlutterPluginRecord();\n    //    初始化\n    recordPlugin.initRecordMp3()\n\n### 2, 开始录制\n   \n     recordPlugin.start()\n     \n### 3, 停止录制\n\n     recordPlugin.stop()\n     \n### 4, 播放\n\n#### 1,播放\n     \n     recordPlugin.play()\n     \n#### 2, 暂停和继续播放\n       \n     recordPlugin.pausePlay();\n\n#### 3, 停止播放\n    \n     recordPlugin.stopPlay();\n          \n### 5, 根据传递的路径进行语音录制\n\n     recordPlugin.startByWavPath(wavPath);\n     \n### 6, 根据传递的路径或则Url进行语音播放\n\n     \n      ///\n      /// 参数 path  播放音频的地址\n      ///\n      ///path 为 url类型对应的在线播放地址   https://linjuli-app-audio.oss-cn-hangzhou.aliyuncs.com/audio/50c39c768b534ce1ba25d837ed153824.wav\n      ///path 对应本地文件路径对应的是本地文件播放肚子   /sdcard/flutterdemo/wiw.wav\n      /// 参数  type\n      /// 当path 为url   type为 url\n      /// 当path 为本地地址 type为 file\n      ///\n      Future playByPath(String path, String type) async {\n        return await _invokeMethod('playByPath', \u003cString, String\u003e{\n          \"play\": \"play\",\n          \"path\": path,\n          \"type\": type,\n        });\n      }   \n\n### 7, 释放资源\n可以在页面退出的时候进行资源释放 比如在  dispose方法中调用如下代码\n\n     recordPlugin.dispose()\n     \n     \n     \n### 4,回调监听  \n1,初始化回调监听  \n\n  \n    ///初始化方法的监听\n    recordPlugin.responseFromInit.listen((data) {\n      if (data) {\n        print(\"初始化成功\");\n      } else {\n        print(\"初始化失败\");\n      }\n    });\n    \n\n2,开始录制停止录制监听\n\n     /// 开始录制或结束录制的监听\n        recordPlugin.response.listen((data) {\n          if (data.msg == \"onStop\") {\n            ///结束录制时会返回录制文件的地址方便上传服务器\n            print(\"onStop  \" + data.path);\n          } else if (data.msg == \"onStart\") {\n            print(\"onStart --\");\n          }\n        });\n    \n3,录制声音大小回调监听\n\n\n     ///录制过程监听录制的声音的大小 方便做语音动画显示图片的样式\n        recordPlugin.responseFromAmplitude.listen((data) {\n          var voiceData = double.parse(data.msg);\n          var tempVoice = \"\";\n          if (voiceData \u003e 0 \u0026\u0026 voiceData \u003c 0.1) {\n            tempVoice = \"images/voice_volume_2.png\";\n          } else if (voiceData \u003e 0.2 \u0026\u0026 voiceData \u003c 0.3) {\n            tempVoice = \"images/voice_volume_3.png\";\n          } else if (voiceData \u003e 0.3 \u0026\u0026 voiceData \u003c 0.4) {\n            tempVoice = \"images/voice_volume_4.png\";\n          } else if (voiceData \u003e 0.4 \u0026\u0026 voiceData \u003c 0.5) {\n            tempVoice = \"images/voice_volume_5.png\";\n          } else if (voiceData \u003e 0.5 \u0026\u0026 voiceData \u003c 0.6) {\n            tempVoice = \"images/voice_volume_6.png\";\n          } else if (voiceData \u003e 0.6 \u0026\u0026 voiceData \u003c 0.7) {\n            tempVoice = \"images/voice_volume_7.png\";\n          } else if (voiceData \u003e 0.7 \u0026\u0026 voiceData \u003c 1) {\n            tempVoice = \"images/voice_volume_7.png\";\n          }\n          setState(() {\n            voiceIco = tempVoice;\n            if(overlayEntry!=null){\n              overlayEntry.markNeedsBuild();\n            }\n          });\n    \n          print(\"振幅大小   \" + voiceData.toString() + \"  \" + voiceIco);\n        });\n    \n    \n    \n    \n    \n    \n    \n       \n   \n4,播放声音完成的监听监听\n     \n   \n      recordPlugin.responsePlayStateController.listen((data){\n      print(\"播放路径   \" + data.playPath );\n      print(\"播放状态   \" + data.playState );\n    });\n    \n    \n    \n## 2,录制组件的使用\n\n组件使用效果\n\nandroid效果\n\n\u003c!--![](.README_images/video2gif_20191118_101627.gif)--\u003e\n\u003cimg src=\"README_images/video2gif_20191118_101627.gif\" width=\"400\"  align=center /\u003e\n\nIOS效果\n\n\u003c!--![](.README_images/ios.gif)--\u003e\n\u003cimg src=\"README_images/ios.gif\" width=\"400\"  align=center /\u003e\n\n\n\n\n\n### 1,在使用的页面进行导入package\n\n    import 'package:flutter_plugin_record/index.dart';  \n        \n    \n    \n\n    \n### 2,在使用的地方引入VoiceWidget组件\n    \n    VoiceWidget(),\n    \n    \n    VoiceWidget({startRecord: Function, stopRecord: Function}) {\n    \n   \n    \nstartRecord 开始录制的回调 \n\nstopRecord 停止录制的回调 返回的path是录制成功之后文件的保存地址\n\n    \n     \n## IOS配置注意事项\n \n### ios集成的的时候需要在info.list添加 \n \n     \n     \u003ckey\u003eNSMicrophoneUsageDescription\u003c/key\u003e\n            \u003cstring\u003e打开话筒\u003c/string\u003e\n\n\n     \u003ckey\u003eNSAppTransportSecurity\u003c/key\u003e\n     \t\u003cdict\u003e\n     \t\t\u003ckey\u003eNSAllowsArbitraryLoads\u003c/key\u003e\n     \t\t\u003ctrue/\u003e\n     \t\u003c/dict\u003e\n\n\n\n### ios release 打包失败配置注意事项\n\n\u003c!--![](.README_images/ios.gif)--\u003e\n\u003cimg src=\"README_images/ios_error.png\" width=\"400\"  align=center /\u003e\n\n\n\n \n## android配置注意事项\n \n### android 集成的的时候需要在application标签下添加 \n \n     \n      tools:replace=\"android:label\"\n     \n\n\n\n\n\n\n  \n## TODO\n\n* [ ] 双声道切换 单声道切换\n\n## 感谢\n\n\n[肖中旺](https://github.com/xzw421771880)对IOS 播放在线Wav的支持 \n\n\n## 作者的其他开源项目推荐\n\n\n[基于腾讯云点播封装的flutter版的播放器插件 ](https://github.com/yxwandroid/flutter_tencentplayer_plus)\n\n[Flutter 二维码扫描插件](https://github.com/yxwandroid/flutter_plugin_qrcode)\n\n[抖音开发平台SDK Flutter插件](https://github.com/yxwandroid/flutter_plugin_douyin_open)\n\n[FLutter地图插件](https://github.com/yxwandroid/flutter_amap_location)\n\n[Flutter 模板工程](https://github.com/yxwandroid/flutter_app_redux.git)\n\n## 关注公众号获取更多内容\n\n\u003cimg src=\"README_images/f53502b3.png\" width=\"200\" hegiht=\"313\" align=center /\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbozaigao%2Fflutter_plugin_record","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbozaigao%2Fflutter_plugin_record","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbozaigao%2Fflutter_plugin_record/lists"}