2013-05-10 1 views
2

В моем приложении я хочу, чтобы пользователь записывал свое видео. Затем видео необходимо загрузить на диск сервера. Но он загружается в клиентский браузер. Как я могу сохранить 2 или 3 мин видео на сервер. Для этого я использовал getusermedia. Я написал код как:Как захватить видео на сервер с помощью getusermedia

(function(exports) { 
exports.URL = exports.URL || exports.webkitURL; 
exports.requestAnimationFrame = exports.requestAnimationFrame || 
    exports.webkitRequestAnimationFrame || exports.mozRequestAnimationFrame || 
    exports.msRequestAnimationFrame || exports.oRequestAnimationFrame; 

exports.cancelAnimationFrame = exports.cancelAnimationFrame || 
    exports.webkitCancelAnimationFrame || exports.mozCancelAnimationFrame || 
    exports.msCancelAnimationFrame || exports.oCancelAnimationFrame; 

navigator.getUserMedia = navigator.getUserMedia || 
    navigator.webkitGetUserMedia || navigator.mozGetUserMedia || 
    navigator.msGetUserMedia; 

var ORIGINAL_DOC_TITLE = document.title; 
var video = $('video'); 
var canvas = document.createElement('canvas'); 
var rafId = null; 
var startTime = null; 
var endTime = null;  

function $(selector) { 
    return document.querySelector(selector) || null; 
} 

function toggleActivateRecordButton() { 
    var b = $('#record-me'); 
    b.textContent = b.disabled ? 'Record' : 'Recording...'; 
    b.classList.toggle('recording'); 
    b.disabled = !b.disabled; 
} 

function turnOnCamera(e) { 
    e.target.disabled = true; 
    $('#record-me').disabled = false; 

    video.controls = false; 

    var finishVideoSetup_ = function() { 

     setTimeout(function() { 
      video.width = 320; 
      video.height = 240;   
      canvas.width = video.width; 
      canvas.height = video.height; 
     }, 1000); 
    };  

    navigator.getUserMedia({video: true}, function(stream) { 
     video.src = window.URL.createObjectURL(stream); 
     finishVideoSetup_(); 
    }, function(e) {   
     video.src = 'Chrome_ImF.mp4'; 
     finishVideoSetup_(); 
    }); 

    if (navigator.getUserMedia) { 
     navigator.getUserMedia({ audio: true }, onRecordSucces, onFail); 
    } else { 
     console.log('navigator.getUserMedia not to present'); 
    } 


}; 

function record() { 
    var elapsedTime = $('#elasped-time'); 
    var ctx = canvas.getContext('2d'); 
    var CANVAS_HEIGHT = canvas.height; 
    var CANVAS_WIDTH = canvas.width; 
    frames = []; // clear existing frames; 
    startTime = Date.now(); 
    toggleActivateRecordButton(); 
    $('#stop-me').disabled = false; 
    function drawVideoFrame_(time) { 
     rafId = requestAnimationFrame(drawVideoFrame_); 
     ctx.drawImage(video, 0, 0, CANVAS_WIDTH, CANVAS_HEIGHT); 
     document.title = 'Recording...' + Math.round((Date.now() - startTime)/1000) + 's'; 
     var url = canvas.toDataURL('image/webp', 1); 
     frames.push(url); 
    }; 
    rafId = requestAnimationFrame(drawVideoFrame_); 
    startRecording(); 
}; 

function stop() { 
    cancelAnimationFrame(rafId); 
    endTime = Date.now(); 
    $('#stop-me').disabled = true; 
    document.title = ORIGINAL_DOC_TITLE; 
    toggleActivateRecordButton();  
    embedVideoPreview(); 
}; 


function embedVideoPreview(opt_url) { 
    var url = opt_url || null; 
    var video = $('#video-preview video') || null; 
    var downloadLink = $('#video-preview a[download]') || null; 

    if (!video) { 
     video = document.createElement('video'); 
     video.autoplay = true; 
     video.controls = true;  
     video.style.width = canvas.width + 'px'; 
     video.style.height = canvas.height + 'px'; 
     $('#video-preview').appendChild(video); 

     downloadLink = document.createElement('a'); 
     downloadLink.download = 'capture.webm'; 
     downloadLink.textContent = '[ download video ]'; 
     downloadLink.title = 'Download your .webm video'; 
     var p = document.createElement('p'); 
     p.appendChild(downloadLink); 

     $('#video-preview').appendChild(p); 

    } else { 
     window.URL.revokeObjectURL(video.src); 
    } 



    if (!url) { 
     webmBlob = Whammy.fromImageArray(frames, 1000/60); 
     url = window.URL.createObjectURL(webmBlob); 

    video.src = url; 
    downloadLink.href = url; 
} 

function initEvents() { 
    $('#camera-me').addEventListener('click', turnOnCamera); 
    $('#record-me').addEventListener('click', record); 
    $('#stop-me').addEventListener('click', stop); 
} 

initEvents(); 

exports.$ = $; 

})(window); 

Когда я нажимаю на ссылку для загрузки, она загружается в браузер пользователя. Но я хочу отправить данные на сервер и сохранить их на сервере. Я попытался передать данные webmblob на контроллер и получить. Но это не доступ. Я написал код, как

$.ajax({ 
    url: '/Home/VideoData', 
    type: 'POST', 
    dataType: 'blob', 
    cache: false, 
    data: { 
      data: webmblob 
      }, 
    contentType: "application/json; charset=utf-8", 
    error: function (xhr, status, error) { 
    }, 
    success: function() { 

    }, 
    }); 

В контроллере я определил как

public ActionResult VideoData(string data) 
    { 
     return Json("success", JsonRequestBehavior.AllowGet); 
    } 

Но данные, поступающие в контроллер, как [object blob]. Извините за мой английский. Надеюсь, ты поймешь мой вопрос. Как я могу преобразовать его в видео. Любая помощь, безусловно, ценится.

+0

Ваш заголовок 'contentType' (во втором блоке кода) должен быть' video/webm' не «application/json». –

+0

Вы нашли решение для этого? –

ответ

1

MediaStreamRecorder - это API WebRTC для записи потоков getUserMedia(). Это позволяет веб-приложениям создавать файл с живого сеанса аудио/видео.

<video autoplay></video> 

<script language="javascript" type="text/javascript"> 
function onVideoFail(e) { 
    console.log('webcam fail!', e); 
    }; 

function hasGetUserMedia() { 
    // Note: Opera is unprefixed. 
    return !!(navigator.getUserMedia || navigator.webkitGetUserMedia || 
      navigator.mozGetUserMedia || navigator.msGetUserMedia); 
} 

if (hasGetUserMedia()) { 
    // Good to go! 
} else { 
    alert('getUserMedia() is not supported in your browser'); 
} 

window.URL = window.URL || window.webkitURL; 
navigator.getUserMedia = navigator.getUserMedia || 
         navigator.webkitGetUserMedia || 
          navigator.mozGetUserMedia || 
          navigator.msGetUserMedia; 

var video = document.querySelector('video'); 
var streamRecorder; 
var webcamstream; 

if (navigator.getUserMedia) { 
    navigator.getUserMedia({audio: true, video: true}, function(stream) { 
    video.src = window.URL.createObjectURL(stream); 
    webcamstream = stream; 
// streamrecorder = webcamstream.record(); 
    }, onVideoFail); 
} else { 
    alert ('failed'); 
} 

function startRecording() { 
    streamRecorder = webcamstream.record(); 
    setTimeout(stopRecording, 10000); 
} 
function stopRecording() { 
    streamRecorder.getRecordedData(postVideoToServer); 
} 
function postVideoToServer(videoblob) { 

    var data = {}; 
    data.video = videoblob; 
    data.metadata = 'test metadata'; 
    data.action = "upload_video"; 
    jQuery.post("http://www.foundthru.co.uk/uploadvideo.php", data, onUploadSuccess); 
} 
function onUploadSuccess() { 
    alert ('video uploaded'); 
} 

</script> 

<div id="webcamcontrols"> 
    <button class="recordbutton" onclick="startRecording();">RECORD</button> 
</div> 

Spec:

http://www.w3.org/TR/mediastream-recording/

вы можете получить магнитофона медиа-файл, отправить его на сервер.

+0

webcamstream.record(); // при тестировании вашего кода нет такого метода. это плагин или расширение –

+0

@ifeanyiChukwu вы посмотрели на W3C Spec ?, пожалуйста, взгляните на спецификацию, и этот Record API все еще находится в стадии реализации. –

+0

https://dvcs.w3.org/hg/dap/raw-file/default/media-stream-capture/MediaRecorder.html. Я думаю, что api была обновлена ​​9 августа. Посмотрев вышеприведенную ссылку, я заметил, что не существует метода .record(). Его либо удаляют, либо заменяют методом .start(). –

1

Media Recorder API теперь поддерживается как Chrome (49+), так и Firefox (30+), и он использует getUserMedia() для доступа к веб-камере.

видеоданные хранятся локально в JavaScript video/webmBlob object и может быть:

  • воспроизведен в <video> элемент
  • загружается на клиентском компьютере в качестве .webm файла
  • загрузил (публикуемую) к веб-серверу для хранения и конверсии

This article бухта подробнее в спецификации, и вот live demo + GitHub project. Спецификация avb. на w3c

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

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