科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件QuickTime for Java API为iPod写软件

QuickTime for Java API为iPod写软件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

最新一代的 iPod 媒体播放器在移动视频编程领域开辟了一个新机会 —— 但是如何入门呢?

作者:佚名 来源:it实验室 2007年11月21日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
关于代码

  几乎每个 QuickTime for Java 应用程序都一样,所有的实际动作都发生在 QTSession.open() 和 QTSession.close() 语句之间。在调用 QTSession.open() 时,QuickTime 引擎可以初始化其自身。如果没有先调用 QTSession.open(),就想调用其他 QuickTime for Java 类,那么您会获得抛出到命令行中的非常难看的堆栈跟踪。

  QuickTime for Java API 中使用的核心对象之一是 quicktime.std.movies.Movie 对象。如果初次使用 QuickTime for Java,那么需要认识到,在 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 非常简单直接。在向类路径中添加了 QuickTime for Java 库之后,需要做的就是提供想要编辑的文件的名称。例如,假设想向 图 2 所示的房地产清单视频添加标题。

没有标题的房地产视频示例截图
图 2. 没有标题的房地产视频示例截图

  要向这个文件添加标题,只需如 清单 2 中所示那样运行 CaptionAdder.java 程序即可。

  清单 2. 使用 CaptionAdder.java

java CaptionAdder listing22345.mov

  结果显示在 图 3 中。

虚拟的房地产清单视频在运行了 CaptionAdder.java 之后的截图
图 3. 添加了标题的房地产视频示例

  转换成 iPod 格式

  在有了使用 QuickTime for Java API 创建和操作视频内容的基础之后,下一个主要障碍就是把内容转换成与 iPod 兼容的格式。不论使用摄像机、从活动视频源录制,还是创建动画序列,视频内容都不会立即与 iPod 视频播放器兼容。iPod 对于它播放的媒体的类型有点挑剔。表 1 显示了 iPod 环境支持的视频格式和设置。

  表 1. iPod 兼容内容的视频设置

视频格式 数据率 尺寸 帧率
H.264 视频 最高 768 Kbps 320 x 240 像素 30 fps
MPEG-4 视频 最高 2.5 Mbps 480 x 480 像素 30 fps

  让问题更复杂的是,对于视频中的音轨,它只支持高级音频编码 (AAC),所以如果想在 iPod 上播放视频,不仅仅要转换传统视频内容。幸运的是,可以求助于 MovieConverter.java,它是转换传统视频内容到 iPod 兼容格式的一个方便工具。MovieConverter.java 如 清单 3 中所示。

  清单 3. MovieConverter.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.io.IOException;

import quicktime.*;
import quicktime.io.*;
import quicktime.qd.*;
import quicktime.std.*;
import quicktime.std.clocks.*;
import quicktime.std.StdQTConstants;
import quicktime.std.image.*;
import quicktime.std.movies.*;
import quicktime.std.movies.media.*;
import quicktime.std.qtcomponents.*;
import quicktime.util.*;

import quicktime.app.view.*;

public class MovieConverter extends JFrame implements Errors, ActionListener{

 QTComponent component = null;
 JPanel jpanel = null;
 Button selectButton = null;

 public static void main (String args[]) {
  try{
   new MovieConverter();
  } catch(Exception e){
   System.out.println(e);
  }
 }

 public MovieConverter(){
  super("Movie Converter");
  try {
   QTSession.open();
  } catch (Exception e) {
   e.printStackTrace();
   QTSession.close();
  }

  jpanel = new JPanel();

  this.setContentPane(jpanel);
  selectButton = new Button ("Select a File to Convert");
  selectButton.addActionListener(this);

  jpanel.add (selectButton);

  addWindowListener(new WindowAdapter () {
   public void windowClosing (WindowEvent e) {
    QTSession.close();
    dispose();
   }

   public void windowClosed (WindowEvent e) {
    System.exit(0);
   }
  });

  this.pack();
  this.setVisible(true);
 }
 public void actionPerformed (ActionEvent event) {
  exportMovie();
 }

 void displayMovie (Movie m) throws QTException {
  component = QTFactory.makeQTComponent (new MovieController (m));
  jpanel.add ((Component)component);
  jpanel.remove(selectButton);
  pack();
 }

 void exportMovie () {
  try{
   FileDialog fileDialog = new FileDialog (this, "Choose Movie to Export...", FileDialog.LOAD);
   fileDialog.show();
   if (fileDialog.getFile() == null)
    return;
   QTFile movieFile = new QTFile (fileDialog.getDirectory() + fileDialog.getFile());

   Movie movie = Movie.fromFile (OpenMovieFile.asRead(movieFile));

   if (component != null) {
    component.setMovieController(new MovieController(movie));
   } else {
    displayMovie (movie);
  }

  new Thread (new Exporter(movie)).start();
 } catch (QTException err) {
  err.printStackTrace();
 }
}

}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章