test.html 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta
  6. name="viewport"
  7. content="width=device-width, initial-scale=1.0"
  8. />
  9. <title>Video to ReadableStream</title>
  10. </head>
  11. <body>
  12. <video
  13. id="video"
  14. width="640"
  15. height="480"
  16. autoplay
  17. loop
  18. muted
  19. >
  20. <source
  21. src="your-video.mp4"
  22. type="video/mp4"
  23. />
  24. </video>
  25. <script>
  26. const video = document.getElementById('video');
  27. async function videoToStream(videoElement) {
  28. // 创建 MediaStream
  29. const stream = videoElement.captureStream();
  30. const reader = new MediaRecorder(stream);
  31. // 创建一个可读流
  32. const readableStream = new ReadableStream({
  33. start(controller) {
  34. reader.ondataavailable = (event) => {
  35. if (event.data.size > 0) {
  36. const chunk = new Uint8Array();
  37. const reader = new FileReader();
  38. reader.onload = () => {
  39. // 将数据块添加到可读流
  40. controller.enqueue(new Uint8Array(reader.result));
  41. };
  42. reader.readAsArrayBuffer(event.data);
  43. }
  44. };
  45. reader.onstop = () => {
  46. controller.close();
  47. };
  48. // 开始录制
  49. reader.start();
  50. },
  51. cancel() {
  52. reader.stop();
  53. },
  54. });
  55. return readableStream;
  56. }
  57. video.addEventListener('loadeddata', async () => {
  58. const stream = await videoToStream(video);
  59. console.log(stream); // 你可以在这里使用这个流
  60. });
  61. </script>
  62. </body>
  63. </html>