Сохранение файла WAV, записанного в Chrome на сервер

Я видел много частичных ответов на это здесь и в других местах, но я очень начинающий кодер и надеюсь на тщательное решение. Я смог настроить запись звука с микрофона для ноутбука в Chrome Canary (версия 29.x) и может, используя recorder.js, относительно легко настроить запись WAV-файла и сохранить его локально, a la:

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

Но мне нужно сохранить файл на сервере Linux, который у меня работает. Это фактическая отправка записанных BLOB-данных на сервер и сохранение их в виде WAV-файла, который меня догоняет. У меня нет необходимых знаний PHP и / или AJAX о том, как сохранить blob в URL-адресе, и, как мне было понято, иметь дело с двоичными файлами в Linux, которые делают сохранение этого файла .wav сложным. Я бы очень приветствовал любые указатели в правильном направлении.

Solutions Collecting From Web of "Сохранение файла WAV, записанного в Chrome на сервер"

Функция JavaScript на стороне клиента для загрузки блога WAV:

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 :

 <?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 и (по умолчанию 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); } 

Затем этот метод будет сохраняться на сервере из рабочего потока, а не нажимать его на основной поток. (Сложный механизм на основе Worker в RecorderJS состоит в том, что большой код должен выполняться вне потока.)

На самом деле, в идеале, вы бы просто использовали MediaRecorder сегодня, и пусть он делает кодировку, но это цельный «шарик из воска».