Flutter Web如何用Flutter Sound将录制音频Uri转.mp3上传Firebase Storage
问题原因
- 编码与后缀不匹配:你当前录制时指定的编码为
Codec.opusWebM,生成的是WebM格式音频,直接修改文件后缀为.mp3不会改变文件实际编码,会导致播放器识别失败,看起来像是文件损坏。 - 缺少停止录音逻辑:你提供的代码中没有调用
stopRecorder()的步骤,录音文件没有完成本地写入就触发上传,会导致上传的文件不完整。 - 上传参数错误:
recorder.getRecordURL()返回的是本地URI对象,直接传给Firebase的put方法会出现解析错误,应该先转换为本地File对象再上传。
解决方案
方案1:直接录制MP3格式(优先推荐,无需额外转码)
大部分Android、iOS设备都原生支持MP3编码,直接修改录制参数即可生成MP3文件,无需后续转码:
修改录音代码
FlutterSoundRecorder recorder = FlutterSoundRecorder(); await recorder.openAudioSession(); // 直接指定MP3编码,文件后缀匹配实际格式 await recorder.startRecorder(codec: Codec.mp3, toFile: 'newRecord.mp3');
修改上传代码
// 第一步:先停止录音,确保本地文件写入完成 await recorder.stopRecorder(); // 第二步:获取本地录音文件对象 String? recordPath = await recorder.getRecordURL(path: 'newRecord.mp3'); File recordFile = File(recordPath!); // 第三步:上传文件到Firebase Storage fb.StorageReference storageRef = fb.storage().ref().child("newRecord.mp3"); // 可选:指定文件元数据,确保Content-Type正确 final metadata = fb.SettableMetadata( contentType: 'audio/mpeg', ); fb.UploadTask uploadTask = storageRef.put(recordFile, metadata); fb.UploadTaskSnapshot uploadTaskSnapshot = await uploadTask.future; var downloadUrl = await uploadTaskSnapshot.ref.getDownloadURL(); print(downloadUrl);
方案2:无需转码直接上传WebM格式
Firebase Storage支持存储任意格式的音频文件,不需要强制转换为MP3,只要文件后缀和实际编码匹配,后续使用支持WebM格式的播放器即可直接播放:
- 录制时保持
Codec.opusWebM参数,文件后缀改为.webm - 上传时指定
contentType: 'audio/webm'即可
方案3:现有WebM录音转MP3上传
如果必须将已有WebM录音转为MP3,可以引入ffmpeg_kit_flutter包完成格式转码,转码完成后再上传生成的MP3文件即可。
内容的提问来源于stack exchange,提问作者Sharyer Ilyas khan
相关产品推荐
相关产品推荐

