Я создаю простое приложение для записи с использованием HTML5, и я пытаюсь разбить файлы на более мелкие биты и сохранить каждый бит на веб-сервере, чтобы имитировать трансляцию в прямом эфире? Я получил код для записи и разделения, но по какой-то причине будет записываться только первый фрагмент. Остальные имеют данные, но не будет играть (по крайней мере, не в VLC)Как правильно отрезать аудиофайл с помощью recorder.js, getUserMedia и blob.slice?
Вот код:
window.URL = window.URL || window.webkitURL;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
var audio = document.querySelector('audio');
var context = new webkitAudioContext();
var recorder;
var lastByte = 0;
var intv;
var fileCount = 1;
var onFail = function(e) {
document.getElementById("results").innerHTML = "An error Occured<br />" + e;
};
var onSuccess = function(s) {
var mediaStreamSource = context.createMediaStreamSource(s);
recorder = new Recorder(mediaStreamSource);
recorder.record();
intv = setInterval(function(){getSnippet();} , 3000);
}
function startRecording() {
if (navigator.getUserMedia) {
document.getElementById("results").innerHTML = "Starting....";
navigator.getUserMedia({audio: true}, onSuccess, onFail);
}
else {
document.getElementById("results").innerHTML = "Get User Media not Present/Active";
}
}
function stopRecording() {
recorder.stop();
clearInterval(intv);
recorder.exportWAV(function(s) { console.log(s);
saveSnippet(s, "Final");
audio.src = window.URL.createObjectURL(s);
});
}
function getSnippet(){
recorder.exportWAV(function(s) {
//Slice the unsaved part of the file
slc = s.slice(lastByte, s.size, s.type);
console.log("Start: " + lastByte + "; End: " + s.size + "; FileName: " + fileCount);
saveSnippet(slc, fileCount);
lastByte = s.size;
fileCount++;
});
//recorder.exportWAV(function(s) { saveFile(s); });
}
function saveSnippet(s, fname){
var fd = new FormData();
fd.append('fname', fname + '.wav');
fd.append('fileToUpload', s);
$.ajax({
url: 'savefile.php',
type: 'POST',
data: fd,
processData: false,
contentType: false,
success: function(data){ document.getElementById("results").innerHTML = "File Saved: <br />" + data;},
error: function(jqXHR, textStatus, errorMessage) { document.getElementById("results").innerHTML = errorMessage; }
});
}
Есть ли что-то, что я делаю не так, почему бы первый файл записи, но без последующих файлы? Я полный новичок, поэтому, пожалуйста, будьте осторожны. Если есть лучший способ сделать это, я все уши!
В соответствии с просьбой вот код для savefile.php
if(count($_FILES) > 0){
echo "Data Found<br />";
echo $_FILES['fileToUpload']['tmp_name'];
$fl = file_get_contents($_FILES['fileToUpload']['tmp_name']);
echo "<br />File Uploaded: " . file_put_contents("uploads/" . $_POST['fname'], $fl, FILE_APPEND);
}
Вы можете разместить код для 'savefile.php' - я думаю, что вы сохраняете файл с таким же именем – user20232359723568423357842364
@ user20232359723568423357842364 Я обновив имя каждый раз, когда я вызываю функцию, поэтому я не думаю, что проблема заключается в том, чтобы именовать файл одинаково. Плюс я получаю больше одного файла в папке, в которую я загружаюсь, есть несколько файлов. – TemiGiwa