记录用户的音频并保存到服务器

use*_*392 7 javascript php audio html5 recorder.js

我正在尝试从网站用户录制音频并将音频保存到我的服务器.到目前为止,我研究过的很多帖子都引用了Matt Diamond的录音机.我尝试通过浏览器打开源代码,在http://webaudiodemos.appspot.com/AudioRecorder/index.html上重新创建演示.我复制了html,"audiodisplay.js","recorder.js"和"main.js"并将它们放在我的服务器上.我还在他的GitHub网站上添加了"recorderWorker.js"文件.在recorder.js文件中,我将var WORKER_PATH ='js/recorderjs/recorderWorker.js'更改为var WORKER_PATH ='recorderWorker.js';

当我运行我设置的演示时,我得到"你想分享你的麦克风......"警告,我可以通过按右侧的麦克风图标开始录音.但是,当我停止录制时,音频波形不会像Matt的演示中那样显示在下面,并且保存图标不会被激活.

如果我可以启动并运行该演示,我的下一个问题是将wav文件保存到服务器而不是像演示中那样在本地.我发现有几篇帖子说要使用XMLHttpRequest(),但是我无法弄清楚如何将这些例子连接到recorderjs.将Chrome中记录的WAV文件保存到服务器 HTML5和getUserMedia - 在某些时间 记录器之后记录音频并保存到Web服务器JS通过AJAX上传记录的blob

use*_*392 6

我找到了一个解决方案,但仍然欢迎其他与recorderjs有关的解决方案.我在https://github.com/icatcher-at/MP3RecorderJS上使用了MP3RecorderJS .如果您将html的顶部从src ="js/jquery.min.js"和src ="js/mp3recorder.js"更改为位于服务器中的任何位置,则演示html会起作用.对我来说,它是src ="jquery.min.js"和src ="mp3recorder.js"我还必须对"mp3recorder.js"文件做同样的事情:var RECORDER_WORKER_PATH ='js/recorderWorker.js'; var ENCODER_WORKER_PATH ='js/mp3Worker.js'; 改为var RECORDER_WORKER_PATH ='recorderWorker.js'; var ENCODER_WORKER_PATH ='mp3Worker.js';

该程序设置为记录mp3和WAV.我想要wav,所以我对html文件做了一些调整.在第55行,你会发现:

recorderObject.exportMP3(function(base64_mp3_data) {
      var url = 'data:audio/mp3;base64,' + base64_mp3_data;
      var au  = document.createElement('audio'); 
Run Code Online (Sandbox Code Playgroud)

我把它改为:

recorderObject.exportWAV(function(base64_wav_data) {
      var url = 'data:audio/wav;base64,' + base64_wav_data;
      var au  = document.createElement('audio');   
Run Code Online (Sandbox Code Playgroud)

每次录制时,演示都会附加一个新播放器.为了防止这种情况,我删除了(注释掉)$ recorder.append(au); 部分,创建一个新的div来存储音频播放器,然后我在创建音频播放器之前每次都清除div.要上传到我的服务器,我使用了从上传图像到服务器的技术,将画布图像保存到服务器 基本上,第56行中的"url"变量是我需要的,但无法弄清楚如何将它放入通用变量由另一个函数使用.所以,我制作了一个隐藏的div,并使其内容等于"url".然后我在一个名为"upload"的新函数中引用了div.然后我使用了一个名为"uploadWav.php"的php文件.我仍然需要找到一种方法来激活和停用上传按钮,以防止用户在录制之前上传空白文件,但这是另一个问题.这是最终的html和php对我有用:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>MP3 Recorder test</title>
  </head>
  <body id="index" onload="">

    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript" src="mp3recorder.js"></script>
    <script type="text/javascript">
    var audio_context;

    function __log(e, data) {
      log.innerHTML += "\n" + e + " " + (data || '');
    }

    $(function() {

      try {
    // webkit shim
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    navigator.getUserMedia = ( navigator.getUserMedia ||
                     navigator.webkitGetUserMedia ||
                     navigator.mozGetUserMedia ||
                     navigator.msGetUserMedia);
    window.URL = window.URL || window.webkitURL;

    var audio_context = new AudioContext;
    __log('Audio context set up.');
    __log('navigator.getUserMedia ' + (navigator.getUserMedia ? 'available.' : 'not  present!'));
  } catch (e) {
    alert('No web audio support in this browser!');
  }

  $('.recorder .start').on('click', function() {
    $this = $(this);
    $recorder = $this.parent();

    navigator.getUserMedia({audio: true}, function(stream) {
      var recorderObject = new MP3Recorder(audio_context, stream, { statusContainer:  $recorder.find('.status'), statusMethod: 'replace' });
      $recorder.data('recorderObject', recorderObject);

      recorderObject.start();
    }, function(e) { });
  });

  $('.recorder .stop').on('click', function() {
    $this = $(this);
    $recorder = $this.parent();

    recorderObject = $recorder.data('recorderObject');
    recorderObject.stop();

    recorderObject.exportWAV(function(base64_wav_data) {
      var url = 'data:audio/wav;base64,' + base64_wav_data;
      var au  = document.createElement('audio');

      document.getElementById("playerContainer").innerHTML = "";
      //console.log(url)

      var duc = document.getElementById("dataUrlcontainer");
      duc.innerHTML = url;

      au.controls = true;
      au.src = url;
      //$recorder.append(au);
      $('#playerContainer').append(au);

      recorderObject.logStatus('');
    });

  });

  });
  </script>


 <script>
    function upload(){

    var dataURL = document.getElementById("dataUrlcontainer").innerHTML;

      $.ajax({
      type: "POST",
      url: "uploadWav.php",
      data: { 
          wavBase64: dataURL
       }
    }).done(function(o) {
      console.log('saved'); 

      });

    }    
  </script>


 <div class="recorder">
  Recorder 1
  <input type="button" class="start"  value="Record" />
  <input type="button" class="stop" value="Stop" />
  <pre class="status"></pre>
 </div>

 <div><button onclick="upload()">Upload</button></div>

 <div id="playerContainer"></div>

 <div id="dataUrlcontainer" hidden></div>

 <pre id="log"></pre>

 </body>
 </html>
Run Code Online (Sandbox Code Playgroud)

和"uploadWav.php"文件:

<?php
// requires php5
define('UPLOAD_DIR', 'uploads/');
$img = $_POST['wavBase64'];
$img = str_replace('data:audio/wav;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = UPLOAD_DIR . uniqid() . '.wav';
$success = file_put_contents($file, $data);
print $success ? $file : 'Unable to save the file.';
?> 
Run Code Online (Sandbox Code Playgroud)

  • 死github链接. (3认同)

Oct*_*icu 6

使用XMLHttpRequest后WAV或MP3斑点服务器很简单.

只需在有权访问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("audio_data",blob, "filename");
xhr.open("POST","upload.php",true);
xhr.send(fd);
Run Code Online (Sandbox Code Playgroud)

我喜欢XMLHttpRequest$.ajax(),因为它不需要jQuery的.

服务器端,upload.php简单如下:

$input = $_FILES['audio_data']['tmp_name']; //temporary name that PHP gave to the uploaded file
$output = $_FILES['audio_data']['name'].".wav"; //letting the client control the filename is a rather bad idea

//move the file from temp name to local folder using $output name
move_uploaded_file($input, $output)
Run Code Online (Sandbox Code Playgroud)

来源:https://addpipe.com/blog/using-recorder-js-to-capture-wav-audio-in-your-html5-web-site/ 现场演示:https://addpipe.com/simple-recorderjs -demo /