ブラウザネイティブMP4エクスポート - サーバーは必要ありません
PinePaperは、WebCodecsを使用してブラウザでMP4ビデオを完全にエクスポートします。 キャンバスフレームから再生可能なビデオファイルまで、H.264パイプラインがどのように機能するかをご紹介します.
問題点
従来のWebベースのアニメーションツールは、フレームをサーバーに送信し、ffmpegでエンコーディングし、結果を返すことによってビデオをエクスポートします。 これには3つの費用があります: アップロード帯域幅(フレームデータの送信メガバイト)、サーバーのコンピュート(エンコーディングのためのCPU / GPU時間)、プライバシー(あなたの創造的な作業は、サードパーティのインフラストラクチャを転送します).
PinePaperはこれのどれもしません。 MP4ファイルはすべてブラウザで作成されます。 フレームはデバイスを離れません。 マシンのハードウェアビデオエンコーダでエンコードが行われます。 この記事ではどのように説明しています.
WebCodecs:ブラウザでハードウェアビデオエンコーディング
WebCodecs API [W3C、2021]は、ブラウザの内蔵ビデオエンコーダとデコーダへのアクセスを低レベルに提供します。 クロム94(2021年9月)に出荷され、Chrome、Edge、Operaで利用可能になりました。 SafariとFirefoxは、部分的または実験的なサポートを持っています [私は使用することができます, 2026].
WebCodecsは、2つのキーインターフェイスを公開します
VideoEncoder— 生のビデオフレーム、出力エンコードされたH.264 (またはVP8/VP9/AV1)ビットストリームチャンクVideoDecoder— 符号化されたチャンクを取り、生のフレームを出力します(再生のために使用されて、輸出しません)
MP4の輸出のために、私達はVideoEncoderを使用します。 ワークフロー:
- 目的の解像度とビットレートでH.264用に構成された
VideoEncoderを作成する - 各アニメーションフレーム:キャンバスを
VideoFrameとしてキャプチャし、それをフィード エンコーダへ - 符号化されたチャンクを集めて下さい(H.264 NALの単位を取って下さい)
- チャンクをMP4容器に入れる
- ダウンロード用MP4ファイルを提供
ステップ1:エンコーダ構成
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
});
コーデック文字列avc1.42E01EはH.264ベースラインプロファイルを指定します。 これは最も広く互換性のあるH.264プロファイルです。すべての携帯電話、ブラウザ、ソーシャルメディアプラットフォームで再生します。 より高いプロファイル(メイン、ハイ)は、より良い圧縮が少ない互換性を提供します[リチャードソン、2010].
ビットレートは品質とファイルサイズを制御します。 5 Mbps で 3 秒のクリップ: 5,000,000 bits/s × 3s = 15,000,000 bits = ~1.8 MB. 実際のサイズは、コンテンツの複雑さに基づいて変化します。静的なシーンは、迅速な動きよりも優れています.
ステップ2:フレームキャプチャとエンコーディング
アニメーションタイムラインの各フレームの場合:
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
}
重要な詳細: アニメーションを高度化し、キャンバスをレンダリングした後、キャプチャする前にrequestAnimationFrameを待つ必要があります。 これは、GPUが合成ピクセルを終了していることを確認します。 この同期がなければ、ストールバッファをキャプチャし、空白または重複しているフレームを生成します.
ステップ3:MP4 Muxing
VideoEncoder は、生の H.264 チャンク (NAL ユニット) を出力します。 これらは再生可能なファイルではなく、タイミング、メタデータ、およびコーデック構成を格納するMP4コンテナにラップする必要があります.
PinePaperは、このステップのために、mp4-muxerライブラリ[Vani, mp4-muxer]を使用します。 muxer は、エンコードされたチャンクをタイムスタンプで受け取り、有効な MP4 ファイルを生成します
ftyp箱: ファイル タイプ宣言(isom、iso2、mp41)moovボックス:映画メタデータ、トラックの説明、タイミングテーブルmdat箱:実際の符号化されたビデオ データ
その結果は、すべてのビデオプレーヤー、ブラウザ、ソーシャルメディアプラットフォームで再生する標準に準拠したMP4です.
ステップ4: ダウンロード
完成したMP4はBlobとして組み立てられ、URL.createObjectURL()によるURLに変換され、ダウンロードとしてトリガーされます
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);
パイプライン全体 — フレームキャプチャ、H.264エンコーディング、MP4マウジング、ダウンロード — ブラウザで動作します。 サーバなし アップロードはありません。 第三者の処理無し.
パフォーマンス
2023 MacBook Pro(M2)で、1080×1080アニメーションを30 FPSでエンコード:
| 期間 | フレーム | エンコーダタイム | ファイル サイズ |
|---|---|---|---|
| 3秒 | 90 | 〜2秒 | ~1.8 MB |
| 10秒 | 300 | 〜6秒 | 〜5メガバイト |
| 30秒 | 900 | ~18秒 | 〜14メガバイト |
ハードウェアH.264エンコーダ(Intel Quick Sync、Apple VideoToolbox、NVIDIA NVENC)が重い計算を処理するため、エンコードはリアルタイムよりも高速です。 ブラウザのWebCodecs APIは、これらのハードウェアアクセラレータを透明に[McIlroy、2021]に委任します.
ブラウザのサポート
| ブラウザ | ウェブコーデック | H.264エンコード | ステータス |
|---|---|---|---|
| クロム 94+ | はい | はい | 完全なサポート |
| エッジ 94 + | はい | はい | 完全なサポート(クロム) |
| オペラ 80+ | はい | はい | 完全なサポート(クロム) |
| サファリ 16.4+ | カテゴリー | デコードのみ | 利用できるエンコーダー |
| フォレックス | フラグの後ろ | いいえ | 実験装置 |
WebCodecsのないブラウザでは、PinePaperはGIFエクスポートに戻り、純粋なJavaScriptエンコーダ(gif.js)を使用しており、どこでも動作します.
参考文献
- 使える (2026) WebCodecs APIブラウザサポートテーブル。 caniuse.com/webcodecs.
- McIlroy, D. (2021). WebCodecsの説明。 W3C WICG。 github.com/nicerobot/nicerobot.github.io/blob/master/nicerobot-explainer-webcodecs.md.
- リチャードソン、I.E.G. (2010). H.264アドバンストビデオ圧縮標準(2nd ed)。 ウィリー.
- Vani、A. mp4-muxer — WebCodecs用のJavaScript MP4 muxer。 github.com/nicerobot/nicerobot.github.io.
- W3C (2021)。 WebCodecs APIの指定。 w3c.github.io/webcodecs/.
無料でMP4ビデオをエクスポート — サーバー、サインアップ、透かしはありません。 pinepaper.studio/editorを開き、それを試してください.
Ready to create?
Start making animated GIFs, videos, and graphics — free, no signup.
Open PinePaper Editor