これを達成するには、いくつかの問題を解決する必要があります。
GIF の生のピクセルを取得します。
<canvas>
おそらくこれを行う最良の方法ですが、アニメーション GIF ではうまく再生できないと思います。確かに一連の画像を読むことができます。
フレームをビデオ ストリームに変換します。
MPEG オーディオ コーデックの JavaScript 実装はありますが、純粋な JS のビデオ コーデックについては知りません。ffmpeg のソースを見て、移植してみてください。
ビデオ圧縮コーデック自体 (MPEG-1、-2、H.264 など) を実装するだけでなく、何らかのコンテナー形式 (たとえば、MPEG PS . )
バイナリデータの扱い。
ビデオ コーデックの出力はバイナリ データであり、JavaScript はその性質上、生のバイナリ データをうまく処理できません。最近のブラウザは、メモリ効率の良い方法でこの欠点に正確に対処するために、型付き配列を追加しました。
動画ファイルをユーザーに配信します。
上記のすべてが技術的にはユーザーのコンピューターで発生するため、これはばかげているように聞こえますが、ブラウザーのサンドボックスで発生します。ここで、ブラウザーからデータを取得し、ユーザーがファイル システムに保存できるファイルに保存する必要があります。
他の誰かがdata:
URI (base64 でエンコードされたデータ) を使用することを提案しましたが、これはメモリの観点からはひどい考えです。特に、比較的大きなビデオ データを扱うことになるためです。この時点で、ビデオ ストリームが型指定された配列になります。Blob
型指定された配列から新しい を作成し、それBlob
を に渡しwindow.URL.createObjectURL
ます。この方法では、データをメモリ内で複製する必要はありません。代わりに、ブラウザは型指定された配列からファイル システムに「ダウンロード」します。
もちろん、これはすべて、ユーザーのマシンに十分なメモリ (RAM) があることを前提としています。通常のビデオ圧縮の実装とは異なり、出力データをディスクにストリーミングすることはできません。ファイル全体をメモリに保持する必要があります。思ったよりも早くメモリ不足になる可能性があります。
したがって、これは理論的には可能かもしれませんが、良い考えではありません。動作する場合、ビデオのエンコード中に非常に遅くなり、ブラウザーがフリーズします (JS とブラウザー UI が同じシングル スレッドを共有するため)。ただし、それを回避するためにWebワーカーをミックスに含めることができると思います.
この時点で、独自のサーバー側ソリューションを展開するか、面倒な作業を行う何らかのサービスを使用する必要があります。
または、Chrome でGoogle のNaCl (ネイティブ クライアント)を利用して、実際にビデオのエンコードを行うこともできます。NaCl を使用すると、ブラウザーでネイティブ (C/C++) コードを実行できます。
ffmpeg ポートがあり、ファイルI/O を行う API があるようです。
明らかに、これは Chrome でのみ機能します。Firefox、Safari、および IE は NaCl をサポートしません。