首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Chrome中录制的WAV文件保存到服务器

问将Chrome中录制的WAV文件保存到服务器
EN

Stack Overflow用户
提问于 2013-05-18 02:51:50
回答 2查看 8.3K关注 0票数 7

我在这里和其他地方看到了很多关于这个问题的部分答案,但我是一个非常新手的程序员,我希望有一个彻底的解决方案。我已经能够在Chrome Canary (v.29.x)中设置从笔记本电脑麦克风录制音频,并且可以使用recorder.js相对容易地设置录制.wav文件并将其保存在本地,例如:

http://webaudiodemos.appspot.com/AudioRecorder/index.html

但我需要能够将文件保存到我运行的Linux服务器上。它实际上是将blob记录的数据发送到服务器,并将其保存为.wav文件,这让我很感兴趣。我不具备必要的PHP和/或AJAX知识,不知道如何将blob保存到URL,也不知道如何处理Linux上的二进制文件,这使得保存.wav文件变得非常具有挑战性。我非常欢迎任何正确方向的指点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-18 03:28:54

上传WAV blob的客户端JavaScript函数:

代码语言: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);
}

PHP文件upload_wav.php

代码语言:javascript
复制
<?php
// get the temporary name that PHP gave to the uploaded file
$tmp_filename=$_FILES["that_random_filename.wav"]["tmp_name"];
// rename the temporary file (because PHP deletes the file as soon as it's done with it)
rename($tmp_filename,"/tmp/uploaded_audio.wav");
?>

之后,您可以播放文件/tmp/uploaded_audio.wav。

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

代码语言:javascript
复制
chmod("/tmp/uploaded_audio.wav",0755);

到PHP的末尾(在PHP结束标记?>之前)。

希望这能有所帮助。

票数 16
EN

Stack Overflow用户

发布于 2017-10-10 07:07:58

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

代码语言:javascript
复制
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);
}

然后,该方法将从工作线程内部保存到服务器,而不是将其推回到主线程。( RecorderJS中基于工作者的复杂机制是因为大量编码应该在线程外完成。)

实际上,理想情况下,你现在只需要使用一个MediaRecorder,并让它进行编码,但那是一个完全不同的“蜡球”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16616010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档