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" >