App.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <template>
  2. <div>
  3. <video
  4. ref="videoRef"
  5. controls
  6. ></video>
  7. <button @click="load">load</button>
  8. </div>
  9. </template>
  10. <script lang="ts" setup>
  11. import { FFmpeg } from '@ffmpeg/ffmpeg';
  12. import { fetchFile, toBlobURL } from '@ffmpeg/util';
  13. import { ref } from 'vue';
  14. const ffmpegRef = new FFmpeg();
  15. const videoRef = ref();
  16. async function load() {
  17. const baseURL = 'https://unpkg.com/@ffmpeg/core@0.12.6/dist/umd';
  18. const ffmpeg = ffmpegRef;
  19. ffmpeg.on('log', ({ message }) => {
  20. console.log(message);
  21. });
  22. // toBlobURL is used to bypass CORS issue, urls with the same
  23. // domain can be used directly.
  24. await ffmpeg.load({
  25. coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'),
  26. wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'),
  27. workerURL: await toBlobURL(
  28. `${baseURL}/ffmpeg-core.worker.js`,
  29. 'text/javascript'
  30. ),
  31. });
  32. transcode();
  33. }
  34. async function transcode() {
  35. await ffmpegRef.writeFile(
  36. 'input.mp4',
  37. // await fetchFile('/mini-video.mp4')
  38. // await fetchFile('/2024-02-25.mp4')
  39. await fetchFile('/2024-02-25-10s.mp4')
  40. // await fetchFile(
  41. // 'https://raw.githubusercontent.com/ffmpegwasm/testdata/master/Big_Buck_Bunny_180_10s.webm'
  42. // )
  43. );
  44. await ffmpegRef.exec([
  45. '-i',
  46. 'input.mp4',
  47. '-vf',
  48. 'scale=-1:1280',
  49. '-r',
  50. '20',
  51. '-crf',
  52. '23',
  53. 'output.mp4',
  54. ]);
  55. const data = await ffmpegRef.readFile('output.mp4');
  56. console.log(data, 332322);
  57. videoRef.value.src = URL.createObjectURL(
  58. new Blob([data.buffer], { type: 'video/mp4' })
  59. );
  60. }
  61. </script>
  62. <style lang="scss" scoped></style>