web-dev-qa-db-ja.com

Java:画像の配列からムービーを作成するにはどうすればよいですか?

基本的にはバイトの行列があります。各行(byte []の意味)は画像を表します。それからムービー(avi、mpegなど、あらゆるフォーマット)を作成してファイルとして保存するにはどうすればよいですか?各画像は次のいずれかになります。

int JPEG    Encoded formats.
int NV16    YCbCr format, used for video.
int NV21    YCrCb format used for images, which uses the NV21 encoding format.
int RGB_565 RGB format used for pictures encoded as RGB_565.
int YUY2    YCbCr format used for images, which uses YUYV (YUY2) encoding format.
int YV12    Android YUV format: This format is exposed to software decoders and applications.

ムービーを作成できる限り、好きなようにフォーマットを選択できます。

public void createMovie(byte[][] images) {
  // and ideas on what to write here?
}

実際の実装は必要ありません。アイデアと、必要な外部ライブラリ(必要な場合)を教えてください。

(テキストを追加するために)ムービーを作成する前に、いくつかの画像(バイトストリーム)を編集する必要もあります。どうやってやるの?

ソリューションは「Javaのみ」である必要があります!外部プログラム、外部コマンドはありません(ただし、外部jarを使用できます)。

ありがとう!

33
user361676

解決策は Mencoder を使用することです(または、少なくとも、これは準人気のある選択のようです)。

Mencoderの images-to-movies 機能に具体的に対処するリンクを次に示します。

ビデオの一部としてエンコードする前にフレームにテキストをレンダリングする場合と同様に、Java2Dの画像操作ライブラリを使用して、事前に単純に画像の上にテキストを描画できます。次に例を示します。

これがその方法の1つであり、 このFAQ は、Java2D、フォントレンダリングなどをその方向から始め、さらなるリソースへのポインタを提供するはずです。

ImageIOライブラリを使用すると、多数の画像形式を読み書きすることもできます。たとえば、.jpg-> BufferedImage-> .png、または必要に応じて、必要な方法で画像をトランスコードできます。変換プロセス中に画像ファイルを一時的に保存したり、変換プロジェクトなどにインポートするときにすべての画像を単一の形式に変換したりします。

サポートする出力フォーマットの数に応じて、おそらく次のようなことを行います

public void createMovie(BufferedImage[] frames, String destinationFormat)

...「destinationFormat」は「m4v」、「mpeg2」、「h.264」、「g​​if」などのようなものです。

8
jefflunt

[〜#〜] jmf [〜#〜] (Java Media Framework)について聞いたことがありますか?サンプルからこの例を見つけることができます: ( JPEG)画像

5
webpat

gifエンコーダー でgifを作ってみることができます。

2
gpojd

Javaアプレット内でビデオを再生するためのMJPEGリーダーおよびライターを作成しました。MJPEGは最も高度なビデオ形式ではありませんが、操作は非常に簡単です。コードはコンピュータービジョンライブラリの一部です- BoofCV 、しかしあなたはあなた自身の目的のためにこの1つのクラスを取り除くことができます。

  1. このファイルをダウンロードしてください: CreateMJpeg.Java
  2. 主な機能を見てください。 jpeg画像を読み取る場所にbyte []データを入れますが、最初にjpegに変換する必要があります。
    • 標準のJavaライブラリを使用してjpegに変換できます
  3. 変更されたコードを実行して映画を楽しむ

ユーザーフレンドリーな形式ではありませんが、少なくとも他のいくつかのソリューションのようにJNIをいじる必要はありません。

1
lessthanoptimal