如何使用qtj和java从一组图像创建电影?

时间:2009-03-13 11:27:22

标签: java video quicktime

我有一组图像,我想一个接一个地添加并创建一个电影。我将使用Quicktime for java(我在Mac上)。

我在网上搜索了我发现了很多展示如何使用qtj播放电影的例子,但我找不到任何代码片段或教程,展示我如何使用qtj逐帧创建电影?

2 个答案:

答案 0 :(得分:7)

我通过QTJ使用MovieMaker库中的processing类(GPL)完成了这项工作。处理是纯java,虽然它可以为初学者隐藏它。

小教程: 下载处理,打开它,转到草图 - >显示草图文件夹,创建一个名为“data”的文件夹,并将所有图像放在该文件夹中,名为“filename01.gif”,通过“filename09.gif”。将以下代码粘贴到编辑器中,然后点击播放:

/**
 * Makes a QuickTime movie out of an array of images.
 */

import processing.video.*;

MovieMaker mm;
PImage[] imageFrames;
int index;

void setup() {
  size(320, 240);
  int numFrames = 9;
  imageFrames = new PImage[numFrames];
  for( int i = 0; i < imageFrames.length; i++ )
  {
    imageFrames[i] = loadImage( "filename" + nf(i+1,2) + ".gif" );
  }
  // Save uncompressed, at 15 frames per second
  mm = new MovieMaker(this, width, height, "drawing.mov");
  // Or, set specific compression and frame rate options
  //mm = new MovieMaker(this, width, height, "drawing.mov", 30, 
  //                    MovieMaker.ANIMATION, MovieMaker.HIGH);
}

void draw() {
  if( index < imageFrames.length )
  {
    // show the image
    image( imageFrames[index], 0, 0 );
    // Add window's pixels to movie
    mm.addFrame();
    index++;
  }
  else
  {
    mm.finish();
    // Quit running the sketch once the file is written
    exit();    
  }
}

这将从sketch文件夹中的图像创建一个文件“drawing.mov”。如果你去文件 - &gt;导出应用程序,然后打开sketch文件夹并导航到application.macosx / source或application.windows/source文件夹,应该有一个.java文件,其中包含实际代码,如下所示:

import processing.core.*; 
import processing.xml.*; 

import processing.video.*; 

import java.applet.*; 
import java.awt.*; 
import java.awt.image.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
import java.text.*; 
import java.util.*; 
import java.util.zip.*; 
import java.util.regex.*; 

public class movie2 extends PApplet {

/**
 * Makes a QuickTime movie out of an array of images.
 */



MovieMaker mm;
PImage[] imageFrames;
int index;

public void setup() {
  size(320, 240);
  int numFrames = 9;
  imageFrames = new PImage[numFrames];
  for( int i = 0; i < imageFrames.length; i++ )
  {
    imageFrames[i] = loadImage( "filename" + nf(i+1,2) + ".gif" );
  }
  // Save uncompressed, at 15 frames per second
  mm = new MovieMaker(this, width, height, "drawing.mov");
  // Or, set specific compression and frame rate options
  //mm = new MovieMaker(this, width, height, "drawing.mov", 30, 
  //                    MovieMaker.ANIMATION, MovieMaker.HIGH);
}

public void draw() {
  if( index < imageFrames.length )
  {
    // show the image
    image( imageFrames[index], 0, 0 );
    // Add window's pixels to movie
    mm.addFrame();
    index++;
  }
  else
  {
    mm.finish();
    // Quit running the sketch once the file is written
    //exit();    
    println( "done" );
  }
}

  static public void main(String args[]) {
    PApplet.main(new String[] { "--bgcolor=#e0dfe3", "movie2" });
  }
}

要使用纯java,您需要使用类路径上处理应用程序文件夹中的core.jar和video.jar,然后编译此java代码。这是处理库的function referencejavadocHere are the javadocs for the MovieMaker class。如果需要,您可以看到MovieMaker类的source

HTH

答案 1 :(得分:1)

此处有一个与导出相关的示例代码:

http://developer.apple.com/samplecode/ImportExport/listing1.html

它显示了如何打开单个原生QuickTime影片进行阅读,然后将其传递给MovieExporter组件以从中创建新的QuickTime影片。

有关导入文件作为写入源的代码,请参阅

void importMedia()

有关将源导出为QuickTime影片的代码,请参阅

void run()

应该可以使用相同的方法打开图像文件,只要QuickTime支持输入文件的文件格式(如f.e.BMP)。

您应该能够使用大部分代码编写一系列图像文件。 您需要调查的唯一一点是,您必须调用追加其他帧添加到现有电影的方法。它可能使用相同的API,但很可能你需要使用另一个调用。

如果您需要挖掘另一种方法,您应该可以在此处的QT Java参考文档中找到它:

http://developer.apple.com/Java/Reference/1.4/Java14API_QTJ/

这是一个黑客,很可能性能不佳,但实际上可能会有效。

并且......我从未尝试过这个(我是一个针对Windows的QuickTime交易)所以:对不起,没有保修=)。


编辑:如果您正在寻找使用现有输入缓冲区将帧写入QT影片而不是使用QT API从文件中读取数据的方法,那么应该有适用的API 这也是。请查看参考文档。


编辑2 :实际上在这里查看C / C ++ API文档可能是值得的,因为组件和调用的命名似乎遵循大致相同的命名约定(即这可能有助于挖掘对于你需要的Java API的调用) C / C ++ Docs在提供指南和如何作为起点方面似乎更加彻底。可在此处找到C / C ++文档:

http://developer.apple.com/referencelibrary/QuickTime/index.html

最有趣的部分应该是

  1. 导入&amp;导出
  2. 压缩&amp;减压
  3. 玩得开心!