Heim > Web-Frontend > js-Tutorial > Hauptteil

Komprimieren von Videos in WebM im Browser

Mary-Kate Olsen
Freigeben: 2024-10-06 06:22:02
Original
1108 Leute haben es durchsucht

? Bringen Sie Ihre Webvideos auf Vordermann: Komprimierung von MP4 zu WebM mit React

Haben Sie sich schon einmal gelangweilt, weil es bei der Arbeit nichts Interessantes gab? Nun, da beschloss ich, meinen Drang zu stillen und am aktuellen Stand der Browser-APIs herumzubasteln. Könnten wir Videos direkt über Web-APIs komprimieren? In diesem Blog zeige ich Ihnen, wie Sie moderne Browserfunktionen verwenden, um MP4-Videos in das WebM-Format zu komprimieren – alles innerhalb einer React-App.

?️ Was Sie brauchen

Bevor wir eintauchen, stellen Sie sicher, dass Sie Folgendes haben:

  • Reagieren Sie mit Typescript
  • Ant Design zum Erstellen einer schönen Benutzeroberfläche.

Schnelle Einrichtung:


<p>npm install antd</p>

Nach dem Login kopieren




Einrichten der Komponente

Lassen Sie uns unsere React-Komponente mit allen React-Importen einrichten:


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

Nach dem Login kopieren




Akzeptieren des Datei-Uploads

Wir brauchen eine Möglichkeit, unsere MP4-Datei auszuwählen:


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

Nach dem Login kopieren




Extrahieren von Videometadaten

Lassen Sie uns die Video-Metadaten abrufen:


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

Nach dem Login kopieren




Videokomprimierung

Hier passiert die Magie:


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

Nach dem Login kopieren




Herunterladen des komprimierten Videos



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

Nach dem Login kopieren




? Startzeit: Alles zusammenfügen

Hier ein kleiner Vorgeschmack auf unsere gesamte Arbeit:

Compressing videos to webm in the browser

Bereitstellungslink:
https://abhirup-99.github.io/browser-compression-webm/

Code-Link:
https://github.com/Abhirup-99/browser-compression-webm

? Zusammenfassung: Sie sind jetzt ein Videokomprimierungs-Assistent!

Herzlichen Glückwunsch! Sie haben gerade mit React einen leistungsstarken MP4-zu-WebM-Videokompressor erstellt. Ihre Webvideos werden jetzt schneller als je zuvor geladen, was die Benutzer begeistert und die Leistung Ihrer Website steigert.

? Nächste Schritte:

  • Ich werde weiter an den Browser-Komprimierungs-APIs basteln und hoffe, dass es bald einen Blog gibt.

Das obige ist der detaillierte Inhalt vonKomprimieren von Videos in WebM im Browser. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage