最新一代的iPod媒体播放器在移动视频编程领域开辟了一个新机会——但是如何入门呢?本文介绍将QuickTimeforJava库,以编程方式为iPod媒体播放器创建视频内容时需要这个库。AppleiPod是当今市场上的几个媒体播放器之一,它能播放多种媒体,其中包括音频、视频和图片。在美国和其他地方,iPod引领着便携媒体播放器市场,从诞生至今,已经售出3千万套iPod,这占据了整个媒体播放器市场78%以上的份额。虽然iPod的成功显然是受MP3流行的推动,而且手机用户拍摄和交易数字图片到现在也有了一段时间,但移动视频的市场仍然在形成中。早期进入移动视频市场的潜在收益是显而易见的,但对许多开发人员来说,他们要解决的问题是最好地应用这项新技术的方式和地方。在这篇文章中,我首先将推荐一些移动视频的实际(可能也是非常流行的)应用,然后演示两个程序,让您开始使用QuickTimeforJavaAPI为iPod创建视频内容。这两个程序可以让您很容易地给现有的视频文件添加标题,并将传统的视频文件转换成与iPod兼容的格式。在文章末尾,将留给您一些示例代码,可以用它们学习使用QuickTimeforJavaAPI进行视频操作的更多内容。为什么要用移动视频?图1.iPod视频播放器便携媒体播放器在特定人群(即年龄在18到38岁之间,具有一定的可支配收入的消费者)中特别流行。因为移动视频对于便携媒体播放器来是相对较新的东西,所以对大多数开发者来说,遇到的第一个问题就是:为什么要创建移动视频内容?除了移动媒体最明显的娱乐要求之外,还有许多实际的使用情况:移动媒体既可以促进销售,也可以给便携媒体播放器和内容带来一类新用户。请想想以下这些情况:房地产经纪人可以创建一段视频,将视频做成房产可用属性和用录制好的配音说明的一些功能的虚拟漫步。然后,潜在的住房买主可能会用便携媒体播放器查看中意的属性。在没有时间寻找所有符合自己需求的房产的住宅搜索客户中,这种极为节约时间的方式会变得非常流行。汽车厂商和经销商可以使用移动视频发布所销售的最新车型的视频目录。潜在客户就会更熟悉中意的车型的特性和好处,而不必亲自去经销商那里。学院和大学的官员可以用移动视频格式向学生提供提供演讲,辅助学生学习。生产商可以为汽车、书架、玩具(等等)提供移动视频格式的安装说明。显然,这只是创建移动视频内容的商业驱动力的几个示例。这些示例中的共同之处就是向新市场介绍便携媒体的潜力。现在,我们来看看允许用编程方式创建和编辑视频文件的JavaAPI。QuickTimeforJavaAPI对于Java开发人员来说,支持数字媒体的创建、修改和回放的能力最强、功能最丰富的API就是QuickTimeforJavaAPI。QuickTimeforJava最初是为Macintosh平台创建的,但过去这几年时间里,Windows和Mac用户也可以随意使用它。当然,如果曾经用Java语言做过一些编程,那么您可能会问:为什么不可以只使用Java媒体框架(JMF)API。最初创建JMF是为了给JavaV1.0.2的开发人员提供处理各种媒体的能力。但是,它的应用并不广,它支持一些过时的媒体格式和编码方式,例如MPEG-2、AU、HotMedia和Flash2。另一方面,QuickTimeforJava支持QuickTime可以播放的所有媒体格式和编码方式。使用QuickTimeforJavaAPI可以访问更新的媒体格式,其中包括MPEG-4、MP3音频、H.264和Flash5。实际上,下面就是QuickTime支持的视频编码方式的完整列表:动画AppleBMPApplePixletAppleVideoCinepakComponentvideoDVandDVCProNTSCDVPALDVCProPALGraphicsH.261H.263H.264JPEG2000Microsoft?OLEMicrosoftVideo1MotionJPEGAMotionJPEGBMPEG-4(Part2)PhotoJPEGPlanarRGBPNGSorensonVideo2SorensonVideo3TGATIFF向视频添加标题如果是初次接触QuickTimeforJavaAPI或者是初次处理数字媒体,那么向视频片断添加标题是一个好的起点。清单1显示的CaptionAdder.java是一个简单的程序,它接受视频文件,然后向视频添加一个文本字符串作为标题。清单1.CaptionAdder.javaimportquicktime.*;importquicktime.io.*;importquicktime.std.image.*;importquicktime.std.movies.media.*;importquicktime.std.movies.*;importquicktime.std.*;importquicktime.qd.*;importquicktime.util.QTPointer;importjava.io.*;publicclassCaptionAdder{publicstaticvoidmain(Stringargs[]){if(args.length!=1){System.out.println(Usage:javaCaptionAdder[input_filename]);}else{try{QTSession.open();System.out.println(QuickTimeversion:+QTSession.getMajorVersion()+.+QTSession.getMinorVersion());QTFileqtfile=newQTFile(newFile(args[0]));DataRefurlMovie=newDataRef(file://+qtfile.getPath());Moviemovie=Movie.fromDataRef(urlMovie,StdQTConstants.newMovieActive);floattextTrackHeight=32;QDRectmovieBounds=movie.getNaturalBoundsRect();floatmovieWidth=movieBounds.getWidthF();floatmovieHeight=movieBounds.getHeightF();TracktextTrack=movie.addTrack(movieWidth,textTrackHeight,0);MatrixtextTrackMatrix=textTrack.getMatrix();textTrackMatrix.translate(0,movieHeight-textTrackHeight);textTrack.setMatrix(textTrackMatrix);textTrack.setEnabled(true);intmovieTimeScale=movie.getTimeScale();TextMediatextMedia=newTextMedia(textTrack,movieTimeScale);QDRecttextBounds=newQDRect(movieWidth,movieHeight);textMedia.beginEdits();TimeInfosampleTime=newTimeInfo(0,movie.getDuration()/2);Stringtext=newString(1234MainSt.-Listingprice:$164,000);TextMediaHandlertextMediaHandler=textMedia.getTextHandler();QTPointertextPointer=newQTPointer(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);OpenMovieFileoutStream=OpenMovieFile.asWrite(qtfile);movie.updateResource(outStream,StdQTConstants.movieInDataForkResID,qtfile.getName());}catch(Exceptione){e.printStackTrace();QTSession.close();System.exit(0);}QTSession.close();//endelse}System.out.println(complete.);//endmethod}}关于代码几乎每个QuickTimeforJava应用程序都一样,所有的实际动作都发生在QTSession.open()和QTSession.close()语句之间。在调用QTSession.open()时,QuickTime引擎可以初始化其自身。如果没有先调用QTSession.open(),就想调用其他QuickTimeforJava类,那么您会获得抛出到命令行中的非常难看的堆栈跟踪。QuickTimeforJavaAPI中使用的核心对象之一是quicktime.std.movies.Movie对象。如果初次使用QuickTimeforJava,那么需要认识到,在quicktime.std.movies.Movie对象和硬盘上可能存在的file_name.mov之间有一点细微的区别。重要的是,可以创建quicktime.std.movies.Movie对象,并且无需要在硬盘上创建file_name.mov文件该对象就可以存在。quicktime.std.movies.Movie对象可由多个轨道组成,这些轨道是独立的媒体源(例如音频、视频、静态图片或文本)。在CaptionAdder.java()中,在创建了quicktime.std.movies.Track对象后,我在textMedia.beginEdits()语句和textMedia.endEdits()语句之间添加了文本标题。在这个示例中,我用quicktime.std.movies.TimeInfo对象设置标题在视频中显示的时间长度,以及什么时候开始显示标题。我想让文本标题在视频的前半段显示,所以我把TimeInfo设为从0开始,并通过movie的持续时间将它设置为运行到一半时结束。使用CaptionAdder.java那么该如何使用CaptionAdder.java呢?首先,调用CaptionAdder.java非常简单直接。在向类路径中添加了QuickTimeforJava库之后,需要做的就是提供想要编辑的文件的名称。例如,假设想向图2所示的房地产清单视频添加标题。图2.没有标题的房地产视频示例截图要向这个文件添加标题,只需如清单2中所示那样运行CaptionAdder.java程序即可。清单2.使用CaptionAdder.javajavaCaptionAdderlisting22345.mov结果显示在图3中。图3.添加了标题的房地产视频示例转换成iPod格式在有了使用QuickTimeforJavaAP