# GIFをMP4に 同じ動きを10分の1の容量に

各フレームと元の表示時間を、H.264のMP4に。手元で変換し、アップロードしません。

> ブラウザでGIFアニメーションを小さなMP4に変換します。各フレームの表示時間を保ち、間隔は変更しません。広く使えるH.264のMP4で、アップロードは不要です。

このページは、ブラウザの中だけで動く対話型のツールです（https://abox.tools/ja/gif-to-mp4/）。渡したものが送信されることはありません。以下は、このページがツールについて言葉で説明している内容のすべてです。使うには、このアドレスを開いてください。

## GIFが**アップロードされることはありません**。サーバーが存在しないからです。

選んだGIFを手元の端末でデコードし、フレームごとに描き、ブラウザ自身のエンコーダーとこのアドレスから配信したコードでMP4をメモリに書きます。アップロード機能も受け取るサーバーもありません。

- ✗ アップロードなし
- ✗ アカウント不要
- ✓ オフラインで動作
- ✓ ソース公開
- ✓ ファイルは端末の中だけ

## GIFをMP4に変換する手順

1. **GIFを選びます。** 1つずつブラウザがディスクから直接読み、容量、フレーム数、再生時間、画素の大きさを表示します。
2. **書き出す内容を読みます。** 大きさ、フレームと表示時間、長さ、ビットレートを1行に表示します。透明な部分がある場合だけ背景色を選ぶ欄が現れ、それ以外に設定はありません。
3. **変換し、確認結果を読みます。** 各フレームを描画してエンコードし、進み具合を表示します。完成したファイルを開き直し、GIFと同じ長さで全フレームがあることを確かめます。メモリから繰り返し再生するので、保存前に継ぎ目を見られます。

## 詳しい解説

[GIFをMP4に変換する方法と、容量が大幅に減る理由](https://abox.tools/ja/guides/convert-a-gif-to-mp4/): 同じアニメーションのMP4がGIFの10分の1ほどになる理由、GIFにできて動画にできないこと、多くの変換でフレームの表示時間が崩れる理由、アップロードせずにブラウザーで変換する方法を説明します。

## 箱の中のほかのツール

- [動画→GIF変換ツール](https://abox.tools/ja/video-to-gif/): 使う範囲と、大きさと、フレームレートを選ぶだけです。
- [GIF作成](https://abox.tools/ja/gif-maker/): 何枚かの画像を、ひとつのアニメーションにします。
- [GIF分解](https://abox.tools/ja/split-gif/): すべてのコマを、1枚ずつPNGで。
- [GIF解析](https://abox.tools/ja/gif-analyzer/): コマ、表示時間、パレット、そしてバイトの行き先。

## よくある質問

### MP4がこんなに小さくなるのはなぜですか？

GIFは最大256色で各フレームを個別に保存しますが、動画は前から変わった部分を保存します。H.264は長年改良され、同じ動きが通常10分の1以下になります。256色の制限もなくなります。とても小さいGIFや動きの少ないGIFは大きくなることもあり、その場合は結果で伝えます。

### 表示時間は同じですか？

はい。各フレームの表示時間を保ち、複製、間引き、固定レートへの変換はしません。0.02秒未満だけはブラウザと同じく0.1秒として扱うので、ブラウザでのGIFと同じ長さです。完成後に長さとフレーム数を確かめます。

### 繰り返し再生しますか？

プレーヤー次第です。GIFには指定がありますが、MP4にはありません。フィードやチャットアプリは短い動画を繰り返すことが多く、このページのプレビューも継ぎ目を見られるよう繰り返します。パソコンのプレーヤーは通常1回再生します。

### 透明な部分はどうなりますか？

動画は不透明な長方形なので、背景色で塗ります。透明なGIFの場合だけ色を選べて、初期値は白です。エンコード前にフレームの下に描くので、映像の一部になります。

### 画像の大きさは変わりますか？

必要な場合だけ1画素変わります。H.264には偶数の辺が必要なので、幅や高さが奇数なら背景色の1列を加えます。補間はしません。幅が3840画素を超えるGIFは、エンコーダーが扱えるその幅に縮めます。開始前に書き出す大きさを表示します。

### どれくらい時間がかかりますか？

ハードウェアエンコーダーのある多くのノートパソコンや最近の電話なら普通のGIFは数秒、ない場合は長くなります。先にメモリへ展開し、フレームが0.5GBになったら止めて伝えます。進捗で現在のフレームを確認でき、キャンセルすると直ちに止まって書き出しません。

### GIFは送信されますか？

いいえ。読み込み、デコード、エンコード、書き出しはブラウザと端末で行います。`Content-Security-Policy`の接続先に、このサイト自身のものはありません。通信を切って使うことでも確かめられます。

### 電話でも動きますか？

動画エンコードに対応するブラウザなら動き、電話のハードウェアエンコーダーは高速です。ただしメモリが少なく、非常に長いGIFは展開して保持できない場合があります。

### 容量制限や料金はありますか？

展開後のフレームが0.5GBになったら読み込みを止めて伝えます。無料で、アカウント、ログイン、お試し期間はありません。広告で運営していますが、GIFの情報は広告に渡しません。

### オフラインでも動きますか？

はい。一度開いて通信を切っても動きます。GIFを別の場所へ送って変換するツールなら止まるので、送信しないことの確認になります。

## この主張を確かめる方法

- **MP4が小さくなり、広く選ばれる理由。** GIFは各フレームを最大256色の画像として保存し、前の画像を参照しません。動画コーデックはフルカラーで変わった部分を保存します。長年改良されたH.264では、同じ動きが通常10分の1以下の容量になります。SNS、チャット、コンテンツ管理システムが大きなGIFを拒否したり、受信後にMP4へ変換したりする理由です。
- **時間のかかるアップロードがありません。** オンライン変換では30MBを送って3MBを受け取る前に、まず回線でファイルを送る時間が必要です。ここではこのサイトのコードでGIFを読み、ブラウザ自身のエンコーダーでMP4を書きます。移動するのはディスクとメモリの間だけです。`Content-Security-Policy`の接続先に、このサイト自身のものはありません。通信を切っても動きます。
- **フレームごとの表示時間を保ちます。** GIFには固定のフレームレートがなく、各フレームが表示時間を持ちます。固定レートに変換するとフレームが複製や間引きされ、スライドショーが短くなったりぎこちなくなったりします。ここではGIFの1フレームを同じ表示時間の動画1フレームにします。ブラウザと同じく0.02秒未満だけは0.1秒として再生します。完成したファイルを開き直し、全フレームと長さを確かめます。
- **GIFにできて動画にできない2つのこと。** GIFの透明な部分を動画では保てないので、背景色を選びます。必要な場合だけ欄が現れ、初期値は白です。GIFには繰り返し再生の設定がありますが、MP4にはなく、プレーヤーが決めます。フィードやチャットアプリは短い動画を繰り返すことが多く、ここでも継ぎ目を確認できるようプレビューは繰り返します。
- **端末に必要な時間とメモリ。** ハードウェアエンコーダーのある最近の電話や多くのノートパソコンなら、普通のGIFは数秒です。ない場合は長くなります。先に全フレームをメモリへ展開し、画素・フレームごとに1バイトを使います。展開後0.5GBに達したら読み込みを止め、そのことを伝えてタブの停止を避けます。いつでもキャンセルできます。
- **Googleが読み込むものと、渡されないもの。** 広告と計測のスクリプトはGoogleから読み込みます。GIF、フレーム、名前、サイズ、長さは渡しません。読み込み、エンコード、書き出しのコードはこのサイト自身から配信され、リポジトリで公開されています。
- **寄付ボタンが読み込むものと、渡されないもの。** ヘッダーの「Buy me a coffee」ボタンはcdnjs.buymeacoffee.comのスクリプトが描き、Google Fontsの文字を使います。訪問を報告しないリンクで、利用者やGIFの情報は渡しません。クリックするまで何も起こらず、移動先は別のサイトです。
- **オフラインでも動きます。** 通信を切ってもすべての機能が動きます。GIFを別の場所へ送って変換するツールなら止まるので、簡単な証明になります。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、GIFの表示時間を動画の時刻にする`src/plan.js`、描画とエンコードの`src/encode.js`、読み込みの`src/shared/gif-decode.js`をご覧ください。書き出し処理も含めて通信機能はありません。
