用組件工作
當QuickTime1990年問世的時候,它能夠播放一張郵票大小的movie——僅僅在價值7000美圓的硬盤上。它使用音頻和視頻的編解碼器,盡管這些編解碼器今天仍然被支持,但已被用戶淘汰很久了。然而,從 Apple 視頻到Cinepak 視頻再到MPEG-4,是一個平滑的變換。這是由于一個非凡的標準化設計——QuickTime 里大部分繁重的任務都是由組件或共享的動態代碼執行。組件提供了如下的支持:導入導出圖片和movie格式,執行圖片和聲音的壓縮和解壓縮,訪問系統資源及更多其它功能。QuickTime安裝程序提供了很多組件,這些組件具備許多有效的特性,而用戶也可以自己從Apple或者第三方添加其他組件進來,這些組件能夠提供更多的功能,如支持更多的多媒體格式。
API里組件并不處于中心位置——究竟,在開始的幾章里已經設法完全避免提到它們。當我們需要打開文件并將它們轉換為movie,解壓縮和解釋數據,保存它們到硬盤等等時,這個時候我們QuickTime做正確的事情。當需要的時候,QuickTime為了必需的功能瀏覽它的組件目錄并得到它所需要的東西。
但是有些時候開發者為了指出什么是可用的,或者為了指定特定地行為,或者需要更直接地使用組件。這個時候, 找出運行時可用的工具是一個強有力的方法。
指定組件類型
QuickTime里,組件由類型和子類型來識別,類型指定了功能范圍,子類型是該功能的一個特定實現。例如,有一個“movie 導出器”類型,代表可以導出一部movie到非QuickTime格式的組件。它用子類型確定適合AVI(Video for windows 的多媒體文件格式),MPEG-4的導出器, 這些標識符是32比特的整型值,但它們不列舉你可能期望來自java的常數。通常地,32比特被分成是4個8比特的ASCII 字符來讀取,組成一個簡短的,易讀的名字。這些在本地API包里定義為OSTypes類型,但是當與有意義的值組裝到一起時,它們被稱為“四字符代碼”,來自本地FOUR_CHAR_CODE函數,該函數為一個字符串返回一個OSType類型。這經常簡稱為 FCC或4CC.這種模式采納了C程序員的觀點。例如,為一部movie定義4CC需要一個好的,簡單的短語,就像在本地頁眉文件Movies.h 中所見的一樣: MovieResourceType = 'moov' 然而,由于Java的更先進的文本處理方法,在Java中用4CCs 處理要困難的多。因為,Unicode的應用意味著每個 Java字符是2個比特,這說明我們需要額外的幫助來將Java字符轉化為4CC.
我們如何做呢?
幸運地,QTUtils類提供了2個方法:toOSType()和fromOSType()。例4-1展示了這些方法,將一個Java 字符串轉化為一個4CC 表示,并從它的4CC 表示轉化回來。
Example 4-1. Converting to and from FOUR_CHAR_CODEs package com.oreilly.qtjnotebook.ch04;import quicktime.util.QTUtils;public class FourCharCodeTest extends Object { public static void main (String[] args) { if (args.length < 1) { System.out.PRintln ("Usage: FourCharCodeTest
main()函數從命令行取得一個String ,把它轉換成一個4CC,打印出4CC的十進制和十六進制值,然后把它轉換回一個String .用moov 作實驗時,導出如下:
剛剛發生了什么?
這些有用的方法提供了一些好的,老式的bit-munging來做它們的轉換。toOSType()以一個String 為依據,取每個字符的低8位并把它們放在所返回整型值的適當位置。換句話說,第一個字符的低8為代替了整數的開始8位,然后下一個字符作為下一個8位,等等。圖4-1說明了在 "moov"位轉移中在哪里位結束。(圖4-1)
新聞熱點
疑難解答