【问题标题】:Upload captured audio to server. JS Jquery PHP将捕获的音频上传到服务器。 JS jQuery PHP
【发布时间】:2021-07-12 16:30:01
【问题描述】:

我正在使用这个

<button onclick="startRecording(this);">record</button>
  <button onclick="stopRecording(this);" disabled>stop</button>

  <h2>Recordings</h2>
  <ul id="recordingslist"></ul>

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

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

  var audio_context;
  var recorder;

  function startUserMedia(stream) {
    var input = audio_context.createMediaStreamSource(stream);
    __log('Media stream created.' );
    __log("input sample rate " +input.context.sampleRate);

    // Feedback!
    //input.connect(audio_context.destination);
    __log('Input connected to audio context destination.');

    recorder = new Recorder(input, {
                  numChannels: 1
                });
    __log('Recorder initialised.');
  }

  function startRecording(button) {
    recorder && recorder.record();
    button.disabled = true;
    button.nextElementSibling.disabled = false;
    __log('Recording...');
  }

  function stopRecording(button) {
    recorder && recorder.stop();
    button.disabled = true;
    button.previousElementSibling.disabled = false;
    __log('Stopped recording.');

    // create WAV download link using audio data blob
    createDownloadLink();

    recorder.clear();
  }

  function createDownloadLink() {
    recorder && recorder.exportWAV(function(blob) {
      /*var url = URL.createObjectURL(blob);
      var li = document.createElement('li');
      var au = document.createElement('audio');
      var hf = document.createElement('a');

      au.controls = true;
      au.src = url;
      hf.href = url;
      hf.download = new Date().toISOString() + '.wav';
      hf.innerHTML = hf.download;
      li.appendChild(au);
      li.appendChild(hf);
      recordingslist.appendChild(li);*/
    });
  }

  window.onload = function init() {
    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;

      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!');
    }

    navigator.getUserMedia({audio: true}, startUserMedia, function(e) {
      __log('No live audio input: ' + e);
    });
  };
  </script>

   <script src="js/jquery-1.11.0.min.js"></script>
  <script src="recordmp3.js"></script>

要捕获音频并提供 mp3 下载,但我真正需要做的是将录音上传到服务器,作为奖励,如果我可以在上传之前重命名文件,这将使其完美!无法展示我尝试过的示例,因为我不知道从哪里开始,非常感谢任何帮助。

流程是捕获一些短录音,重命名它们,然后点击上传按钮,将它们作为 mp3 上传,然后重定向到成功页面。

完整代码在这里https://github.com/Audior/Recordmp3js

【问题讨论】:

  • 上传数据需要AJAX
  • 我可以知道,在哪个操作之后或期间,您要上传音频吗?
  • 它会,因为数据在 JavaScript 的内存中。常规回发将无法看到它。您的上传按钮需要触发 AJAX 请求
  • 如果您可以采用不同的(更现代的)方法,我 forked MDN recorder demo 并将提交添加到 php 服务器。如果这对你有用,我可以把它作为答案。
  • 我找到了the issue。似乎 FF 需要经常创建 Blob。似乎使用一个大 Blob 会丢失一些数据。你可以阅读更多关于它here

标签: javascript jquery


【解决方案1】:

您应该将数据作为 XMLHttpRequest 上传,但是在服务器端您应该将其保存到具有自定义名称的文件中。这也更安全,因为您可以通过不指定路径很容易地避免文件遍历攻击(据我了解,其他人无法将文件上传到您的计算机/服务器,但是我仍然认为您应该使用这种方法,因为这是对使用基本安全措施保护应用程序的一个很好的介绍)。

您可以使用取自here 的以下(修改后的)答案来完成这项工作。这就是 JS 函数 createDownloadLink 应该如何处理修改:

function createDownloadLink() {
  recorder && recorder.exportWAV(function(blob) {
    // Generate the 'File'
    var data = new FormData();
    data.append('file', blob);

    // Make the HTTP request
    var oReq = new XMLHttpRequest();

    // POST the data to upload.php
    oReq.open("POST", 'upload.php', true);
    oReq.onload = function(oEvent) {
      // Data has been uploaded
    };
    oReq.send(data);
  });
}

但是,在 PHP 方面,您还应该进行一些修改,因为现在这是一个经典的文件上传,而不是一个将数据作为参数发送的 POST 请求。像这样修改upload.php(移动上传文件的信息取自here):

<?php
// Make sure recordings folder exists
if(!is_dir("recordings")){
    $res = mkdir("recordings",0777); 
}

// Declare file name
$filename = 'recordings/' . 'audio_recording_' . date( 'Y-m-d-H-i-s' ) .'.mp3';

// Move the uploaded file to the directory
move_uploaded_file($_FILES['file']['tmp_name'], $filename));
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-15
    • 2015-12-30
    • 2018-06-07
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多