我有一组图像,我想一个接一个地添加并创建一个电影。我将使用Quicktime for java(我在Mac上)。
我在网上搜索了我发现了很多展示如何使用qtj播放电影的例子,但我找不到任何代码片段或教程,展示我如何使用qtj逐帧创建电影?
答案 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 reference和javadoc。 Here 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
最有趣的部分应该是
玩得开心!