Vous êtes-vous déjà ennuyé sans rien d'intéressant au travail ? Eh bien, c’est à ce moment-là que j’ai décidé de me gratter pour bricoler l’état actuel des API des navigateurs. Pourrions-nous compresser des vidéos directement via des API Web ? Dans ce blog, je vais vous montrer comment utiliser les fonctionnalités d'un navigateur moderne pour compresser des vidéos MP4 au format WebM, le tout dans une application React.
Avant de plonger, assurez-vous d'avoir :
Configuration rapide :
<p>npm install antd</p>
Configurons notre composant React avec toutes les importations React :
<p>import { useState, useRef, useEffect, ChangeEvent } from "react";<br> import { Button, Progress, message, Flex } from "antd";</p> <p>const VideoCompression = () => {<br> const [sourceVideo, setSourceVideo] = useState<File | null>(null);<br> const [compressedVideo, setCompressedVideo] = useState<Blob | null>(null);<br> const [isCompressing, setIsCompressing] = useState(false);<br> const [progress, setProgress] = useState(0);<br> const [width, setWidth] = useState<string>("");<br> const [height, setHeight] = useState<string>("");<br> const videoRef = useRef<HTMLVideoElement>(null);<br> const inputRef = useRef<HTMLInputElement>(null);</p>
Nous avons besoin d'un moyen de choisir notre fichier MP4 :
<p>const handleFileChange = (event: ChangeEvent<HTMLInputElement>) => {<br> if (!event.target.files) return;<br> const file = event.target.files[0];<br> if (file && file.type.startsWith("video/")) {<br> setSourceVideo(file);<br> setCompressedVideo(null);<br> } else {<br> message.error("Please select a valid video file.");<br> }<br> };</p>
Obtenons les métadonnées de la vidéo :
<p>useEffect(() => {<br> if (sourceVideo) {<br> const video = document.createElement("video");<br> video.onloadedmetadata = () => {<br> setWidth(video.videoWidth.toString());<br> setHeight(video.videoHeight.toString());<br> };<br> video.src = URL.createObjectURL(sourceVideo);<br> }<br> }, [sourceVideo]);</p>
Voici où la magie opère :
<p>const compressVideo = async () => {<br> if (!sourceVideo) {<br> message.error("Please upload a video first.");<br> return;<br> }<br> setIsCompressing(true);<br> setProgress(0);<br> try {<br> const stream = videoRef.current?.captureStream();<br> const mediaRecorder = new MediaRecorder(stream, {<br> mimeType: "video/webm",<br> videoBitsPerSecond: 1000000,<br> });<br> const chunks: BlobPart[] = [];<br> mediaRecorder.ondataavailable = (event) => {<br> if (event.data.size > 0) {<br> chunks.push(event.data);<br> }<br> };<br> mediaRecorder.onstop = () => {<br> const blob = new Blob(chunks, { type: "video/webm" });<br> setCompressedVideo(blob);<br> setIsCompressing(false);<br> setProgress(100);<br> };<br> if (!videoRef.current) return;<br> videoRef.current.onloadedmetadata = () => {<br> videoRef.current!.muted = true;<br> videoRef.current?.play();<br> mediaRecorder.start();<br> };<br> videoRef.current.onended = () => {<br> mediaRecorder.stop();<br> videoRef.current?.pause();<br> };<br> videoRef.current.ontimeupdate = () => {<br> if (!videoRef.current) return;<br> const progress =<br> (videoRef.current.currentTime / videoRef.current.duration) * 100;<br> setProgress(progress);<br> };<br> if (!videoRef.current) return;<br> videoRef.current.width = Number.parseFloat(width);<br> videoRef.current.height = Number.parseFloat(height);<br> videoRef.current.src = URL.createObjectURL(sourceVideo);<br> } catch (err) {<br> message.error("Error compressing video: " + (err as Error).message);<br> setIsCompressing(false);<br> }<br> };</p>
<p>const downloadCompressedVideo = () => {<br> if (compressedVideo) {<br> const url = URL.createObjectURL(compressedVideo);<br> const a = document.createElement("a");<br> a.href = url;<br> a.download = "compressed_video.webm";<br> document.body.appendChild(a);<br> a.click();<br> document.body.removeChild(a);<br> URL.revokeObjectURL(url);<br> }<br> };</p>
Voici un aperçu de notre travail complet :
Lien de déploiement :
https://abhirup-99.github.io/browser-compression-webm/
Lien du code :
https://github.com/Abhirup-99/browser-compression-webm
Félicitations ! Vous venez de créer un puissant compresseur vidéo MP4 vers WebM à l'aide de React. Vos vidéos Web se chargeront désormais plus rapidement que jamais, ravissant les utilisateurs et augmentant les performances de votre site.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!