1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title>Record Desktop</title>
    5. </head>
    6. <body>
    7. <h1>Record Desktop with webRTC</h1>
    8. <div>
    9. <button id = "record">record</button>
    10. <button id = "pause">pause</button>
    11. </div>
    12. <script>
    13. 'use strict'
    14. var mediaRecorder;
    15. const pauseBtn = document.getElementById('pause');
    16. pauseBtn.disabled = true;
    17. pauseBtn.onclick = function(ev) {
    18. if (!mediaRecorder) {
    19. return;
    20. }
    21. if (pauseBtn.textContent == "pause") {
    22. mediaRecorder.pause();
    23. pauseBtn.textContent = "resume";
    24. }
    25. else {
    26. mediaRecorder.resume();
    27. pauseBtn.textContent = "pause";
    28. }
    29. }
    30. var buffer = [];
    31. function onDataAvailable(d) {
    32. if (d && d.data && d.data.size > 0) {
    33. buffer.push(d.data);
    34. }
    35. }
    36. function onRecordError(e) {
    37. console.error('Recorder error', e);
    38. }
    39. const recordBtn = document.getElementById('record');
    40. function onGetStream(stream) {
    41. recordBtn.textContent = "stop";
    42. var options = {mimeType: 'video/webm;codecs=vp8'};
    43. if (!MediaRecorder.isTypeSupported(options.mimeType)) {
    44. console.error(`${options.mimeType} is not supported!`);
    45. return;
    46. }
    47. try {
    48. mediaRecorder = new MediaRecorder(stream, options);
    49. }
    50. catch (e) {
    51. console.error('Filed to create MediaRecorder', e);
    52. return;
    53. }
    54. mediaRecorder.ondataavailable = onDataAvailable;
    55. mediaRecorder.onerror = onRecordError;
    56. mediaRecorder.start(10);
    57. }
    58. function saveVideo() {
    59. if (buffer) {
    60. var blob = new Blob(buffer, {type: 'video/webm'});
    61. var url = window.URL.createObjectURL(blob);
    62. var a = document.createElement('a');
    63. a.href = url;
    64. a.style.display = 'none';
    65. a.download = 'record.webm';
    66. a.click();
    67. }
    68. else {
    69. console.error("record failed");
    70. }
    71. }
    72. // 捕获视频
    73. const streamContrains = {
    74. video: {
    75. width: 1280,
    76. height: 720,
    77. frameRate: 15,
    78. },
    79. audio: false
    80. };
    81. function onGetStreamError(error) {
    82. console.log('getDisplayMedia error', error);
    83. }
    84. recordBtn.onclick = function(ev) {
    85. if (mediaRecorder && recordBtn.textContent != "record") {
    86. recordBtn.textContent = "record";
    87. pauseBtn.disabled = false;
    88. let tracks = mediaRecorder.stream.getTracks();
    89. tracks.forEach(track => track.stop());
    90. saveVideo();
    91. return;
    92. }
    93. pauseBtn.disabled = false;
    94. const mDevices = navigator.mediaDevices;
    95. const promise = mDevices.getDisplayMedia(streamContrains);
    96. promise.then(
    97. onGetStream
    98. ).catch(
    99. onGetStreamError
    100. );
    101. }
    102. </script>
    103. </body>
    104. </html>

    https://blog.csdn.net/leapmotion/article/details/108611151