我有一组图像,我想一个接一个地添加并创建一部电影。我将为此使用 Quicktime for java(我在 Mac 上)。
我在网上搜索了很多示例,这些示例展示了如何使用 qtj 播放电影,但是我找不到任何代码片段或教程来展示如何使用 qtj 逐帧创建电影?
我已经通过 QTJ 使用处理库 (GPL)中的MovieMaker类完成了这项工作。处理是纯java,虽然它可以为初学者隐藏它。
小教程: 下载 Processing,打开它,转到 Sketch -> Show Sketch Folder,创建一个名为“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();
}
}
这将从草图文件夹中的图像创建一个文件“drawing.mov”。如果您转到文件 --> 导出应用程序,然后打开草图文件夹并导航到文件夹 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 代码。这是处理库的函数参考和javadoc。 这是 MovieMaker 类的 javadocs。如果需要,您可以查看MovieMaker 类的源代码。
高温高压
这里有一段与导出相关的示例代码:
http://developer.apple.com/samplecode/ImportExport/listing1.html
它展示了如何打开单个原生 QuickTime 影片进行阅读,然后将其传递给 MovieExporter 组件以从中创建新的 QuickTime 影片。
有关导入文件作为编写源的代码,请参阅
void importMedia()
有关将源导出到 QuickTime 影片的代码,请参阅
void run()
不过,只要 QuickTime 支持输入文件的文件格式(如 fe BMP),就应该可以使用相同的方法打开图像文件。
您也应该能够使用大部分代码编写一系列图像文件。您必须调查的唯一一点是您必须调用哪种方法才能将其他帧附加到现有电影。它可能使用相同的 API 工作,但很可能您需要使用另一个调用。
如果您必须挖掘另一种方法,您应该能够在位于此处的 QT Java 参考文档中找到它:
http://developer.apple.com/Java/Reference/1.4/Java14API_QTJ/
这是一种 hack,性能很可能很差,但它可能确实有效。
而且...我从来没有尝试过这个(我是 Windows 的 QuickTime 人)所以:对不起,没有保修 = )。
编辑:如果您正在寻找一种使用现有输入缓冲区将帧写入 QT 电影的方法,而不是使用 QT API 从文件中读取数据,那么也应该有用于此的 API。只需查看参考文档即可。
编辑 2:实际上可能值得在这里查看 C/C++ API 文档,因为组件和调用的命名似乎遵循大致相同的命名约定(即,这可能有助于挖掘所需的 Java API 调用)并且C/C++ 文档在提供指南和如何作为起点方面似乎更加彻底。C/C++ 文档可以在这里找到:
http://developer.apple.com/referencelibrary/QuickTime/index.html
最有趣的部分应该是
玩得开心!