Maison > interface Web > js tutoriel > le corps du texte

Compresser des vidéos sur Webm dans le navigateur

Mary-Kate Olsen
Libérer: 2024-10-06 06:22:02
original
1099 Les gens l'ont consulté

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

Copier après la connexion




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>

Copier après la connexion




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>

Copier après la connexion




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>

Copier après la connexion




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>

Copier après la connexion




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>

Copier après la connexion




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

source:dev.to
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal