2013-06-19 1 views
2

Я создаю простое приложение для записи с использованием 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); 
} 
+0

Вы можете разместить код для 'savefile.php' - я думаю, что вы сохраняете файл с таким же именем – user20232359723568423357842364

+0

@ user20232359723568423357842364 Я обновив имя каждый раз, когда я вызываю функцию, поэтому я не думаю, что проблема заключается в том, чтобы именовать файл одинаково. Плюс я получаю больше одного файла в папке, в которую я загружаюсь, есть несколько файлов. – TemiGiwa

ответ

3

Я также работаю над этим. Эта вилка recorder.js уже сделала это: создание blob для загрузки по ссылке. https://github.com/mattdiamond/Recorderjs

Эта другая вилка загружается на сервер через вызов api, это может быть изменено для ваших нужд. Другие достоинства этой вилки - версия swf-рекордера, которая позволяет легко записывать все браузеры. https://github.com/jwagener/recorder.js

Таким образом, они должны быть объединены ^^

 Смежные вопросы

  • Нет связанных вопросов^_^