Maison  >  Article  >  interface Web  >  Compresser des vidéos sur Webm dans le navigateur

Compresser des vidéos sur Webm dans le navigateur

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-06 06:22:02977parcourir

? Boostez vos vidéos Web : compression MP4 vers WebM avec React

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.

?️ Ce dont vous aurez besoin

Avant de plonger, assurez-vous d'avoir :

  • Réagissez avec Typescript
  • Ant Design pour créer une belle interface utilisateur.

Configuration rapide :


<p>npm install antd</p>




Configuration du composant

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>




Accepter le téléchargement du fichier

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>




Extraction des métadonnées vidéo

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>




Compression vidéo

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>




Téléchargement de la vidéo compressée



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




? Heure de lancement : tout rassembler

Voici un aperçu de notre travail complet :

Compressing videos to webm in the browser

Lien de déploiement :
https://abhirup-99.github.io/browser-compression-webm/

Lien du code :
https://github.com/Abhirup-99/browser-compression-webm

? Conclusion : vous êtes désormais un assistant de compression vidéo !

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.

? Prochaines étapes :

  • Je vais continuer à peaufiner les API de compression du navigateur et j'espère qu'il y aura bientôt un blog.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Réagir moderne avec ReduxArticle suivant:Réagir moderne avec Redux