From 09286a6ed83bbf7dc0ebf7299fb3ae4a4ec1b004 Mon Sep 17 00:00:00 2001 From: MarconLP <13001502+MarconLP@users.noreply.github.com> Date: Thu, 20 Apr 2023 00:13:50 +0200 Subject: [PATCH] add video duration metadata to blob --- package-lock.json | 11 ++++++ package.json | 1 + src/components/Recorder.tsx | 71 +++++++++++++++++++++++++++++-------- src/components/StopTime.tsx | 16 +++++---- 4 files changed, 79 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0af3176..88c50be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "axios": "^1.3.5", "dayjs": "^1.11.7", "file-saver": "^2.0.5", + "fix-webm-duration": "^1.0.5", "micro": "^10.0.1", "micro-cors": "^0.1.1", "next": "^13.3.0", @@ -4230,6 +4231,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fix-webm-duration": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fix-webm-duration/-/fix-webm-duration-1.0.5.tgz", + "integrity": "sha512-b6oula3OfSknx0aWoLsxvp4DVIYbwsf+UAkr6EDAK3iuMYk/OSNKzmeSI61GXK0MmFTEuzle19BPvTxMIKjkZg==" + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -10338,6 +10344,11 @@ "path-exists": "^4.0.0" } }, + "fix-webm-duration": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fix-webm-duration/-/fix-webm-duration-1.0.5.tgz", + "integrity": "sha512-b6oula3OfSknx0aWoLsxvp4DVIYbwsf+UAkr6EDAK3iuMYk/OSNKzmeSI61GXK0MmFTEuzle19BPvTxMIKjkZg==" + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", diff --git a/package.json b/package.json index d4f43e0..9b6e9e5 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "axios": "^1.3.5", "dayjs": "^1.11.7", "file-saver": "^2.0.5", + "fix-webm-duration": "^1.0.5", "micro": "^10.0.1", "micro-cors": "^0.1.1", "next": "^13.3.0", diff --git a/src/components/Recorder.tsx b/src/components/Recorder.tsx index 2163a50..f2707e6 100644 --- a/src/components/Recorder.tsx +++ b/src/components/Recorder.tsx @@ -10,6 +10,7 @@ import axios from "axios"; import dayjs from "dayjs"; import { useRouter } from "next/router"; import { api } from "~/utils/api"; +import fixWebmDuration from "fix-webm-duration"; export default function Recorder() { const [steam, setStream] = useState(null); @@ -26,6 +27,7 @@ export default function Recorder() { const [submitting, setSubmitting] = useState(false); const apiUtils = api.useContext(); const getSignedUrl = api.video.getUploadUrl.useMutation(); + const [duration, setDuration] = useState(0); const handleRecording = async () => { const screenStream = await navigator.mediaDevices.getDisplayMedia({ @@ -62,7 +64,13 @@ export default function Recorder() { if (recorderRef.current === null) return; recorderRef.current.stopRecording(() => { if (recorderRef.current) { - setBlob(recorderRef.current.getBlob()); + fixWebmDuration( + recorderRef.current.getBlob(), + duration * 1000, + (seekableBlob) => { + setBlob(seekableBlob); + } + ); steam?.getTracks().map((track) => track.stop()); } }); @@ -218,7 +226,11 @@ export default function Recorder() { className="flex cursor-pointer flex-row items-center justify-center rounded pr-2 text-lg hover:bg-gray-200" >