【发布时间】:2022-01-24 08:21:29
【问题描述】:
我在 js 和 php 上写了一个简单的页面来实时录制麦克风的音频。逻辑很简单:
JS
- 从麦克风获取数据块;
- Base64 编码和 urlencode;
- 通过 POST 请求发送;
PHP
- Base64 解码数据;
- (重新)写入 .ogg 文件;
- 延迟后重复 1。
数据已成功写入文件,但当我尝试播放时,播放器说文件已损坏。
Mozilla guide 的 blob 解决方案适合我,我想要的正是 PHP 解决方案,可以保存(重写)到文件。
下面的完整代码,我做错了什么?
<?php
if(isset($_POST["data"]))
{
file_put_contents("r.ogg", base64_decode($_POST["data"]));
exit;
}
?>
<script>
var mediaRecorder = null;
let chunks = [];
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
console.log('getUserMedia supported.');
navigator.mediaDevices.getUserMedia (
{
audio: true
})
.then(function(stream) {
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(2000);
mediaRecorder.ondataavailable = function(e) {
chunks.push(e.data);
const blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
chunks = [];
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
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>
【问题讨论】:
标签: javascript php base64 web-mediarecorder