QuickTime for Java API

來源:互聯網
上載者:User
最新一代的 iPod 媒體播放器在移動視頻編程領域開闢了一個新機會 —— 但是如何入門呢?本文介紹將 QuickTime for Java庫,以編程方式為 iPod 媒體播放器建立視頻內容時需要這個庫。

   Apple iPod 是當今市場上的幾個媒體播放器之一,它能播放多種媒體,其中包括音頻、視頻和圖片。在美國和其他地方,iPod 引領著可攜式媒體播放裝置市場,從誕生至今,已經售出 3千萬套 iPod ,這佔據了整個媒體播放器市場 78% 以上的份額。雖然 iPod 的成功顯然是受 MP3 流行的推動,而且手機使用者拍攝和交易數字圖片到現在也有了一段時間,但移動視頻的市場仍然在形成中。早期進入移動視頻市場的潛在收益是顯而易見的,但對許 多開發人員來說,他們要解決的問題是最好地應用這項新技術的方式和地方。   在這篇文章中,我首先將推薦一些移動視頻的實際(可能也是非常流行的)應用,然後示範兩個程式,讓您開始使用 QuickTime for Java API 為 iPod 建立視頻內容。這兩個程式可以讓您很容易地給現有的視頻檔案添加標題,並將傳統的視頻檔案轉換成與 iPod 相容的格式。在文章末尾,將留給您一些範例程式碼,可以用它們學習使用 QuickTime for Java API 進行視頻操作的更多內容。

  為什麼要用移動視頻?


圖 1. iPod 視頻播放器

   可攜式媒體播放裝置在特定人群(即年齡在 18 到 38 歲之間,具有一定的可支配收入的消費者)中特別流行。因為移動視頻對於可攜式媒體播放裝置來是相對較新的東西,所以對大多數開發人員來說,遇到的第一個問題就 是: 為什麼要建立移動視頻內容?除了移動媒體最明顯的娛樂要求之外,還有許多實際的使用方式:移動媒體既可以促進銷售,也可以給可攜式媒體播放裝置和內容帶來一類 新使用者。請想想以下這些情況:

  房地產經紀人可以建立一段視頻,將視頻做成房產可用屬性和用錄製好的配音說明的一些功能的虛擬漫步。然後,潛在的房屋買主可能會用可攜式媒體播放裝置查看中意的屬性。在沒有時間尋找所有符合自己需求的房產的住宅搜尋客戶中,這種極為節約時間的方式會變得非常流行。

  汽車廠商和經銷商可以使用移動視頻發布所銷售的最新車型的視頻目錄。潛在客戶就會更熟悉中意的車型的特性和好處,而不必親自去經銷商那裡。

  學院和大學的官員可以用移動視頻格式向學生提供提供演講,輔助學生學習。

  生產商可以為汽車、書架、玩具(等等)提供移動視頻格式的安裝說明。

  顯然,這隻是建立移動視頻內容的商業驅動力的幾個樣本。這些樣本中的共同之處就是向新市場介紹便攜媒體的潛力。現在,我們來看看允許用編程方式建立和編輯視頻檔案的 Java API。

  QuickTime for 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 支援的視頻編碼方式的完整列表:

  動畫
  Apple BMP
  Apple Pixlet
  Apple Video
  Cinepak
  Component video
  DV and DVC Pro NTSC
  DV PAL
  DVC Pro PAL
  Graphics
  H.261
  H.263
  H.264
  JPEG 2000
  Microsoft? OLE
  Microsoft Video 1
  Motion JPEG A
  Motion JPEG B
  MPEG-4 (Part 2)
  Photo JPEG
  Planar RGB
  PNG
  Sorenson Video 2
  Sorenson Video 3
  TGA
  TIFF

  向視頻添加標題

  如果是初次接觸 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
}
}

關於代碼

  幾乎每個 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 中。


圖 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();
 }
}

}

使用 MovieConverter.java

  使用 MovieConverter.java 非常簡單。在 圖 4 中,可以看到一個關於如何使用 Internet 的虛擬學術培訓視頻的截屏(從 Google 的首頁開始)。實際的影片檔案是 AVI 格式,並且還包括授課錄音的音軌。


圖 4. 樣本學術培訓視頻的截屏

  用 MovieConverter.java 程式將這個視頻檔案轉換成 iPod 相容的格式很容易。在啟動 MovieConverter.java 之後,首先選擇要轉換的檔案。然後指定新建立的檔案的名稱,如 圖 5 中所示。


圖 5. MovieConverter.java 請求新檔案的名稱

  在指定了新視頻檔案的名稱之後,應用程式顯示一個影片設定總結螢幕,如 圖 6 中所示。在這個螢幕上,有修改編碼方式、壓縮演算法的選項,甚至可以對媒體應用視頻過濾器。


圖 6. 影片設定總結

  在 圖 7 中,可以看到 MovieConverter 的視頻設定視窗,在這個視窗中,可以選擇視頻編碼方式,而提供了轉換後的視頻預覽。


圖 7. 視頻設定視窗

   設定好之後,MovieConverter 產生可以在 iPod 視頻播放器上播放的新視頻檔案。還要注意的是,MovieConverter.java 是個功能豐富且強大的應用程式。不但可以用它產生能夠在 iPod 媒體播放器上播放的視頻內容,還能用它把傳統視頻轉換成 QuickTime 支援的其他視頻格式。

  結束語

   在數年之後,iPod 很有可能會領導可攜式媒體播放裝置市場。目前這代 iPod 媒體播放器中添加了視頻內容,這開闢了許多令人興奮的營銷和商業機會。在這篇文章中,我提供了移動視頻內容的一些實際和商業上的應用,介紹了 QuickTime for Java API,並示範了如何用編程方式操縱移動視頻檔案,並將它轉換成與視頻 iPod 相容的格式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.