JavaScript

WebRTC 브라우저에 웹캠으로 녹화 및 녹음, 다운로드

ITSkeleton 2020. 6. 29. 04:04
728x90
반응형

html

파일에는


이와 같이 작성해 줍니다


<div>

    <video id="gum" autoplay></video>

    <video id="recorded" autoplay></video>


    <div>

        <button id="record" disabled>Start Recording</button>

        <button id="play" disabled>Play</button>

        <button id="download" disabled>Download</button>

    </div>

</div>


<script src="~/js/main.js"></script>


그리고 js파일을 하나 만들어줍니다.


저는 main이라고 이름을 지었고 경로설정하는 방법은 따로 설명하지 않겠습니다.


위에 src를 이용하여 접근 합니다~



main.js


var mediaSource = new MediaSource();


mediaSource.addEventListener('sourceopen', handleSourceOpen, false);


var mediaRecorder;

var recordedBlobs;

var sourceBuffer;


var gumVideo = document.querySelector('video#gum');

var recordedVideo = document.querySelector('video#recorded');


var recordButton = document.querySelector('button#record');

var playButton = document.querySelector('button#play');

var downloadButton = document.querySelector('button#download');


recordButton.onclick = toggleRecording;

playButton.onclick = play;

downloadButton.onclick = download;


// window.isSecureContext could be used for Chrome

var isSecureOrigin = location.protocol === 'https:' ||

location.hostname === 'localhost';

if (!isSecureOrigin) {

  alert('getUserMedia() must be run from a secure origin: HTTPS or localhost.' +

    '\n\nChanging protocol to HTTPS');

  location.protocol = 'HTTPS';

}


var constraints = {

  audio: true,

  video: true

};


function handleSuccess(stream) {

  recordButton.disabled = false;

  console.log('getUserMedia() got stream: ', stream);

  window.stream = stream;

  if (window.URL) {

    gumVideo.src = window.URL.createObjectURL(stream);

  } else {

    gumVideo.src = stream;

  }

}


function handleError(error) {

  console.log('navigator.getUserMedia error: ', error);

}


navigator.mediaDevices.getUserMedia(constraints).

    then(handleSuccess).catch(handleError);


function handleSourceOpen(event) {

  console.log('MediaSource opened');

  sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"');

  console.log('Source buffer: ', sourceBuffer);

}


recordedVideo.addEventListener('error', function(ev) {

  console.error('MediaRecording.recordedMedia.error()');

  alert('Your browser can not play\n\n' + recordedVideo.src

    + '\n\n media clip. event: ' + JSON.stringify(ev));

}, true);


function handleDataAvailable(event) {

  if (event.data && event.data.size > 0) {

    recordedBlobs.push(event.data);

  }

}


function handleStop(event) {

  console.log('Recorder stopped: ', event);

}


function toggleRecording() {

  if (recordButton.textContent === 'Start Recording') {

    startRecording();

  } else {

    stopRecording();

    recordButton.textContent = 'Start Recording';

    playButton.disabled = false;

    downloadButton.disabled = false;

  }

}


function startRecording() {

  recordedBlobs = [];

  var options = {mimeType: 'video/mp4;codecs=vp9'};

  if (!MediaRecorder.isTypeSupported(options.mimeType)) {

    console.log(options.mimeType + ' is not Supported');

    options = { mimeType: 'video/mp4;codecs=vp8' };

    if (!MediaRecorder.isTypeSupported(options.mimeType)) {

      console.log(options.mimeType + ' is not Supported');

      options = { mimeType: 'video/mp4' };

      if (!MediaRecorder.isTypeSupported(options.mimeType)) {

        console.log(options.mimeType + ' is not Supported');

        options = {mimeType: ''};

      }

    }

  }

  try {

    mediaRecorder = new MediaRecorder(window.stream, options);

  } catch (e) {

    console.error('Exception while creating MediaRecorder: ' + e);

    alert('Exception while creating MediaRecorder: '

      + e + '. mimeType: ' + options.mimeType);

    return;

  }

  console.log('Created MediaRecorder', mediaRecorder, 'with options', options);

  recordButton.textContent = 'Stop Recording';

  playButton.disabled = true;

  downloadButton.disabled = true;

  mediaRecorder.onstop = handleStop;

  mediaRecorder.ondataavailable = handleDataAvailable;

  mediaRecorder.start(10); // collect 10ms of data

  console.log('MediaRecorder started', mediaRecorder);

}


function stopRecording() {

  mediaRecorder.stop();

  console.log('Recorded Blobs: ', recordedBlobs);

  recordedVideo.controls = true;

}


function play() {

    var superBuffer = new Blob(recordedBlobs, { type: 'video/mp4' });

  recordedVideo.src = window.URL.createObjectURL(superBuffer);

}


function download() {

    var blob = new Blob(recordedBlobs, { type: 'video/mp4' });

  var url = window.URL.createObjectURL(blob);

  var a = document.createElement('a');

  a.style.display = 'none';

  a.href = url;

  a.download = 'test.mp4';

  document.body.appendChild(a);

  a.click();

  setTimeout(function() {

    document.body.removeChild(a);

    window.URL.revokeObjectURL(url);

  }, 100);

}


출력할수 있는 방식에는 여러가지가 있습니다. 이는 따로 적어두지 않겠습니다.


대표적으로 mp4를 많이 사용하고 대중화 되어있기에 저는 mp4로 출력되도록 했습니다~


또하나 주의하실점은 WebRTC를 활용한것이기 때문에 


HTTPS or localhost 를 이용할때만 제대로 동작합니다.


많은 보안 문제가 있기때문에 저런 프로토콜을 이용해야만 사용할수 있도록 했다고 하네요~


이를 잘숙지하시고 활용하시길 바랍니다~

728x90
반응형