当前位置: 首页 > article >正文

Flutter控制麦克风的方法

Flutter本身不直接提供麦克风控制的原生API需借助第三方插件实现核心围绕「权限申请」「麦克风开启/关闭」「音频采样/录音」「资源释放」四大场景。以下是最常用、兼容性最强的实现方案覆盖多平台适配附完整代码示例。一、核心插件选型3种常用方案根据需求选择对应插件优先推荐功能全面、跨平台支持完善的方案具体对比如下•record插件最常用支持录音到文件/流、暂停/恢复/取消适配Android、iOS、Web、Windows等全平台底层依赖各平台原生音频API如Android的AudioRecord、iOS的AVFoundation适合大部分录音、麦克风控制场景。•mic_stream插件侧重获取麦克风的PCM原始音频流支持8/16位PCM格式可实时处理音频数据适合需要对麦克风输入进行实时分析如音量监测的场景。•audio_io插件低延迟音频流处理支持麦克风输入/扬声器输出提供统一的跨平台音频数据格式适合需要实时音频处理、可视化的场景如音频波形展示。二、通用前置操作麦克风权限配置无论使用哪种插件都需先配置各平台的麦克风权限否则会导致功能失效步骤如下1.添加权限插件依赖使用permission_handler插件统一管理权限在pubspec.yaml中添加依赖yamldependencies:flutter:sdk: flutterpermission_handler: ^11.0.0 # 权限管理record: ^4.4.4 # 核心麦克风控制插件以record为例2.各平台权限配置•Android打开android/app/src/main/AndroidManifest.xml添加录音权限•iOS打开ios/Runner/Info.plist添加麦克风使用说明iOS强制要求NSMicrophoneUsageDescription需要访问麦克风以进行录音/音频采集•macOS打开macos/Runner/Info.plist添加上述相同的麦克风使用说明并在Signing Capabilities中勾选「Audio Input」权限。•Web依赖浏览器原生麦克风权限无需额外配置插件会自动触发浏览器权限请求需Flutter 3.22及以上版本依赖web 0.5.1。3.权限请求代码实现在使用麦克风前必须先请求权限处理「授予」「拒绝」「永久拒绝」三种场景dartimportpackage:permission_handler/permission_handler.dart;// 检查并请求麦克风权限FutureboolrequestMicrophonePermission()async{finalstatusawaitPermission.microphone.request();switch(status){casePermissionStatus.granted:returntrue;// 权限授予可使用麦克风casePermissionStatus.denied:// 权限临时拒绝可再次请求returnawaitrequestMicrophonePermission();casePermissionStatus.permanentlyDenied:// 权限永久拒绝引导用户到设置页面开启awaitopenAppSettings();returnfalse;default:returnfalse;}}三、核心功能实现以record插件为例以最常用的record插件为例实现麦克风的开启、录音、暂停、停止、资源释放等核心控制覆盖大部分业务场景。1.初始化录音器创建录音器实例用于后续所有麦克风控制操作dartimportpackage:record/record.dart;finalAudioRecorder_audioRecorderAudioRecorder();// 初始化录音器2.开启麦克风开始录音开启麦克风并指定录音参数编码格式、采样率、比特率等支持录音到文件或音频流dartimportpackage:path_provider/path_provider.dart;importdart:io;// 开始录音保存到文件FuturevoidstartRecording()async{// 先检查权限finalhasPermissionawaitrequestMicrophonePermission();if(!hasPermission)return;try{// 获取应用文档目录用于保存录音文件finaldirectoryawaitgetApplicationDocumentsDirectory();finalrecordPath${directory.path}/recording.m4a;// 录音文件路径// 配置录音参数可自定义finalconfigRecordConfig(encoder:AudioEncoder.aacLc,// 编码格式AACbitRate:128000,// 比特率samplingRate:44100,// 采样率与麦克风采样技术对应可调整);// 开始录音if(await_audioRecorder.isPaused()){await_audioRecorder.resume();// 若已暂停恢复录音}else{await_audioRecorder.start(config,path:recordPath);// 全新开始录音}}catch(e){print(开启麦克风/录音失败$e);}}3.暂停/恢复录音控制麦克风启停暂停录音时麦克风仍处于占用状态恢复录音时继续在原有文件后追加录音dart// 暂停录音FuturevoidpauseRecording()async{if(await_audioRecorder.isRecording()){await_audioRecorder.pause();}}// 恢复录音FuturevoidresumeRecording()async{if(await_audioRecorder.isPaused()){await_audioRecorder.resume();}}4.停止录音关闭麦克风停止录音后麦克风会被释放返回录音文件路径可用于后续播放、上传等操作dart// 停止录音返回录音文件路径FutureString?stopRecording()async{if(await_audioRecorder.isRecording()||await_audioRecorder.isPaused()){finalrecordPathawait_audioRecorder.stop();returnrecordPath;// 返回录音文件路径}returnnull;}5.取消录音释放麦克风取消录音会释放麦克风资源并删除已录制的临时文件dartFuturevoidcancelRecording()async{await_audioRecorder.cancel();}6.释放资源页面销毁或不再使用麦克风时必须释放录音器资源避免内存泄漏dartoverridevoiddispose(){_audioRecorder.dispose();// 释放录音器资源关闭麦克风super.dispose();}四、进阶功能可选1.实时监测麦克风状态监听麦克风是否正在录音、暂停用于更新UI如显示录音状态dart// 检查麦克风是否正在录音bool isRecordingawait_audioRecorder.isRecording();// 检查麦克风是否处于暂停状态bool isPausedawait_audioRecorder.isPaused();2.实时获取麦克风音频流 若需实时处理麦克风输入如实时音频分析可开启音频流模式 dart dart// 开启音频流获取原始PCM数据finalstreamawait_audioRecorder.startStream(constRecordConfig(encoder:AudioEncoder.pcm16bits),);// 监听音频流数据stream.listen((data) {// data为原始音频数据可用于实时分析如音量计算、音频识别print(‘实时音频数据${data.length} bytes’);});3.多麦克风切换部分设备支持 通过插件获取设备上的所有麦克风实现切换如手机内置麦克风、外接麦克风 dart dart // 获取所有可用麦克风 final ListMicrophoneDevice microphones await _audioRecorder.listMicrophones(); // 切换到指定麦克风需在录音前设置 if (microphones.isNotEmpty) { await _audioRecorder.setMicrophone(microphones[0].id); // 切换到第一个麦克风 }五、常见问题与解决方案•问题1权限申请后仍无法使用麦克风解决方案检查各平台权限配置是否正确如iOS的Info.plist、Android的Manifest并确保权限请求成功后再执行麦克风操作iOS模拟器无法测试麦克风需使用真实设备。•问题2录音文件无法播放解决方案确认录音编码格式如AAC与播放器兼容record插件录制的AAC文件带ADTS头可直接播放若使用PCM格式需手动处理音频解码。•问题3Web端麦克风无法启用解决方案确保Flutter版本≥3.22且浏览器支持Web Audio API测试时需使用HTTPS协议部分浏览器仅在HTTPS下允许麦克风访问。•问题4内存泄漏解决方案在页面销毁时必须调用_audioRecorder.dispose()释放资源避免录音器长期占用麦克风和内存。六、完整示例代码页面级实现dartimportpackage:flutter/material.dart;importpackage:record/record.dart;importpackage:permission_handler/permission_handler.dart;importpackage:path_provider/path_provider.dart;importdart:io;classMicrophoneControlPageextendsStatefulWidget{constMicrophoneControlPage({super.key});overrideStateMicrophoneControlPagecreateState()_MicrophoneControlPageState();}class_MicrophoneControlPageStateextendsStateMicrophoneControlPage{finalAudioRecorder_audioRecorderAudioRecorder();bool _isRecordingfalse;bool _isPausedfalse;String?_recordPath;// 请求麦克风权限FutureboolrequestMicrophonePermission()async{finalstatusawaitPermission.microphone.request();switch(status){casePermissionStatus.granted:returntrue;casePermissionStatus.denied:returnawaitrequestMicrophonePermission();casePermissionStatus.permanentlyDenied:awaitopenAppSettings();returnfalse;default:returnfalse;}}// 开始录音Futurevoid_startRecording()async{finalhasPermissionawaitrequestMicrophonePermission();if(!hasPermission)return;try{finaldirectoryawaitgetApplicationDocumentsDirectory();_recordPath${directory.path}/recording.m4a;finalconfigRecordConfig(encoder:AudioEncoder.aacLc,bitRate:128000,samplingRate:44100,);if(_isPaused){await_audioRecorder.resume();}else{await_audioRecorder.start(config,path:_recordPath);}setState((){_isRecordingtrue;_isPausedfalse;});}catch(e){print(录音失败$e);}}// 暂停录音Futurevoid_pauseRecording()async{await_audioRecorder.pause();setState((){_isPausedtrue;});}// 停止录音Futurevoid_stopRecording()async{finalpathawait_audioRecorder.stop();setState((){_isRecordingfalse;_isPausedfalse;_recordPathpath;});}overridevoiddispose(){_audioRecorder.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(Flutter麦克风控制)),body:Center(child:Column(mainAxisAlignment:MainAxisAlignment.center,children:[Text(_isRecording?(_isPaused?录音已暂停:正在录音...):未录音),constSizedBox(height:30),Row(mainAxisAlignment:MainAxisAlignment.center,children:[ElevatedButton(onPressed:_isRecording?null:_startRecording,child:constText(开始录音),),constSizedBox(width:20),ElevatedButton(onPressed:_isPaused?null:(_isRecording?_pauseRecording:null),child:constText(暂停),),constSizedBox(width:20),ElevatedButton(onPressed:_isRecording?_stopRecording:null,child:constText(停止),),],),if(_recordPath!null)Padding(padding:constEdgeInsets.only(top:20),child:Text(录音文件路径$_recordPath),),],),),);}}

相关文章:

Flutter控制麦克风的方法

Flutter本身不直接提供麦克风控制的原生API,需借助第三方插件实现,核心围绕「权限申请」「麦克风开启/关闭」「音频采样/录音」「资源释放」四大场景。以下是最常用、兼容性最强的实现方案,覆盖多平台适配,附完整代码示例。 一、核…...

Unity Tilemap瓦片动态缩放:保持网格尺寸不变的核心技巧

1. 为什么需要动态缩放Tilemap瓦片? 在开发2D游戏时,Tilemap是最常用的地图构建工具之一。比如制作一个棋盘游戏,每个格子大小固定为64x64像素,但随着关卡难度提升,我们希望棋子能动态缩小显示,而格子本身尺…...

Windows右键菜单管理终极指南:3分钟打造高效桌面操作环境

Windows右键菜单管理终极指南:3分钟打造高效桌面操作环境 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾因Windows右键菜单过于臃肿而烦恼&…...

Harmonyos应用实例226:复数的三角形式与运算

8. 复数的三角形式与运算 功能简介:将复数表示为三角形式,计算模和幅角,支持复数的乘法、除法运算的几何意义。通过复平面可视化展示复数的三角形式和运算过程,帮助学生理解复数的三角表示和运算规则。 ArkTS代码: @Entry @Component struct ComplexTrigonometric {@St…...

绵羊行为检测数据集2276张VOC+YOLO格式

绵羊行为检测数据集2276张VOCYOLO格式数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2276 标注数量(xml文件个数):2276 标注数量…...

如何快速解锁网易云NCM加密音乐:ncmdump完整实战指南

如何快速解锁网易云NCM加密音乐:ncmdump完整实战指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经下载了网易云音乐却发现那些.ncm格式的音乐文件只能在特定软件中播放?ncmdump就是你的数字音乐…...

WarcraftHelper终极指南:解锁魔兽争霸3现代硬件潜力的完整方案

WarcraftHelper终极指南:解锁魔兽争霸3现代硬件潜力的完整方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典的即时战…...

G-Helper终极指南:5分钟解决ROG游戏本色彩配置文件丢失问题

G-Helper终极指南:5分钟解决ROG游戏本色彩配置文件丢失问题 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项…...

从废弃电视盒到全能家庭服务器:Amlogic S9xxx Armbian的5种创意改造玩法

从废弃电视盒到全能家庭服务器:Amlogic S9xxx Armbian的5种创意改造玩法 【免费下载链接】amlogic-s9xxx-armbian amlogic-s9xxx-armbian: 该项目提供了为Amlogic、Rockchip和Allwinner盒子构建的Armbian系统镜像,支持多种设备,允许用户将安卓…...

5个步骤掌握B站推流码获取与OBS直播系统搭建:从入门到专业的完整指南

5个步骤掌握B站推流码获取与OBS直播系统搭建:从入门到专业的完整指南 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直…...

基于SEER‘S EYE的Java面试题智能解析与模拟面试实战

基于SEERS EYE的Java面试题智能解析与模拟面试实战 最近和几个正在找工作的朋友聊天,发现大家准备Java面试的过程都挺痛苦的。要么是面对网上浩如烟海的“八股文”不知道从哪开始,要么就是自己闷头刷题,缺少真实的对话反馈,心里没…...

ChatTTS社区生态:GitHub项目活跃度与更新频率观察

ChatTTS社区生态:GitHub项目活跃度与更新频率观察 1. 项目概述与核心价值 ChatTTS作为目前开源语音合成领域的明星项目,以其卓越的拟真度和自然度赢得了广泛关注。这个专门针对中文对话优化的语音合成模型,能够自动生成极其自然的停顿、换气…...

告别繁琐操作:一键下载电子课本的智能解决方案

告别繁琐操作:一键下载电子课本的智能解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为获取教学资源而四处奔波吗?还在面对复…...

OpenClaw隐私保护:QwQ-32B本地化部署数据边界控制

OpenClaw隐私保护:QwQ-32B本地化部署数据边界控制 1. 为什么需要关注OpenClaw的数据边界 去年我在帮一个法律团队搭建自动化文档处理系统时,第一次深刻意识到数据边界的重要性。他们处理的案件材料包含大量敏感信息,任何数据泄露都可能造成…...

SPAD全彩图像传感器:单光子探测技术如何重塑视觉感知

传统观念中,单光子雪崩二极管(SPAD)主要用于激光雷达(LiDAR)等深度感知场景,而彩色成像则被认为是CMOS图像传感器(CIS)的专属领域。然而,近年来从学术研究到产业落地的一系列突破表明,SPAD不仅能做全彩成像,更在极弱光、高动态范围(HDR)和高速场景中展现出超越传统…...

Dify工作流自动化架构解析:从零构建企业级AI应用开发平台

Dify工作流自动化架构解析:从零构建企业级AI应用开发平台 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Di…...

在线客服系统源码 | 支持PC管理端+H5访客端+实时聊天

这是一个在线客服系统项目,包含三个主要部分:后端API服务器、PC端管理系统和H5端客服系统。以下是各部分的详细介绍: 1. 后端API服务器 主要功能:用户认证:管理员登录验证快捷回复管理:创建、读取、更新、删…...

2024网安保研上岸图鉴:从211边缘到清北直博的破局之路

1. 边缘人的逆袭起点:认清定位比盲目努力更重要 作为西北某211计算机大类边缘专业的学生,我的起点可以说毫无优势。专业名称听着像计算机,实际课程设置却偏向传统工科;学院往届最优秀的学长也只止步华五;我的编程能力在…...

重磅|微软打响第一枪:爆改HR体系,让组织像AI一样思考

微软打响第一枪:爆改HR体系,让组织像AI一样思考3月25日晚,一封来自微软首席人力资源官(CPO)Amy Coleman 的内部备忘录,把微软庞大的HR架构推倒重来。 这不仅宣告了几位见证微软文化转型期的资深高管&#x…...

开源阅读鸿蒙版:打造完全自定义的鸿蒙电子书阅读器终极指南

开源阅读鸿蒙版:打造完全自定义的鸿蒙电子书阅读器终极指南 【免费下载链接】legado-Harmony 开源阅读鸿蒙版仓库 项目地址: https://gitcode.com/gh_mirrors/le/legado-Harmony 开源阅读鸿蒙版是一款专为HarmonyOS系统设计的免费开源电子书阅读器应用&#…...

零基础玩转TensorFlow-v2.15:Jupyter与SSH两种方式快速上手

零基础玩转TensorFlow-v2.15:Jupyter与SSH两种方式快速上手 深度学习正在改变我们解决问题的方式,而TensorFlow作为最受欢迎的深度学习框架之一,让开发者能够轻松构建和训练复杂的机器学习模型。但对于初学者来说,环境配置往往成…...

Source Han Serif CN完全攻略:企业级中文字体的零成本解决方案

Source Han Serif CN完全攻略:企业级中文字体的零成本解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字设计与开发领域,中文字体的选择一直是平衡…...

从Python入门到调用伏羲API:零基础开发者气象AI初体验

从Python入门到调用伏羲API:零基础开发者气象AI初体验 你是不是也对那些能预测天气、分析气候的AI模型感到好奇,但一看到“API调用”、“HTTP请求”这些词就觉得头大,心想“这得会编程才行吧”?别担心,这篇教程就是为…...

中国科协发布声明:停止受理学者参加NeurIPS 2026会议资助申请

点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号:CVer2233,小助手拉你进群!扫描下方二维码,加入CVer学术星球!可以获得最新顶会/顶…...

显卡健康体检师:用memtest_vulkan给你的GPU做全面显存检测

显卡健康体检师:用memtest_vulkan给你的GPU做全面显存检测 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 你是否曾经遇到过游戏突然崩溃、画面出现…...

5个鲜为人知的开源工具性能优化技巧:让WaveTools效率提升100%

5个鲜为人知的开源工具性能优化技巧:让WaveTools效率提升100% 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否遇到过开源工具运行卡顿、启动缓慢的问题?是否在处理大型项目时…...

Open Multiple URLs:如何用1个浏览器扩展实现10倍工作效率提升?

Open Multiple URLs:如何用1个浏览器扩展实现10倍工作效率提升? 【免费下载链接】Open-Multiple-URLs Browser extension for opening lists of URLs built on top of WebExtension with cross-browser support 项目地址: https://gitcode.com/gh_mirr…...

3分钟掌握Mermaid:用代码思维绘制专业图表的核心技巧

3分钟掌握Mermaid:用代码思维绘制专业图表的核心技巧 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程…...

OFA视觉问答模型实战教程:与OCR模块串联实现图文联合问答流程

OFA视觉问答模型实战教程:与OCR模块串联实现图文联合问答流程 1. 教程概述 今天我们来探索一个非常实用的技术方案:如何将OFA视觉问答模型与OCR模块串联,实现真正的图文联合问答流程。这个方案能让你的AI应用不仅看懂图片内容,还…...

杰理之数字MIC使用补充【篇】

SFR(JL_ASS->CLK_CON, 0, 2, 3);...