· 5 min read

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 bitstream
  • VideoDecoder - mengambil potongan terkode, mengeluarkan frame mentah (digunakan untuk putar, bukan ekspor)

Untuk ekspor MP4, kami menggunakan VideoEncoder. Aliran kerja:

  1. Buat VideoEncoder untuk H.264 pada resolusi dan bitrate yang diinginkan
  2. Untuk setiap bingkai animasi: tangkap kanvas sebagai VideoFrame, berikan ke enkoder
  3. Kumpulkan potongan dikodekan (mentah H.264 NAL unit)
  4. Mux potongan ke dalam wadah MP4
  5. 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:

  • ftyp box: deklarasi tipe berkas (isom, iso2, mp41)
  • Kotak moov: metadata film, deskripsi trek, tabel waktu
  • mdat box: 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