Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将Chrome中记录的WAV文件保存到服务器_Php_Javascript_Ajax_Html5 Audio - Fatal编程技术网

Php 将Chrome中记录的WAV文件保存到服务器

Php 将Chrome中记录的WAV文件保存到服务器,php,javascript,ajax,html5-audio,Php,Javascript,Ajax,Html5 Audio,我已经在这里和其他地方看到了许多部分答案,但我是一个新手,希望能找到一个彻底的解决方案。我已经能够在Chrome Canary(v.29.x)中设置从笔记本电脑麦克风录制音频,并且可以使用recorder.js相对轻松地设置录制.wav文件并将其保存到本地,即la: 但是我需要能够将文件保存到我正在运行的Linux服务器上。这是将blob记录的数据实际发送到服务器并将其保存为.wav文件的过程。我没有必要的PHP和/或AJAX知识来了解如何将blob保存到URL,以及如何处理Linux上的二进

我已经在这里和其他地方看到了许多部分答案,但我是一个新手,希望能找到一个彻底的解决方案。我已经能够在Chrome Canary(v.29.x)中设置从笔记本电脑麦克风录制音频,并且可以使用recorder.js相对轻松地设置录制.wav文件并将其保存到本地,即la:


但是我需要能够将文件保存到我正在运行的Linux服务器上。这是将blob记录的数据实际发送到服务器并将其保存为.wav文件的过程。我没有必要的PHP和/或AJAX知识来了解如何将blob保存到URL,以及如何处理Linux上的二进制文件,这使得保存.wav文件确实很有挑战性。我非常欢迎任何指向正确方向的指针。

用于上载WAV blob的客户端JavaScript函数:

function upload(blob) {
  var xhr=new XMLHttpRequest();
  xhr.onload=function(e) {
      if(this.readyState === 4) {
          console.log("Server returned: ",e.target.responseText);
      }
  };
  var fd=new FormData();
  fd.append("that_random_filename.wav",blob);
  xhr.open("POST","<url>",true);
  xhr.send(fd);
}
之后,您可以播放文件
/tmp/upload\u audio.wav

但是记住
/tmp/uploaded_audio.wav
是由用户
www-data
创建的,并且(在PHP默认情况下)用户不可读。要自动添加适当的权限,请附加行

chmod("/tmp/uploaded_audio.wav",0755);
到PHP的末尾(在PHP结束标记
?>
之前)


希望这能有所帮助。

如果您只想破解代码,最简单的方法是进入recorderWorker.js,并将exportWAV()函数破解为如下内容:

function exportWAV(type){
    var bufferL = mergeBuffers(recBuffersL, recLength);
    var bufferR = mergeBuffers(recBuffersR, recLength);
    var interleaved = interleave(bufferL, bufferR);
    var dataview = encodeWAV(interleaved);
    var audioBlob = new Blob([dataview], { type: type });

    var xhr=new XMLHttpRequest();
    xhr.onload=function(e) {
        if(this.readyState === 4) {
            console.log("Server returned: ",e.target.responseText);
        }
    };
    var fd=new FormData();
    fd.append("that_random_filename.wav",audioBlob);
    xhr.open("POST","<url>",true);
    xhr.send(fd);
}
函数exportWAV(类型){
var bufferL=合并缓冲区(recBuffersL、recLength);
var bufferR=合并缓冲区(recBuffersR、recLength);
var interleave=交织(bufferL,bufferR);
var dataview=encodeWAV(交错);
var audioBlob=新Blob([dataview],{type:type});
var xhr=new XMLHttpRequest();
xhr.onload=函数(e){
if(this.readyState==4){
log(“服务器返回:”,e.target.responseText);
}
};
var fd=新FormData();
追加(“that_random_filename.wav”,audioBlob);
xhr.open(“POST”、“true”);
xhr.send(fd);
}
然后,该方法将从工作线程内部保存到服务器,而不是将其推回到主线程。(RecorderJS中复杂的基于工作者的机制是因为大型编码应该在线程外完成。)


实际上,理想的情况是,你今天只需要使用一台MediaRecorder,让它进行编码,但这完全是另一回事。

重复的,但它还没有得到回答。如果您正在使用ASP MVCAny,那么请相信这一点。如何将上述内容应用于?他们编写代码的方式让我很困惑。太长,将另存为单独的答案。我得到PHP错误未定义索引:that_random_filename.wav在blob是音频缓冲区的情况下可以工作吗?好的,这不工作,因为PHP应该是$_FILES[“that_random_filename_wav”]因为表单输入的名称中不允许有句点。我碰巧遇到了一个看起来与您类似的问题,无法使其正常工作:。有什么想法吗?
function exportWAV(type){
    var bufferL = mergeBuffers(recBuffersL, recLength);
    var bufferR = mergeBuffers(recBuffersR, recLength);
    var interleaved = interleave(bufferL, bufferR);
    var dataview = encodeWAV(interleaved);
    var audioBlob = new Blob([dataview], { type: type });

    var xhr=new XMLHttpRequest();
    xhr.onload=function(e) {
        if(this.readyState === 4) {
            console.log("Server returned: ",e.target.responseText);
        }
    };
    var fd=new FormData();
    fd.append("that_random_filename.wav",audioBlob);
    xhr.open("POST","<url>",true);
    xhr.send(fd);
}