下一页 1 2
最新一代的 iPod 媒体播放器在移动视频编程领域开辟了一个新机会 —— 但是如何入门呢?本文介绍将 QuickTime for Java? 库,以编程方式为 iPod 媒体播放器创建视频内容时需要这个库。 Apple iPod 是当今市场上的几个媒体播放器之一,它能播放多种媒体,其中包括音频、视频和图片。在美国和其他地方,iPod 引领着便携媒体播放器市场,从诞生至今,已经售出 3千万套 iPod ,这占据了整个媒体播放器市场 78% 以上的份额。虽然 iPod 的成功显然是受 MP3 流行的推动,而且手机用户拍摄和交易数字图片到现在也有了一段时间,但移动视频的市场仍然在形成中。早期进入移动视频市场的潜在收益是显而易见的,但对许多开发人员来说,他们要解决的问题是最好地应用这项新技术的方式和地方。 在这篇文章中,我首先将推荐一些移动视频的实际(可能也是非常流行的)应用,然后演示两个程序,让您开始使用 QuickTime for Java API 为 iPod 创建视频内容。这两个程序可以让您很容易地给现有的视频文件添加标题,并将传统的视频文件转换成与 iPod 兼容的格式。在文章末尾,将留给您一些示例代码,可以用它们学习使用 QuickTime for Java API 进行视频操作的更多内容。 为什么要用移动视频? 便携媒体播放器在特定人群(即年龄在 18 到 38 岁之间,具有一定的可支配收入的消费者)中特别流行。因为移动视频对于便携媒体播放器来是相对较新的东西,所以对大多数开发者来说,遇到的第一个问题就是: 为什么要创建移动视频内容?除了移动媒体最明显的娱乐要求之外,还有许多实际的使用情况:移动媒体既可以促进销售,也可以给便携媒体播放器和内容带来一类新用户。请想想以下这些情况: 显然,这只是创建移动视频内容的商业驱动力的几个示例。这些示例中的共同之处就是向新市场介绍便携媒体的潜力。现在,我们来看看允许用编程方式创建和编辑视频文件的 Java API。 对于 Java 开发人员来说,支持数字媒体的创建、修改和回放的能力最强、功能最丰富的 API 就是 QuickTime for Java API。QuickTime for Java 最初是为 Macintosh 平台创建的,但过去这几年时间里,Windows 和 Mac 用户也可以随意使用它。当然,如果曾经用 Java 语言做过一些编程,那么您可能会问:为什么不可以只使用 Java 媒体框架 (JMF) API。 最初创建 JMF 是为了给 Java V1.0.2 的开发人员提供处理各种媒体的能力。但是,它的应用并不广,它支持一些过时的媒体格式和编码方式,例如 MPEG-2、AU、HotMedia 和 Flash 2。另一方面,QuickTime for Java 支持 QuickTime 可以播放的所有媒体格式和编码方式。使用 QuickTime for Java API 可以访问更新的媒体格式,其中包括 MPEG-4、MP3 音频、H.264 和 Flash 5。实际上,下面就是 QuickTime 支持的视频编码方式的完整列表: 如果是初次接触 QuickTime for Java API 或者是初次处理数字媒体,那么向视频片断添加标题是一个好的起点。清单 1 显示的 CaptionAdder
.java
是一个简单的程序,它接受视频文件,然后向视频添加一个文本字符串作为标题。
清单 1. CaptionAdder.java
import quicktime.*;
import quicktime.io.*;
import quicktime.std.image.*;
import quicktime.std.movies.media.*;
import quicktime.std.movies.*;
import quicktime.std.*;
import quicktime.qd.*;
import quicktime.util.QTPointer;
import java.io.*;
public class CaptionAdder {
public static void main (String args[]) {
if (args.length != 1){
System.out.println("Usage: java CaptionAdder [input_filename]");
} else {
try {
QTSession.open();
System.out.println ("QuickTime version: " + QTSession.getMajorVersion() + "." +
QTSession.getMinorVersion());
QTFile qtfile = new QTFile(new File(args[0]));
DataRef urlMovie = new DataRef ("file://" + qtfile.getPath());
Movie movie = Movie.fromDataRef (urlMovie,StdQTConstants.newMovieActive);
float textTrackHeight = 32;
QDRect movieBounds = movie.getNaturalBoundsRect();
float movieWidth = movieBounds.getWidthF();
float movieHeight = movieBounds.getHeightF();
Track textTrack = movie.addTrack(movieWidth, textTrackHeight, 0);
Matrix textTrackMatrix = textTrack.getMatrix();
textTrackMatrix.translate (0, movieHeight - textTrackHeight);
textTrack.setMatrix (textTrackMatrix);
textTrack.setEnabled (true);
int movieTimeScale = movie.getTimeScale();
TextMedia textMedia = new TextMedia (textTrack, movieTimeScale);
QDRect textBounds = new QDRect (movieWidth, movieHeight);
textMedia.beginEdits();
TimeInfo sampleTime = new TimeInfo (0, movie.getDuration()/2);
String text = new String ("1234 Main St. - Listing price: $164,000");
TextMediaHandler textMediaHandler = textMedia.getTextHandler();
QTPointer textPointer = new QTPointer ( text.length() + 1, true );
textPointer.copyFromArray ( 0, text.getBytes(), 0, text.length() );
textMediaHandler.addTextSample (
textPointer,
QDFont.getFNum("Times"),
16,
0,
QDColor.white,
QDColor.black,
QDConstants.teCenter,
textBounds,
StdQTConstants.dfClipToTextBox | StdQTConstants.dfKeyedText,
0,0,0,
null,
sampleTime.duration );
textMedia.endEdits();
textTrack.insertMedia (sampleTime.time, 0, sampleTime.duration, 1 );
OpenMovieFile outStream = OpenMovieFile.asWrite (qtfile);
movie.updateResource (outStream, StdQTConstants.movieInDataForkResID,
qtfile.getName());
} catch (Exception e) {
e.printStackTrace();
QTSession.close();
System.exit(0);
}
QTSession.close();
// end else
}
System.out.println ("complete.");
//end method
}
}