Advertisement
Guest User

MediaRecorder webm -> mp4

a guest
Mar 13th, 2020
444
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const mediaSource = new MediaSource();
  2. mediaSource.addEventListener('sourceopen', handleSourceOpen, false);
  3. let mediaRecorder, recordedBlobs, sourceBuffer;
  4. let recordButton, recording = false;
  5. const playButton = document.querySelector('button#play');
  6. const downloadButton = document.querySelector('button#download');
  7. let canvas, video, stream;
  8. var types = [
  9.     "video/webm",
  10.     "audio/webm",
  11.     "video/webm\;codecs=vp8",
  12.     "video/webm\;codecs=daala",
  13.     "video/webm\;codecs=h264",
  14.     "audio/webm\;codecs=opus",
  15.     "video/mpeg"
  16. ];
  17.  
  18. for (var i in types) {
  19.     console.log( types[i] + " - " + (MediaRecorder.isTypeSupported(types[i]) ? "√" : "X"));
  20. }
  21.  
  22. function prepRecorder(){
  23.     recordButton = document.querySelector('button#record');
  24.     recordButton.onclick = toggleRecording;
  25.     canvas = document.querySelector('canvas');
  26.     video = document.querySelector('video');
  27.     stream = canvas.captureStream(); // frames per second
  28. }
  29.  
  30. playButton.onclick = play;
  31. downloadButton.onclick = download;
  32.  
  33. function handleSourceOpen(event) {
  34.     console.log('MediaSource opened');
  35.     sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="h264"');
  36.     console.log('Source buffer: ', sourceBuffer);
  37. }
  38.  
  39. function handleDataAvailable(event) {
  40.     if (event.data && event.data.size > 0) {
  41.         recordedBlobs.push(event.data);
  42.     }
  43. }
  44.  
  45. function handleStop(event) {
  46.     console.log('Recorder stopped: ', event);
  47.     const superBuffer = new Blob(recordedBlobs, {type: 'video/mp4'}); // video/webm
  48.     video.src = window.URL.createObjectURL(superBuffer);
  49. }
  50.  
  51. function toggleRecording() {
  52.     if (!recording) {
  53.         recording = true;
  54.         startRecording();
  55.     } else {
  56.         stopRecording();
  57.         recording = false;
  58.         recordButton.innerHTML = iconVideo;
  59.         playButton.disabled = false;
  60.         downloadButton.disabled = false;
  61.     }
  62. }
  63.  
  64. // The nested try blocks will be simplified when Chrome 47 moves to Stable
  65. function startRecording() {
  66.     let options = {mimeType: 'video/webm;codecs=h264'};
  67.     recordedBlobs = [];
  68.     try {
  69.         mediaRecorder = new MediaRecorder(stream, options);
  70.     } catch (e0) {
  71.             console.log('Unable to create MediaRecorder with options Object: ', e0);
  72.             try {
  73.                 options = {mimeType: 'video/webm,codecs=vp9'};
  74.                 mediaRecorder = new MediaRecorder(stream, options);
  75.             } catch (e1) {
  76.                 console.log('Unable to create MediaRecorder with options Object: ', e1);
  77.                 try {
  78.                     options = 'video/vp8'; // Chrome 47
  79.                     mediaRecorder = new MediaRecorder(stream, options);
  80.                 } catch (e2) {
  81.                     alert('MediaRecorder is not supported by this browser.\n\n' +
  82.                     'Try Firefox 29 or later, or Chrome 47 or later, ' +
  83.                     'with Enable experimental Web Platform features enabled from chrome://flags.');
  84.                     console.error('Exception while creating MediaRecorder:', e2);
  85.                     return;
  86.             }
  87.         }
  88.     }
  89.     console.log('Created MediaRecorder', mediaRecorder, 'with options', options);
  90.     toggleVideo(false);
  91.     recordButton.innerHTML = iconStop;
  92.     playButton.disabled = true;
  93.     downloadButton.disabled = true;
  94.     mediaRecorder.onstop = handleStop;
  95.     mediaRecorder.ondataavailable = handleDataAvailable;
  96.     mediaRecorder.start(100); // collect 100ms of data
  97.     console.log('MediaRecorder started', mediaRecorder);
  98. }
  99.  
  100. function stopRecording() {
  101.     mediaRecorder.stop();
  102.     toggleVideo(true);
  103.     console.log('Recorded Blobs: ', recordedBlobs);
  104.     video.controls = true;
  105. }
  106.  
  107. function play() {
  108.     video.play();
  109. }
  110.  
  111. function download() {
  112.     const blob = new Blob(recordedBlobs, {type: 'video/mp4'}); // video/webm
  113.     const url = window.URL.createObjectURL(blob);
  114.     const a = document.createElement('a');
  115.     a.style.display = 'none';
  116.     a.href = url;
  117.     a.download = 'test.mp4'; // .webm
  118.     document.body.appendChild(a);
  119.     a.click();
  120.     setTimeout(() => {
  121.         document.body.removeChild(a);
  122.         window.URL.revokeObjectURL(url);
  123.     }, 100);
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement