How We Built Browser- Native MP4 Ekspor - Tidak Perlu Server
PinePaper mengekspor video PP1X seluruhnya dalam peramban menggunakan WebCodecs. Begini cara kerja pipa H.264 - dari bingkai kanvas ke berkas video yang dapat dimainkan, tanpa mengunggah apapun.
Masalah
Alat-alat animasi tradisional ekspor video dengan mengirim frame ke server, mengkodean mereka dengan ffmpeg, dan mengembalikan hasilnya. Ini memiliki tiga biaya: upload bandwidth (mengirim megabyte frame data), server menghitung (CPU / GPU waktu untuk pengkodean), dan privasi (kerja kreatif Anda mentransits infrastruktur pihak ketiga).
PinePaper tidak melakukan semua ini. Berkas MP4 dibuat seluruhnya dalam peramban Anda. Tidak ada frame meninggalkan perangkat Anda. Pengkodean terjadi pada enkoder video hardware mesin Anda. Artikel ini menjelaskan bagaimana.
WebCodecs: Encoding Video Hardware dalam Peramban
- WebCodecs API * * [W3C, 2021] menyediakan akses tingkat rendah ke built-browser dalam enkoder video dan decoder. Itu dikirim di Chrome 94 (September 2021) dan sekarang tersedia di Chrome, Edge, dan Opera. Safari dan Firefox memiliki dukungan parsial atau eksperimental [Dapatkah saya Gunakan, 2026].
WebCodecs mengekspos dua antarmuka kunci:
VideoEncoder- mengambil frame video mentah, mengeluarkan tersandi H.264 (atau VP8 / VP9 / AV1) potongan bitstreamVideoDecoder- mengambil potongan terkode, mengeluarkan frame mentah (digunakan untuk putar, bukan ekspor)
Untuk ekspor MP4, kami menggunakan VideoEncoder. Aliran kerja:
- Buat
VideoEncoderuntuk H.264 pada resolusi dan bitrate yang diinginkan - Untuk setiap bingkai animasi: tangkap kanvas sebagai
VideoFrame, berikan ke enkoder - Kumpulkan potongan dikodekan (mentah H.264 NAL unit)
- Mux potongan ke dalam wadah MP4
- Menawarkan berkas MP4 untuk diunduh
Langkah 1: Konfigurasi Enkoder
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
});
String codec avc1.42E01E menyatakan Profil Baseline H.264. Ini adalah profil H.264 yang paling kompatibel secara luas - yang dimainkan pada setiap telepon, peramban, dan platform media sosial. Profil yang lebih tinggi (Main, High) menawarkan kompresi yang lebih baik tapi kurang kompatibilitas [Rizkardson, 2010).
Bitrate mengontrol kualitas vs ukuran berkas. Pada 5 Mbps untuk klip 3-detik: Ukuran sebenarnya bervariasi berdasarkan kompleksitas konten - adegan statis compress lebih baik daripada gerak cepat.
Step 2: Frame Capture and Encoding
Untuk setiap frame dalam timeline animasi:
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
}
Detil kritis: setelah memajukan animasi dan merender kanvas, Anda harus menunggu requestAnimationFrame sebelum menangkap. Ini menjamin GPU telah selesai mengkomposing piksel. Tanpa sinkronisasi ini, Anda menangkap penyangga basi dan menghasilkan frame yang kosong atau duplikat.
Langkah 3: MP4 Muxing
VideoEncoder mengeluarkan potongan H.264 mentah (unit NAL). Ini bukan berkas yang dapat dimainkan - mereka perlu dibungkus dalam wadah MP4 yang menyimpan waktu, metadata, dan konfigurasi codec.
PinePaper menggunakan * * mp4-muxer * * library [Vani, mp4-muxer] untuk langkah ini. Muxer menerima potongan kode dengan penanda waktu dan menghasilkan berkas PP1X yang valid dengan:
ftypbox: deklarasi tipe berkas (isom, iso2, mp41)- Kotak
moov: metadata film, deskripsi trek, tabel waktu mdatbox: data video yang dikodekan
Hasilnya adalah standar-compliant MP4 yang dimainkan di setiap pemutar video, peramban, dan platform media sosial.
Langkah 4: Unduh
MP4 yang selesai dirakit sebagai Blob, dikonversi ke URL melalui URL.createObjectURL(), dan dipicu sebagai download:
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);
Seluruh pipeline - frame capture, H.264 encoding, MP4 muxing, dan download - terjadi pada peramban. Tidak ada server. Tidak ada upload. Tidak ada proses pesta ketiga.
Penampilan
Pada MacBook Pro 2023 (M2), pengkodean sebuah animasi 1080 × 1080 di 30 FPS:
| Durasi | Bingkai | Waktu Enkode | Ukuran Berkas |
|---|---|---|---|
| 3 detik | 90 | ~ 2 detik | ~1.8 MB |
| 10 detik | 300 | ~ 6 detik | ~ 5 MB |
| 30 detik | 900 | ~ 18 detik | ~ 14 MB |
Enkoding lebih cepat daripada waktu karena perangkat keras H.264 encoders (Intel Quick Sync, Apple VideoToolbox, NVIDIA NVENC) menangani komputasi berat. Peramban 's WebCodecs API delegasi kepada akselerator perangkat keras ini dengan penuh perhatian [McIlroy, 2021].
Dukungan Peramban
| Peramban | WebCodecs | Encode H.264 | Status |
|---|---|---|---|
| Krom 94 + | Ya | Ya | Dukungan penuh |
| Tepi 94 + | Ya | Ya | Dukungan penuh (Chromium) |
| Opera 80 + | Ya | Ya | Dukungan penuh (Chromium) |
| Safari 16.4 + | Sebagian | Hanya decode | Enkode tidak tersedia |
| Firefox | Flag belakang | Tidak | Percobaan |
Untuk browser tanpa WebCodecs, PinePaper kembali ke ekspor PP1X, yang menggunakan Enkoder JavaScript murni (gif.js) dan bekerja di mana saja.
Referensi
- Dapatkah saya gunakan (2026). WebCodecs API didukung tabel peramban. canuse.com / webcodecs.
- McIlroy, D. (2021). WebCodecs Explainer.
- Chardson, IE.G. (2010). * The H.264 Advanced Video Compression Standard * (2nd ed.). Wiley.
- Vani, A. mp4-muxer - JavaScript MP4 muxer for WebCodecs. github.com / nicerobot / nicerobot.github.ioo.
- W3C (2021). Spesifikasi WebCodecs API. w3c.github.io / webcodecs /.
Ekspor video MP4 secara gratis - tidak ada server, tidak ada signup, tidak ada watermark. Buka [pinepaper.studio / editor] (/editor) dan cobalah.
Ready to create?
Start making animated GIFs, videos, and graphics — free, no signup.
Open PinePaper Editor