
本文深入探讨了使用j*ascript mediarecorder进行实时音频录制并上传至php服务器时,导致生成文件损坏的常见问题。核心在于mediarecorder在初始化时未能正确指定音频mime类型和编码器。教程将详细指导如何在mediarecorder构造函数中正确配置`mimetype`选项,确保生成有效的音频数据块。同时,文章还将讨论服务器端文件处理(如连续录音的追加写入)以及数据块拼接的关键注意事项,旨在帮助开发者构建稳定可靠的实时音频录制解决方案。
在Web开发中,利用MediaRecorder API实现麦克风实时录音并将数据发送至后端服务器进行存储是一种常见的需求。然而,开发者在尝试将分块的音频数据(通常是Base64编码后)保存为可播放的音频文件时,经常会遇到文件损坏或无法播放的问题。本文将深入分析这一问题的根源,并提供一个可靠的解决方案。
当使用MediaRecorder进行录音时,其ondata*ailable事件会周期性地提供音频数据块(e.data)。开发者通常会将这些数据块收集起来,然后转换为Blob对象,再进行Base64编码并通过AJAX发送到服务器。服务器端接收到数据后进行Base64解码并写入文件。
导致文件损坏的核心原因在于MediaRecorder未能正确地在录音开始前知晓并生成指定格式的音频数据。许多开发者可能会尝试在ondata*ailable回调中,当创建Blob对象时指定其type(例如{ 'type' : 'audio/ogg; codecs=opus' })。然而,这种做法是错误的。Blob构造函数中的type参数仅仅是告知浏览器或接收方这个Blob对象的MIME类型,它并不能改变MediaRecorder已经生成的数据的实际编码格式。如果MediaRecorder在录制时没有被告知要生成audio/ogg; codecs=opus格式的数据,那么它可能生成默认的或不兼容的格式,即使你将Blob的类型声明为audio/ogg; codecs=opus,底层数据仍然是错误的,导致文件无法播放。
正确的做法是在初始化MediaRecorder实例时,通过其构造函数的第二个参数(一个选项对象)来明确指定所需的MIME类型和编码器。这样,MediaRecorder从一开始就会按照指定的格式生成音频数据块,确保数据的有效性。
首先,我们需要修改Medi
aRecorder的初始化部分,确保在录音开始前就指定好音频格式。
<script>
var mediaRecorder = null;
let chunks = [];
if (n*igator.mediaDevices && n*igator.mediaDevices.getUserMedia) {
console.log('getUserMedia supported.');
n*igator.mediaDevices.getUserMedia({ audio: true })
.then(function(stream) {
// --- 关键修正部分开始 ---
// 定义MediaRecorder的选项,明确指定MIME类型和编码器
// 推荐使用 'audio/ogg; codecs=opus' 或 'audio/webm; codecs=opus'
// 确保你的浏览器支持这些MIME类型
const mrOptions = { mimeType: 'audio/ogg; codecs=opus' };
// 将选项传递给MediaRecorder构造函数
mediaRecorder = new MediaRecorder(stream, mrOptions);
// --- 关键修正部分结束 ---
mediaRecorder.start(2000); // 每2秒触发一次ondata*ailable事件
mediaRecorder.ondata*ailable = function(e) {
chunks.push(e.data);
// 创建Blob时,最好使用MediaRecorder实例自身的mimeType属性,保持一致性
const blob = new Blob(chunks, { 'type' : mediaRecorder.mimeType });
chunks = []; // 清空chunks,准备接收下一个数据块
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
// 从Data URL中提取Base64编码的数据
var data = reader.result.split(";base64,")[1];
requestp2("a.php", "data=" + encodeURIComponent(data));
}
}
})
.catch(function(err) {
console.log('The following getUserMedia error occurred: ' + err);
});
} else {
console.log('getUserMedia not supported on your browser!');
}
function requestp2(path, data) {
var http = new XMLHttpRequest();
http.open('POST', path, true);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
http.send(data);
}
</script>在上述代码中,我们引入了mrOptions对象,并在其中指定了mimeType: 'audio/ogg; codecs=opus'。这个选项被传递给MediaRecorder构造函数,确保MediaRecorder从一开始就生成符合Ogg Opus格式的音频数据。在创建Blob时,我们现在使用mediaRecorder.mimeType来保持类型声明与实际生成数据的一致性。
PHP服务器端的处理相对简单,主要负责接收Base64编码的数据,解码并写入文件。
Get笔记
Get笔记,一款AI驱动的知识管理产品
774
查看详情
<?php
if(isset($_POST["data"]))
{
// base64_decode 会将Base64编码的字符串解码为二进制数据
// file_put_contents 会将二进制数据写入文件
// 注意:原始代码每次都覆盖文件,如果需要连续录音,应使用FILE_APPEND模式
file_put_contents("r.ogg", base64_decode($_POST["data"]));
exit;
}
?>MIME类型选择与兼容性:
连续录音的文件处理:
file_put_contents("r.ogg", base64_decode($_POST["data"]), FILE_APPEND);数据块(Chunks)的处理:
错误处理:
解决MediaRecorder实时录音文件损坏的关键在于在初始化MediaRecorder实例时,通过mimeType选项明确指定所需的音频格式和编码器。这确保了MediaRecorder从一开始就生成符合规范的音频数据块。同时,开发者还需要根据实际需求,合理选择服务器端的文件写入模式(覆盖或追加),并理解ondata*ailable事件中数据块的处理方式,以构建一个稳定、可靠的实时音频录制与存储解决方案。
以上就是修复MediaRecorder实时录音文件损坏问题:关键在于MIME类型配置的详细内容,更多请关注php中文网其它相关文章!
# javascript
# java
# php
# 播放器
# 龙泉营销网站建设收费
# 只会
# 可播放
# 发送到
# 临沂专业seo软件有哪些
# 价值万seo全套教程
# 峄城推广营销系统电话
# 运营中心关键词排名
# app推广营销渠道策略
# 安宁产品营销推广怎么样
# 抖音关键词推广排名
# 安顺seo营销工厂招聘
# 上海高端网站推荐优化
# 所需
# 是在
# 转换为
# 关键在于
# 会将
# 常见问题
# stream
# win
# ai
# 后端
# app
# 浏览器
# 编码
# ajax
# 前端
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
C++ priority_queue怎么用_C++优先队列底层实现与自定义比较器
Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解
mail.qq.com登录入口 QQ邮箱网页版直达
iCloud官方网站 iCloud网页版在线登录入口
优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南
《万兴喵影》导出视频方法
《七读免费小说》开通会员方法
PHP中获取HTTP响应状态消息:方法与限制
什么是Satis,如何用它搭建一个私有的composer仓库?
composer licenses 命令:如何检查项目依赖的许可证?
DeepSeek超全面指南:入门必看
macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整
汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口
智学网成绩单查询系统网_智学网学生平台登录
Win10关闭UAC用户账户控制的方法 Win10降低安全提示等级【技巧】
search中maxlength属性用法解析
苹果11如何更换iCloud账号_苹果11账号切换的具体步骤
Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法
Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南
在PySimpleGUI中实现键盘按键绑定按钮事件
大众点评了却看不到是怎么回事
J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践
CSS如何使用outline-offset与颜色组合突出元素边框
性能与资源监视器快捷打开
Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧
Mac怎么关闭按键声音_Mac键盘打字音效设置
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
在PHP环境中正确加载HTML资源:CSS样式与图片路径指南
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
作业帮网页版不用下载入口 在线问老师快速答疑
手机远程连接电脑方法
以下哪一个是适应长期护理制度发展而设立的新职业
《金山词霸》语音翻译方法
谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程
解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片
追剧达人如何发弹幕
word文档行距怎么调?word文档调行距的操作步骤
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
《虎扑》关闭社区内容推荐方法
抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法
b站如何管理订阅_b站订阅标签分类管理
diskgenius分区工具如何设置Bios启动项
汽水音乐车机版 汽水音乐车机版官方入口
植物大战僵尸95版游戏版下载_植物大战僵尸95版游戏版安装指南
Pydantic 中“schema”字段命名冲突的解决方案
Dagster资产间数据传递与用户配置管理教程
Go Goroutine调度与并发执行深度解析
sublime如何撤销关闭的标签页_sublime重新打开已关闭文件技巧
漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接
秋风萧瑟洪波涌起中的萧瑟指的是什么
2025-12-12
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。