Jak zbudować Browser- Native MP4 Eksport - Nie wymaga serwera
PinePaper eksportuje wideo MP4 całkowicie w przeglądarce za pomocą WebCodecs. Oto jak działa rurociąg H.264 - od ram płótna po odtwarzalny plik wideo, bez wpisywania niczego.
Problem
Tradycyjne narzędzia do animacji webowej eksportują wideo wysyłając ramki na serwer, kodując je ffmpeg i zwracając wynik. Ma to trzy koszty: przesyłanie przepustowości (wysyłanie megabajtów danych ramek), obliczanie serwerów (czas procesora / GPU dla kodowania) oraz prywatność (praca twórcza przechodzi infrastrukturę osoby trzeciej).
PinePaper nic z tego nie robi. MP4 jest tworzony w całości w przeglądarce. Żadne ramy nie opuszczą twojego urządzenia. Kodowanie odbywa się na sprzętowym koderze wideo maszyny. Ten artykuł wyjaśnia jak.
WebCodecs: Kodowanie wideo w przeglądarce
- WebCodecs API * * [W3C, 2021] zapewnia niski poziom dostępu do budynku przeglądarki - w koderze wideo i dekoderze. Został wysłany w Chrome 94 (wrzesień 2021) i jest teraz dostępny w Chrome, Edge i Opera. Safari i Firefox mają częściowe lub eksperymentalne wsparcie [Czy mogę używać, 2026].
WebCodecs ujawnia dwa kluczowe interfejsy:
VideoEncoder- pobiera surowe ramy wideo, wyjścia zakodowane H.264 (lub VP8 / VP9 / AV1)VideoDecoder- przyjmuje zakodowane kawałki, wyjścia ramki surowe (używane do odtwarzania, a nie eksportu)
Dla eksportu MP4 używamy VideoEncoder. Przepływ pracy:
- Utwórz
VideoEncoderskonfigurowany dla H.264 w żądanej rozdzielczości i bitrate - Dla każdej ramy animacji: uchwycić płótno jako
VideoFrame, karmić go do kodera - Zbierz zakodowane kawałki (surowe jednostki H.264 NAL)
- Wrzuć kawałki do pojemnika MP4
- Oferujemy plik MP4 do pobrania
Krok 1: Konfiguracja enkodera
const encoder = new VideoEncoder({
output: (chunk, metadata) => {
// chunk.data contains encoded H.264 bytes
// metadata.decoderConfig contains SPS/PPS on first chunk
muxer.addVideoChunk(chunk, metadata);
},
error: (e) => console.error('Encoder error:', e)
});
encoder.configure({
codec: 'avc1.42E01E', // H.264 Baseline Profile Level 3.0
width: 1080,
height: 1080,
bitrate: 5_000_000, // 5 Mbps
framerate: 30
});
Łańcuch kodekowy avc1.42E01E określa profil podstawowy H.264. Jest to najbardziej kompatybilny profil H.264 - gra na każdym telefonie, przeglądarce i platformie mediów społecznościowych. Wyższe profile (Main, High) oferują lepszą kompresję, ale mniej kompatybilności [Richardson, 2010].
Bitrate kontroluje jakość a rozmiar pliku. Przy 5 Mbps za 3-sekundowy klip: 5,000,000 bits/s × 3s = 15,000,000 bits = ~1.8 MB. Rzeczywisty rozmiar zależy od złożoności zawartości - sceny statyczne kompresują lepiej niż szybki ruch.
Krok 2: Uchwyt i kodowanie ramki
Dla każdej ramki w linii czasu animacji:
for (let frameNum = 0; frameNum < totalFrames; frameNum++) {
const frameTime = frameNum / fps;
// Advance animation to this time
app.setPlaybackTime(frameTime);
paper.view.draw(); // Full render (not view.update!)
await new Promise(r => requestAnimationFrame(r)); // Wait for paint
// Create VideoFrame from canvas
const frame = new VideoFrame(canvas, {
timestamp: frameNum * (1_000_000 / fps) // microseconds
});
// Encode (keyframe every 2 seconds)
encoder.encode(frame, {
keyFrame: frameNum % (fps * 2) === 0
});
frame.close(); // Release GPU memory
}
Krytyczny szczegół: po zaawansowaniu animacji i renderowaniu płótna, należy poczekać na requestAnimationFrame przed przechwyceniem. Dzięki temu GPU ukończyło kompostowanie pikseli. Bez tej synchronizacji, można uchwycić nieświeży bufor i produkować ramki, które są puste lub duplikowane.
Krok 3: MP4 Muxing
VideoEncoder wyjmuje surowe części H.264 (jednostki NAL). Nie są to odtwarzalne pliki - muszą być zawinięte w pojemnik MP4, który przechowuje czas, metadane i konfigurację kodeka.
PinePaper używa * * mp4- muxer * * biblioteki [Vani, mp4- muxer] dla tego kroku. Muxer otrzymuje zakodowane kawałki ze znacznikami czasu i produkuje ważny plik MP4 z:
- Pole
ftyp: deklaracja typu pliku (izom, iso2, mp41) moovbox: metadane filmowe, opisy utworów, tabele czasowe- Pole
mdat: rzeczywiste zakodowane dane wideo
Rezultatem jest zgodny ze standardami MP4, który gra w każdym odtwarzaczu wideo, przeglądarce i platformie mediów społecznościowych.
Krok 4: Pobierz
Ukończony MP4 jest montowany jako Blob, konwertowany na URL przez URL.createObjectURL() i uruchamiany jako pobieranie:
await encoder.flush(); // Wait for all frames to encode
const mp4Blob = muxer.finalize();
const url = URL.createObjectURL(new Blob([mp4Blob], { type: 'video/mp4' }));
const a = document.createElement('a');
a.href = url;
a.download = 'animation.mp4';
a.click();
URL.revokeObjectURL(url);
Cały rurociąg - uchwyt ramy, kodowanie H.264, muxowanie MP4 i pobieranie - odbywa się w przeglądarce. Nie ma serwera. Nie wysyłaj. Nie ma trzeciej partii.
Wydajność
Na MacBook Pro (M2) 2023 kodowanie animacji 1080 × 1080 przy 30 FPS:
| Czas trwania | Ramy | Czas kodowania | Rozmiar pliku |
|---|---|---|---|
| 3 sekundy | 90 | ~ 2 sekundy | ~1.8 MB |
| 10 sekund | 300 | 6 sekund | ~ 5 MB |
| 30 sekund | 900 | 18 sekund | 14 MB |
Kodowanie jest szybsze niż w czasie rzeczywistym, ponieważ sprzęt H.264 encoders (Intel Quick Sync, Apple VideoToolbox, NVIDIA NVENC) obsługuje ciężkie obliczenia. WebCodecs API w przeglądarce przekazuje te akceleratory sprzętowe w przejrzysty sposób [McIlroy, 2021].
Obsługa przeglądarki
| Przeglądarka | WebCodecs | H.264 Kod | Status |
|---|---|---|---|
| Chrome 94 + | Tak | Tak | Pełne wsparcie |
| Krawędź 94 + | Tak | Tak | Pełne wsparcie (chrom) |
| Opera 80 + | Tak | Tak | Pełne wsparcie (chrom) |
| Safari 16,4 + | Częściowo | Tylko dekodowanie | Kod niedostępny |
| Firefox | Za flagą | Nie | Eksperymentalne |
Dla przeglądarek bez WebCodecs PinePaper wraca do eksportu GIF, który używa czystego kodera JavaScript (gif.js) i działa wszędzie.
Odniesienia
- Czy mogę użyć (2026). Tabela obsługi przeglądarki WebCodecs API. caniuse.com / webcodecs.
- McIlroy, D. (2021). WebCodecs Explorainer. W3C WICG. github.com / nicerobot / nicerobot.github.io / blob / master / nicerobot- explorainer- webcodecs.md.
- Richardson, I.E.G. (2010). * H.264 Advanced Video Compression Standard * (2nd ed.). Wiley.
- Vani, A. mp4-muxer - JavaScript MP4 muxer for WebCodecs. github.com / nicerobot / nicerobot.github.io.
- W3C (2021). WebCodecs API Specyfikacja. w3c.github.io / webcodecs /.
Eksport wideo MP4 za darmo - bez serwera, bez rejestracji, bez znaku wodnego. Otwórz [pinepaper.studio / editor] (/editor) i spróbuj.
Ready to create?
Start making animated GIFs, videos, and graphics — free, no signup.
Open PinePaper Editor