Developer Connection

Member Login 登录 | 不是会员?
联系 ADC 高级搜索

ADC 首页 > 技术文档 > QuickTime > QuickTime 6


QuickTime 6有什么新特性

欢迎进入QuickTime 6。

本文提供一个QuickTime 6的新特性,功能变动及增强的列表。如果您是正在使用QuickTime的应用程序接口(API)级别的开发人员,内容提供商,多媒体制作商或者网站管理员,那么您应该阅读这篇文章。

参考以下部分:

使用Gestalt获得QuickTime的版本
文档和其他资源
错误报告
安装QuickTime 6
对变化和增强的总结
对MPEG-4的支持
使用MPEG-4文件
新的MPEG-4视频编解码器(Video Codec)
对MPEG-4音频的支持
QuickTime AAC 解码器
内置的MPEG-4流
MPEG-4和Web开发者
流的RTSP即时播放(Instant-Ons)的增强
用户接口的变化
对JPEG 2000的支持
对Flash 5的支持
新的QuickTime任务管理的应用程序接口
空闲管理器(Idle Manager)的应用程序接口
下一步该做什么
三个有用的空闲管理器的调用
一般目的的空闲管理器的应用程序接口
数据处理器(Handler)
电影导入器(Movie Importers)
新的Carbon电影控制机制
对Underpinnings的访问
精灵(Sprite)应用程序接口的变化
精灵的Hit-Testing模式
新的精灵操作数
新的支持章节列表(Chapter Lists)的连线动作(Wired Actions)和操作数
获取章节的名称和索引
新的支持动画和动画轨道(Sprite Tracks)的连线动作和操作数
动画Hit检测
综合的连线动作和操作数
QTVR对象动作和操作数
其他新的动作和操作数
对VRM声音压缩的支持
新的用户数据的应用程序接口
QuickTime for Java的增强
AppleScript的变化
新的Sequence Grabber的用户接口
新的Sequence Grabber的应用程序接口
类型
新的图象压缩的应用程序接口
新的图象解压管理器的应用程接口
新的支持键盘焦点的媒体处理器应用程序接口
增加键盘漫游(Keyboard Navigation)和可编辑文本域(Editable Text Field)的支持
新的QuickTime内容限制(Restrictions)方面的应用程序接口
新的在电影中控制内存使用的应用程序接口
综合的变化和增强
MIDI文件的就地导入(Imported In Place)
激活高质量的MPEG-4视频(MPEG-4 Video)轨道
QuickTime XML 导入器(Importers)
新的XML导出器(Exporter)
Embed标识(Tag)的MovieQTList属性
在QuickTime中对SMIL Meta标识符的支持
对ActiveX, Netscape 6和Mozilla的JavaScript支持
在QuickTime中播放Shoutcast或者Icecast流

使用Gestalt获得QuickTime版本

和以前一样,苹果的开发人员可以通过调用Macintosh工具箱的应用程序接口 Gestalt 函数来获得当前安装的QuickTime版本(这个Mac OS的函数也包含在QuickTime for Windows中)。

Listing 1-1 是一个代码段,它向您展示了如何检查当前安装的QuickTime版本。在这个例子中要检测的版本是QuickTime 6。请注意,数字0x06008000是用来检测GM版本的QuickTime 6,而不是预发行(pre-release)版本。

Listing 1-1 调用Gestalt函数来确定QuickTime的版本

{
/* check the version of QuickTime installed */
long version;
OSErr result;
result = Gestalt(gestaltQuickTime,&version);
if ((result == noErr) && (version >= 0x06008000))
{
/* we have version 6! */
}
}

文档和其他资源

本文尝试着为QuickTime开发人员提供一些专门支持他们编程和开发的详细信息。这些信息可以作为QuickTime API参考和在线文档库的补充。QuickTime的在线文档既有HTML格式,也有PDF格式,可以从以下站点下载:

http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/newsframe.htm

如果您需要其他的QuickTime开发文档,可以参考以下站点:

http://www.apple.com/quicktime/developer/ 

如果您需要全面的QuickTime API文档,请参看以下站点:

http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/frameset.htm 

苹果电脑还经常对QuickTime文档站点进行更新。开发人员可以通过订阅各种邮件列表来获得最新的新闻和信息。

如果您需要加入苹果开发商联盟,请访问以下站点:

http://developer.apple.com/membership/index.html

错误报告

如果您在使用QuickTime 6中碰到任何问题,请您通过标准的苹果软件缺陷报告机制进行错误报告。这个报告机制在QuickTime 6的软件发行说明(Release Notes)中具体描述。重要的是当您提交这种错误报告时,请包含一个导致错误发生的测试文件。


安装QuickTime 6

Mac OS 8和9,Mac OS X,以及 Windows版本的QuickTime 6可以从网上下载。下载站点是:

www.apple.com/quicktime/download/

QuickTime 6是第一个包含Mac OS X版本的安装器的版本。Mac OS X 10.1.5的用户可以使用QuickTime下载页上的安装器来安装QuickTime 6。

请注意,OS X版本的QuickTime 6的安装器不能工作在Mac OS X的Jaguar版本上,包括Jaguar的预发行版本。预发行版的Jaguar包含一个早期版本的QuickTime 6,而对应于Jaguar发行版则已经包含一个比可供下载的QuickTime 6更新一点的版本。

如果由于防火墙的原因,通过Web进行安装有困难,或者由于商务的原因需要做多次安装,您可以通过下载页的相关连接下载QuickTime 6的独立安装版本。

QuickTime Pro的用户应该注意到QuickTime 6需要新的注册码。QuickTime 5或者更早期的版本的注册码不能解锁QuickTime 6的专业版功能。如果您需要QuickTime 6的专业版本,可以从苹果电脑购买新的注册码,现在的价格是$29.99美元。

如果您需要卸载QuickTime,请运行QuickTime的安装器,选择定制安装,然后从弹出菜单中选择卸载(Uninstall)。

如果您需要安装早期版本的QuickTime,则QuickTime 5和QuickTime 4的安装器可以从以下QuickTime支持站点得到:

http://www.info.apple.com/usen/quicktime/

小结QuickTime 6的变化和增强

QuickTime 6是第一个支持国际标准化组织(ISO)MPEG-4视频与音频规范的QuickTime版本。相对于QuickTime的早期版本,这是一个显著的进步。它使得多媒体的提供商,内容的制作商以及视频制作人员可以在英特网上发布含有标准MPEG-4视频与音频格式的.mp4文件,而这些文件可以在其他符合ISO MPEG-4标准的播放器上解码和播放。

具体来说,QuickTime的制作人员只要简单地安装一下QuickTime 6,然后象以往那样走完正常的制作流程。这样在输出时,就可以额外地得到一个使用Sorenson 3 或H.263 插件进行编码的功能选项,制作人员可以通过使用这个选项把相应的内容输出成为一个.mp4文件。这样,他或她所制作的这些内容就可以在最终用户所拥有的任何ISO兼容的设备上播放了。

除了支持MPEG-4标准以外,本文要还讨论QuickTime 6的许多新特性和功能增强。

功能增强


修改


更新


对于Web开发人员


对MPEG-4的支持

QuickTime 6支持遵循ISO(ISO-compliant)的MPEG-4视频和音频的编码和解码。这意味着您可以通过QuickTime 6制作和播放MPEG-4视频和音频内容。此外,您还可以播放AAC(Advanced Audio Coding,即增强音频编码方式)编码的MPEG-4音频。

.mp4文件并不是一个QuickTime电影,这一点非常重要。它必须通过导入才能在QuickTime中使用。您可以使用支持导入器的应用程序接口函数来打开.mp4文件,如NewMovieFromFileNewMovieFromDataRef,或者直接调用MPEG-4导入器。最终用户可以使用QuickTime播放器的打开(Open)或者导入(Import)命令来打开.mp4文件,通过拖拽(drag-and-drop),或者使用QuickTime浏览器插件也可以( 详见“MPEG-4和Web开发人员”)。从桌面上双击一个.mp4文件可能可以打开它,也可能不行,这是因为其他应用程序也可以登记为这种文件类型的处理程序。

如果使用导出对话框中的“导出成MPEG-4”的选项,可以生成一个包含视频或音频,或者两者都有的.mp4文件。这个主题将在“使用MPEG-4文件”章节中进行讨论。


背景

1998年二月,国际标准化组织(International Standards Organization 即ISO)正式采纳QuickTime文件格式作为MPEG-4文件格式的基础。在一系列传送视频和音频信息的标准中,MPEG-4是最新的一个。MPEG-4与MPEG-1和MPEG-2的不同之处在于它采用了一种基于构件的架构来处理多媒体,这种架构与QuickTime相类似。而其他已经存在的标准则把多媒体看作是图形元素的阵列,缺乏灵活性。


MPEG-1和QuickTime

MPEG-1,也经常简单称为MPEG。它在Web和CD-ROMs上相当流行,一般情况下都有一个.mpg的文件后缀。MPEG-1支持一种视频压缩格式和多种音频压缩格式。在对数字存储媒体中的运动图象及其相关音频的进行编码时,它允许的数据率最高到大约1.5兆位每秒。MPEG文件的内容是由一个或多个MPEG流组成。基本的视频和音频流可以复合成为一个复合流。

MPEG-1的设计目的,是为了以T1的数据率(相当于单速,或者说是1x的CD-ROM)提供VHS品质的视频。它是VCD(video CD)标准的基础。这个标准在美国和欧洲很少使用,但是在亚洲相当流行。 绝大多数的商用DVD播放器都能够播放VCD, 由于CD-R刻录机和DVD播放器的快速普及,现在大家对这种格式的兴趣正在被重新点燃。

QuickTime可以在Windows和Macintosh(在Windows上要求QuickTime 5或以上的版本)平台上打开和播放MPEG-1视频。通过QuickTime的压缩器可以把这种视频输出成为其他格式。现在版本的QuickTime把整个MPEG-1流看成一个单一的样本,因此如果不把它转化成其他的压缩格式,您无法对MPEG-1视频的片段进行剪切或者拷贝。

MPEG-1也可以包含音频。这种音频可以被压缩成两种格式:即MPEG-1标准中的第二层(通常也叫MPEG-1音频)和第三层(就是我们知道的MP3)所定义的格式。QuickTime可以轻易地播放MPEG-1第二层和第三层的音频,包括MP3流,例如,ShoutCast流。QuickTime也可以播放复合的第二层音频(即音频和视频流复合在一起)。但是它不能从一个复合的MPEG-1流中把第二层的音频抽出或者导出。

QuickTime播放器不能把视频和音频输出成为MPEG-1流,也不能使用MPEG-1的压缩算法对视频和音频进行压缩。但是通过Heuris的MPEG编解码器(www.heuris.com/)或者在Roxio Toast (www.roxio.com/)中包含的MPEG-1编码器,可以使QuickTime支持MPEG-1的压缩。


MPEG-4和QuickTime

MPEG-4标准最近已经修订到了版本2(MPEG-4 Version 2),这是最新的标准化版本(请注意,随着标准的发展和演化,对版本2的修正也已经被追加进去了)。在任何情况下,标准所描述的约定和压缩格式不仅适用于视频和音频,而且也适用于文本和多媒体的集成。由于MPEG-4的文件格式基本上是以QuickTime格式为基础的,所以MPEG-4文件的潜在内容和QuickTime电影一样是非常多样化的。它是一个非常丰富而且复杂的规范。

软硬件厂商将会分阶段地实现MPEG-4规范。我们把一个的MPEG-4播放器所实现的规范部分称为播放器的样板(profile)。

从本质上说,样板是指一组技术的组合,这些技术在MPEG的术语中称为“工具”。样板是标准中的“标准”部分,如果一个具体的实现声称它遵循某个标准,那么它就必须实现这个标准的样板所定义的各种技术。样板专门用于使同一个规范的不同实现间的互操作性最大化。

样板的概念应用于MPEG-1音频标准的方式,就是一个很好的例子。MPEG-1音频分为3层。第一层的复杂度最小,但是压缩性能最底。而第三层复杂度最大,但是压缩性能最高。包含第三层的样板通常也会包含第一层和第二层。在这个例子中,第三层样板的具体实现可以解码第一、二、三层的码流;第二层样板的实现可以解码第一和第二层的码流;而第一层样板的实现只能解码第一层的码流;所以互操作性得到了最大化。

目前还没有人实现了整个MPEG-4规范。但是存在一些广泛使用的MPEG-4视频的编解码器。(有一个用于Windows媒体播放器的编解码器叫MS MPEG-4,但是它的版权归Microsoft所有,并且只是部分基于MPEG-4的规范草稿。Microsoft发布的早期版本和最终的标准并不兼容,因此这个编解码器被重新命名。Microsoft也发布了一个标准的MPEG-4编解码器,但是其文件格式没有互操作性。)

QuickTime的MPEG-4视频编解码器着眼于解决Internet上低带宽视频的分发问题。它的目标是在DSL和有线电视调制解调器的线路上发布接近电视品质的视频,或者在电话拨号调制解调器的线路上发布合理品质的视频。

苹果电脑把QuickTime的MPEG-4编解码器设计成为一个可以和其他遵循标准的厂商产品进行互操作的MPEG-4具体实现。

图1-1是MPEG-4的系统架构框图。在这个架构图中,到目前为止QuickTime已经支持的部分用黑体字在方框中表示出来。

图1-1 MPEG-4系统架构

[image: images/kir03.gif]

MPEG-4文件格式和QuickTime

MPEG-4文件格式(MP4)是从QuickTime格式派生而来的,它被用来把MPEG-4数据存储到文件中。MPEG-4需求组的主席Rob Koenen在他的简单介绍MPEG-4文件格式的文章“MPEG-4概述”中勾勒出这一文件格式的设计过程,具体如下:

“MP4文件格式被设计成一种灵活的,可扩展的格式,它用来容纳MPEG-4内容的媒体信息,可以方便地对媒体进行交换,管理,编辑和表现。这里所说的表现,可以是在包含着媒体信息的系统本地进行,也可以通过网络或者其他流媒体分发机制来进行。这个文件格式独立于任何特定的分发协议,而又在一般意义上对媒体分发提供有效的支持。它的设计是基于苹果电脑的QuickTime的文件格式”。

图1-2 所示的框图给出了一个简单的可互换文件的例子。请注意,BIFS指定了场景信息,它是场景的二进制格式(Binary Format for Scene)的首字缩写; 而OD,对象描述符(Object Descriptor),指定了流管理(Stream Management)信息。

图1-2 一个简单的可互换文件

[image: images/kir01.gif]

深入QuickTime文件格式

QuickTime文件格式被设计为可以容纳各种使用数字媒体所需要的数据。这个文件格式可以用来描述几乎所有的媒体结构,是应用程序之间进行数字媒体的理想格式,无论这些应用程序运行在什么平台上。

在QuickTime文件中,基本的数据单元是原子。每一个原子除了数据外还包含尺寸和类型信息。尺寸域(size field)是指原子包含的总的字节数,包括尺寸域和类型域(type field)本身。而类型域指存储在原子中的数据类型,它往往代表数据的格式。

原子的类型由一个32位的整形数来表示,一般是一个四个字符的代码。苹果电脑保留了所有完全由小写字母组成的4字符代码。除非特别声明,否则QuickTime电影中所有的数据以大字节在后(big-endian,网络数据的方式)的字节顺序存储。而且除非特别声明,否则所有的版本域都必须设置为0。原子从本质上是有层次结构,也就是说,一个原子里面可以包含一个或者多个类型不同的原子。

如果您需要更详细的信息,请参考“Inside QuickTime”书中的QuickTime文件格式章节 (351 pp, 2.3 MB)。这个资料的HTML和PDF格式都可以在苹果的QuickTime应用程序接口的站点上免费下载,这个站点是:

http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/frameset.htm

这本书在开始时介绍了QuickTime原子,然后讲述了QuickTime文件格式的细节。接着是用一系列的实例代码演示如何通过QuickTime的应用程序接口操作QuickTime文件。最后是附录,描述一些可以包含在QuickTime文件中作为数据的公用文件格式。这本书基本上是面向那些需要在QuickTime环境上下文之外使用QuickTime文件的开发人员设计的。


MPEG-4 Web 资源

运动图象专家组(MPEG)是一个负责数字视频和音频的编码标准开发的ISO/SEC工作组。它的主页如下:

http://mpeg.telecomitalialab.com/

在以下网址可以找到一个MPEG-4的进阶演示:

http://www.cselt.it/mpeg/standards/mpeg-4/mpeg-4.htm

在以下网址可以找到一些特定的MPEG-4问题的答案:

http://www.cselt.it/mpeg/faq.htm

MPEG-4标准在14496号系列,其规格(specifications)可以从国际标准化组织(ISO)的以下网址买到:

http://www.iso.ch

MPEG-4实现论坛致力于推广MPEG-4,同时也为其授权充当先锋。它的网址如下:

http://www.m4if.org

英特网流媒体联盟(Internet Streaming Media Alliance,即ISMA)正在致力于规范的推广和产品的集成。它的这些规范和产品都是围绕着基于IP网络上的MPEG-4规范的子集进行的。其网址如下:

http://www.isma.tv

理解MPEG-4的缩写词和术语

在MPEG-4规格描述中也包含很多完全有字母组成的缩写词和术语。下面是一些例子。


MPEG-4特殊的缩写词和术语

BIFS 场景的二进制格式(Binary Format for Scene)

CIF 公用的中间格式(Common Intermediate Format (352 x 288))

ESD 基本的流描述符(Elementary Stream Descriptor)

IEC 国际电子委员会(International Electrotechnical Commission)

IOD 初始对象描述符(Initial Object Descriptor)

MP4 MPEG-4文件格式

M4IF MPEG-4行业论坛(Industry Forum)

OD 对象描述符(Object Descriptor)


其他有用的术语

AVP 音频可视化标准(Audio Visual Profile (IETF RFC 1890))

cRTP 压缩的实时协议(Compressed Real-Time Protocol (IETF RFC 2508))

IETF 英特网工程任务团队(Internet Engineering Task Force)

IP 英特网协议(Internet Protocol)

IPv4 第4版的英特网协议(Internet Protocol Version 4)

IPv6 第6版的英特网协议(Internet Protocol Version 6)

ISMA 英特网的流媒体联盟(Internet Streaming Media Alliance)

ISO 国际标准化组织(International Organization for Standardization)

QCIF 四分之一的公用中间格式(Quarter Common Intermediate Format (176 x 144))

QoS 服务的品质(Quality of Service)

RFC 征求意见阶段的协议(Request for Comment)

RTP 实时协议(Real-Time Protocol (IETF RFC 1889))

RTSP 实时流媒体协议(Real-Time Streaming Protocol (IETF RFC 2326))

SDP 对话描述协议(Session Description Protocol (IETF RFC 2327))

TCP 传输控制协议(Transmission Control Protocol (IETF RFC 793))

UDP 用户报文协议(User Datagram Protocol (IETF RFC 768))


使用MPEG-4文件

QuickTime 6提供了对MPEG-4文件的透明访问。您可以使用支持导入器的应用程序接口函数打开.mp4文件,比如NewMovieFromFile或者NewMovieFromDataRef。最终用户则可以通过QuickTime播放器的打开(Open),导入(Import)命令来打开,也可以通过拖拽的方式。 这个过程和打开一个.avi文件或者其他可播放的非电影文件的过程相类似。在桌面上双击一个.mp4文件可能可以打开它,也可能不行,因为其他应用程序也可能登记为这种文件类型的处理程序。

目前,如果您要保存一个.mp4文件,则需要使用新的QuickTime MPEG-4电影导出器。这个导出器提供两个工作方式:


MPEG-4的导入器和导出器是如何工作的

一般地说,当您打开一个电影的时候,QuickTime会在文件中找到相应的电影原子,对它进行处理,并生成一个电影对象,也就是把它实例化了。如果您打开的是MP4文件,则需要激活导入器。 导入器所做的工作是扫描这个文件,找到'moov'原子,然后把这个MPEG-4风格的'moov'原子进行转换,使它与QuickTime风格的原子相一致。最后,由QuickTime生成电影对象。

再来看导出的情况。这时数据已经是MPEG-4格式了,即MPEG-4视频和音频。导入器需要让QuickTime把数据展开并保存到文件中去。这个过程会产生指向文件的电影原子。同样地,导出器需要把这个QuickTime风格的电影原子加以转换,使之符合MPEG-4风格,然后把这个原子写到文件中去。这是一个数据直接传递过程。

对于需要编码或者重新编码的导出过程,导出器先进行压缩,然后把MPEG-4数据写到文件中,最终使这个文件中的电影符合MPEG-4规范。


新增的处理MP4文件的对话框

QuickTime 6在QuickTime播放器中引入了一些新的对话框(在这个部分中使用Mac OS 9和Mac OS X系统中例子来加以说明)来支持最终用户打开MP4文件。

为了使用MP4文件,最终用户或者内容作者需要执行一系列导入导出操作。步骤如下:

  1. 在QuickTime播放器中打开一个.mov文件。

  2. 在文件(File)菜单中点击导出(Export)。

  3. QuickTime播放器会弹出一个带有输出选项列表的对话框。在这个对话框中选择“Movie to MPEG-4”。

  4. .mov文件保存成.mp4文件。

  5. 现在,这个.mp4文件可以在任何支持MPEG-4的播放器上播放了。

图1-3显示的对话框是当您在Mac OS 9系统中保存QuickTime电影时出现的。在这个例子中,我们假定您正在把“cool sunset”文件保存成为一个.mp4文件。在输出(Export)的选项列表中,选择“Movie to MPEG-4”选项。

图1-3 当您在Mac OS 9中想把一个QuickTime电影导出成为MPEG-4文件时出现的对话框

[image: images/export_to_mp4.gif]

如果您点击图1-3中所示的对话框中的选项(Option)按键,就会出现MPEG-4 设置对话框,如图1-4所示。在这个对话框中,您可以根据需要对基本视频轨,当前电影的物理尺寸,以及音轨进行设定。如果您选择“基本”(Basic)项,则QuickTime在输出视频时,就会选用基本的MPEG-4设定,并确保输出结果可以在最大范围内的MPEG-4兼容的设备上播放。

值得注意的是,在对话框的文本中,样板0(Profile 0)是指专用于ISMA(ISMA-specified)的样板,而不是MPEG-4规范所定义的样板。如果您需要更多关于ISMA和样板0的信息,请参考“ISMA和样板0的定义”部分。

图1-4 Mac OS X上的MPEG-4设定对话框及其General面板

[image: images/mp4_general.gif]

请注意在图1-4所示对话框的靠下部分包含一些额外的描述和解释,它们用来说明提供给用户的一些选项。在这个图中,音频部分被优化成音乐,AAC。(值得一提的是AAC可以适用于广泛的音乐和其他的音频)。

图1-5,所示的Mac OS X系统中的视频设定对话框中,最终用户可以调整一些视频的专用设定,例如设定每秒钟的数据流是多少Kb,或者设定帧率 。举例比来说,如果您需要的话,可以把帧率设定为每秒15帧。

图1-5 MPEG-4设定对话框,Video面板被选定

[image: images/mp4_video.gif]

图1-6所示的面板用来对Mac OS X上的音频进行设定。可以把音频的编码方式选择为立体声或者单声道。如果用户在基本面板上选择“音乐”,则QuickTime会自动选择高数据率和立体声。

图1-6 Mac OS X上的MPEG-4设定对话框,Audio面板被选择

[image: images/mp4_audio.gif]

图1-7所示的是示流媒体设定对话框。它使用户可以选择索引的类型,最大数据包的尺寸,以及最大数据包的时间长度。

图1-7 Mac OS X的MPEG-4设定对话框,Streaming面板被选中

[image: images/mp4_streaming.gif]

图1-8所示的是Mac OS X上的兼容性设定对话框。缺省情况下,QuickTime在导出MPEG-4时会生成普通的MPEG-4流。QuickTime并不检查其他可能由ISMA或其他组织要求的特殊的层兼容性条件,也不去检查生成的MPEG-4的总体数据率是否为特定的数据率。

用户可以选择“遵循ISMA”的选项,或者选择流的数据率。比如可以选择中等(medium)的数据率。

图1-8 Mac OS X上的MPEG-4设定对话框,Compatibility面板被选中

[image: images/mp4_compatbility.gif]

新的MPEG-4视频编解码器

QuickTime 6为MPEG-4视频压缩提供了新的视频编解码器。这个新的编解码器是遵循ISMA标准的,它现在遵循的是ISMA规范的样板0标准。它支持以64kb/秒这种极低的数据率进行编解码,并且提供与其他系统的互操作性。互操作性是这个新的编解码器的一个基本目标。

对于应用程序的开发人员来说,这个新的编解码器类似于其他QuickTime提供的编解码器。它的行为和开发者已经使用过的其他任何编解码器是一样的,例如,它类似于JPEG编解码器。从编程的角度来看,开发人员仍然可以弹出标准压缩对话框,以便用户进行各种选择和设定。

由于这个编解码器支持低数据率,并且支持H.263规范,开发人员可能考虑基于它进行开发,例如,基于这个编解码器开发用于广播的应用软件。

我们可以把这个新的MPEG-4视频压缩的编解码器的关键功能总结如下:


ISMA和样板(Profile) 0的定义

英特网流媒体联盟(ISMA)规范<http://www.isma.tv/>的目标是产生一个基于MPEG-4的文件技术标准,并把MPEG-4视频和音频以流媒体的形式在IP网络上进行分发。在这个标准中,一个文件有一个视频轨,一个音频轨,以及一些类似的用于流化的轨道。它的总体数据率不能超过64 Kb/秒,这与样板0的定义相一致。

ISMA的定义如下:

“一个产品如果要遵循这个规范,就必须完全实现样板0(Profile 0),同时可以额外选择实现其他样板。例如,一个视频点播服务器(on-demand video server)可能需要实现所有可能的样板,以便满足广泛的客户需求;而一个解码器或者终端可能只要支持样板0就可以了。”

“我们采取这种方法来保证任何被认证为遵循ISMA的产品,都可以和其他遵循ISMA的产品进行规定范围内的互操作。”

“它定义了基本的互操作性。提供商仍然可以在这个文档规定之外,自由地增加额外的功能。然而它同时也说明,一个遵循这个规范的产品不能为了和其他系统进行互操作,而在规范之外提出新的要求。”

在这个规范中,样板0定义如下:

“Rationale: 选择这个样板是为了让视频和音频的位率和宽带或无线移动设备的能力相匹配,同时也为了和M4IF采用的专利相一致。”

对于视频,这个样板包括以下内容:


已定义的样板及其级别

我们可以把样板(Profile)理解成一组组合在一起的算法,这些算法指定视频编解码器能做什么和不能做什么。而级别(level)则指定了编解码器做到什么程度。具体地说,级别可能限制样板中的计算复杂度,指定视频和音频流的位率。样板和级别的信息都存入MPEG-4文件,以便播放设备可以知道自己是否可以播放该文件。


ISMA样本0(Profile 0)


ISMA样本1(Profile 1)


3GPP(第三代合作伙伴工程(Third Generation Partnership Project))


Gamma矫正

在QuickTime 6中,MPEG-4视频编解码器支持gamma矫正,因此MPEG-4文件在Macintosh和Windows平台上显示时,看起来是一样的。MPEG-4视频中保存着gamma和颜色空间的信息,而MPEG-4的视频编解码器则根据这些信息,针对每一个平台进行矫正。


其他用于MPEG-4视频压缩的对话框

图1-9所示的是Mac OS X上的压缩设定对话框(在QuickTime Pro中提供)。它把MPEG-4 Video 作为可选项,提供给内容作者和最终用户。这个对话框还提供两个可选的压缩类型:“更快”(Faster)和“更精确”(More Accurate)。

图1-9 把MPEG-4 Video作为可选项提供给内容作者的压缩设定对话框

[image: images/compress_settings.gif]

总结

对于开发人员来说,关于QuickTime 6对MPEG-4的支持,需要记住以下重点:


MPEG-4音频的支持

QuickTime 6可以播放AAC的音频文件和处理除CELP外的ISMA样板的级别0和级别1的音频。在当前这个版本,QuickTime既支持AAC的编码,也支持解码(请注意,编码仅指AAC [Low Complexity])。QuickTime 6遵循MPEG-4音频规范。

QuickTime 6可以把音频部分从MP4文件读出来,并导出到QuickTime电影中。

目前还有以下限制:


定义AAC

AAC的特征包括:


QuickTime AAC编码器

QuickTime AAC编码器的特征包括:

表1-1是输入采样率+输出位率+输出的声道数和相应的输出采样率的映射关系表。

表1-1 输入采样率+输出位率+输出声道数和输出采样率的映射关系表


输入采样率 输出位率 输出采样率(一个声道) 输出采样率(两个声道)
48000 8000 8000 没有定义
16000-20000 16000 8000
24000-28000 22050 11025
32000 32000 16000
40000, 480000 32000 22050
56000 32000 24000
64000, 80000, 96000, 112000 48000 32000
128000+ 48000 48000
44100 8000 8000 没有定义
16000, 20000 16000 8000
24000, 28000 22050 11025
32000 32000 16000
40000, 48000 32000 22050
56000 32000 24000
64000, 80000, 96000, 112000 44100 32000
128000+ 44100 44100

请注意:在未来的实现中,位率和采样率的 关系可能会有不同。

无论目标音频的位率是多少,建议您最好提供上述采样率的内容。但是如果您已经有不同采样率的内容了,那也没有关系。QuickTime会进行必要的转换。


QuickTime AAC解码器

QuickTime AAC解码器的特征包括


内置的MPEG-4流

QuickTime 6支持内置的MPEG-4流。标准的索引过的MPEG-4文件可以直接以流的形式发布,不必转换成.mov文件。

为了对MPEG-4文件进行索引,QuickTime 6提供了一些新的分包器(packetizers)和装配器(reassemblers),一个用于音频,一个用于视频。这些构件用来把一个.mov或者.mp4的文件转化成一个索引过的文件。(在MP4文件中也有索引轨道的定义,它就是QuickTime版本的索引轨道。)然后,内容作者就可以把这个索引过的电影文件放到流媒体服务器中了。MPEG-4文件格式中索引轨道的定义和内置的QuickTime索引轨道完全一样。

举例来说,使用QuickTime Streaming Server(这是苹果公司的流媒体服务器产品),您就可以把遵循ISO(ISO-compliant)标准的索引过的MPEG-4文件以流的形式分发到任何遵循ISO的MPEG-4 客户端,包括任何可以在IP网络上播放MPEG-4流的MPEG-4设备。您也可以进行视频点播,直播现场的MPEG-4流,或者发布MPEG-4文件的播放列表。

请注意,QuickTime 6不支持组装RTP音频包。


MPEG-4和Web开发者

这个部分要讨论在QuickTime中使用MPEG-4的一些方法,以及如何生成,压缩和在Web上播放MP4文件。然后用一个例子来说明如何把一个.mp4文件嵌入到Web页面中,并设置成仅用QuickTime播放。 最后,本章节将讨论在生成遵循ISO标准的MP4文件时,如何保证它可以和QuickTime以外的播放器进行互操作。

如果您在建设网站,开发网站内容制作工具,或者制作通过网络进行分发的QuickTime电影,则需要阅读这个部分。


在QuickTime中使用MPEG-4的方法

在QuickTime中,有三种不同的使用MPEG-4的方法供您选择:

  1. 您可以用MPEG-4的视频和音频编解码器制作QuickTime电影(.mov)。这个方法做出来的电影不是.mp4文件,不能用MP4播放器进行播放。它们是QuickTime电影,需要用QuickTime 6或者更新的版本来播放。

  2. 您可以制作遵循ISO标准的MPEG-4文件(.mp4)。这些文件是MP4文件,而不是QuickTime电影。所有的遵循ISO的播放器都应该可以轻易播放这些文件。QuickTime播放器是一个遵循ISO的播放器,它可以播放其他平台上生成的遵循ISO的MP4文件。

  3. 您还可以制作不遵循ISO的MPEG-4文件(.mp4)。这些MP4文件可能不能在其他MP4播放器上播放,但可以在QuickTime 6上播放。(如果您需要更多与遵循ISO相关的问题的信息,请参考“遵循ISO”章节)。

QuickTime 6使您可以以.mov和.mp4两种格式制作快速启动(fast-start)和流化版本的电影。使用MPEG-4的编解码器的电影可以直接进行流化,也可以直接导出成.mp4文件,而不需要重新压缩音频或者视频。


为什么在Web上使用MPEG-4?

正如“对MPEG-4的支持”章节中讨论的那样,MPEG-4是一个ISO的标准,得到广泛的来自不同行业的公司的支持。这意味着MPEG-4文件可以在除QuickTime外的许多不同的播放器中播放,不仅在个人计算机上,也可以在蜂窝电话,掌上电脑,以及电视机顶盒上播放。这在当前这个充满私有格式的环境中,是一个巨大的进步。此前,您可能会仅仅为了服务于Mac和Windows用户,而不得不选用不同的压缩器和诸如Real,Windows Media,和QuickTime等不同的格式来发布您的电影。

使用MPEG-4的音频和视频编解码器进行压缩的QuickTime电影可以直接导出成MPEG-4文件格式,不必重新压缩,这使您的电影能够以多种格式(.mov.mp4)服务于客户,而又不必牺牲质量或者时间。

对于典型的英特网的数据率,MPEG-4简单视频编解码器生成的视频的品质,可以和Sorenson3视频相当。这是使用这个编解码器的很好的理由。此外,还有其他的好处。MPEG-4视频编解码器在超低位率的条件下,具有很好的扩展性,这使它能够使用于象蜂窝电话和掌上电脑这种数据率甚至比拨号调制解调器更低的设备。另外,MPEG-4视频压缩可以非常快,适合于现场广播和需要减少压缩电影的时间的场合。

请注意:当前发布的QuickTime 6版本只包含MPEG-4简单视频压缩器。高级的视频压缩器可以使您得到更高品质和更低位率。

正如“对MPEG-4音频的支持”章节中讨论的那样,MPEG-4音频使用的是高级音频编解码器(AAC)。这个编解码器和.mp3音频相比,在任何给定的位率的前提下,提供更好的质量;或者在质量相当的前提下,它要求的数据率更低(在典型情况下,低30%)。AAC支持在更高位率下的多声道环绕声。和之前的MP3一样,MP4音频是一个标准,因此当前支持MP3的设备(MP3播放器,CD播放器,DVD播放器)在不久的将来完全可能也支持MP4。对于ISDN或者更高的数据率来说,它是一个优质的编解码器。

然而,对于适合于拨号调制解调器或者移动无线连接的低带宽音频来说,QDesign2音乐编解码器和Qualcomm Purevoice编解码器还是更好的选择。

MPEG-4规范中包含一个基于CELP(codebook excited linear predictive)算法的低带宽的音频编解码器,它类似于Purevoice编解码器。

请注意:当前发布的QuickTime 6版本支持44.1和48 kHz的单声道或立体声的AAC音频。它并不支持多声道或者其他采样率的AAC音频,这在“定义AAC”章节中已经讨论过了


制作基于MPEG-4压缩算法的QuickTime电影

正如“新的MPEG-4视频编解码器”章节中讨论的那样,您可以象使用其他QuickTime编解码器那样来使用MPEG-4音频和视频压缩器。这个MPEG-4视频和音频编解码器在标准的QuickTime压缩对话框中提供。

从QuickTime播放器中,在文件菜单中选择导出(Export),在弹出菜单中选择“当前电影到QuickTime电影”(Movie to QuickTime Movie),然后点击选项(Options)按键。点击音频和视频的设置(Setting)键,然后从压缩器列表中选择MPEG-4选项。对于音频和视频,有很多设定,例如,帧率,质量,和数据率限制。点击尺寸(Size)键,可以改变视频轨道的色素维数。然后点击Okay键,最后保存。

请注意:QuickTime播放器的电影导出(Movie export)功能,只在QuickTime Pro版本支持。

在您安装QuickTime 6之后,其他使用标准文件压缩对话框的应用程序也就自动得到了使用MPEG-4压缩的能力。


生成.mp4文件

为了从QuickTime播放器中生成.mp4文件,需要在文件菜单中选择导出(Export),在弹出菜单中选择“当前电影到QuickTime电影”(Movie to QuickTime Movie),然后点击选项(Options)按键。这会打开一个带有一般(General),视频(Video),音频(Audio),流(Streaming),和兼容性(Compatability)四个面板的对话框。可以使用这个对话框来选择MPEG-4的压缩参数。这些面板的信息在“新的处理MP4文件的对话框”章节中做了描述。

在一般(General)面板中的设定,可以使您导出音频或者视频,或者同时导出两者。在这个面板里,您也可以对音频和视频压缩器的设定做一些选择。

在压缩选项中有一个Pass Through选项。使用这个选项来把基于MPEG-4压缩算法的QuickTime电影导出成.mp4文件格式时,不用重新压缩数据。这是一个非常快的操作,并且不会降低音频和视频的质量。

在当前发布的Quicktime 6版本中,尺寸(Size)菜单下提供三个选项:当前尺寸(Size),320 x 240,和160 x 120。如果您需要一个不同的帧尺寸,则可以调整一下帧尺寸,然后选择当前尺寸选项。

请注意:在QuickTime播放器中,您可以通过以下步骤来改变电影的尺寸:打开属性菜单(在电影(Movie)菜单下的获取电影属性(Get Movie Properties)子菜单下),从左边的弹出菜单中选择一个视频轨道,然后从右边的弹出菜单中选择尺寸(Size)。点击调整(Adjust)键, 就可以通过拖拽鼠标来改变尺寸了。(在您拖拽的同时,属性面板中显示象素的大小)。当您调整到正确尺寸时,点击完成(Done)键就可以了。如果电影中有多个视频轨,则先调整最大的轨道,并根据需要调整其他轨道,直到所有的轨道都在您期望的边界内。

视频面板中的设定使您可以对视频的位率限制,帧率,以及关键帧率进行设置。

音频面板中的设定则使您可以对音频的位率限制和声道数量进行设置。

当您改变设定时,每个面板底部的文本跟着变化,以便帮助您理解相关的选项,以及监控该设定是否遵循ISO。兼容性面板的设置将覆盖视频面板和音频面板的相关设定,以便确保内容遵循ISO。如果您需要更多的信息,请见“遵循ISO”章节。

流(Streaming)面板中的设定让您可以生成快速启动(fast-start)或者流化的.mp4文件。如果您选择生成流化的文件,则QuickTime会在结果中加入一个索引轨道。选择这个选项,同时把编解码器设定为Pass Through,则可以把一个基于MPEG-4压缩算法的快速启动电影转化成一个已索引的电影,而不需要重新压缩。

请注意:QuickTime 6不再推荐为服务器而进行的索引优化。因为优化会极大地扩展流电影的尺寸,而且流媒体服务器本身也已经进行了优化。

您可以使用QuickTime Streaming Server(版本4或者更高),Darwin Streaming Server(版本4或者更高),或者任何遵循ISO的流媒体服务器,来发布.mp4的流文件。QuickTime 6可以播放来自任何遵循ISO的设备所发布的MP4流。


在QuickTime中播放.mp4文件

在桌面上双击一个.mp4文件可能可以启动QuickTime播放器,也可能启动在您的计算机已经注册为.mp4文件处理程序的其他应用。

在Mac OS创建的文件不仅有文件类型信息,还有一个创建者的代码,因此如果.mp4文件是在Mac机器的本地创建的,则操作系统通常会调用QuickTime播放器来打开它。然而,如果这个文件被存储在Windows或Unix文件系统上,或者在英特网上传递,这个创建者的代码就会丢失。

为了在英特网上分发.mp4文件,您需要为Web服务器配置.mp4 MIME类型(video/mp4)。如果做了这个配置,浏览器就会调用注册为vedio/mp4处理器的插件或者ActiveX控件来播放.mp4文件。如果您把一个.mp4文件放到Web上,并尝试用QuickTime来播放它,而系统提示您“QuickTime不认识这个文件”,或者试图把这个文件显示为文件,则一般来说,这是因为这个Web服务器没有配置mp4 MIME类型。

请注意:对于只有音频的.mp4文件,可以选用audio/mp4的MIME类型。然而,这些文件也可以使用video/mp4 MIME类型。

为了把一个.mp4文件嵌入到Web页面中,并指定仅由QuickTime来播放,您需要使用使用 OBJECT 和 EMBED 标识。OBJECT 标识用来指定QuickTime的 ClassID Codebase ,而在 EMBED 标识中,要把 SRC 参数设置为QuickTime MIME类型,比如 .qtif 或者 .pntg ,而 QTSRC 参数需要设置为该.mp4文件,如下面的例子所示:


例:在Web上播放.mp4文件

<OBJECT 
CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"
WIDTH="320" HEIGHT="256" >

<PARAM NAME="src" VALUE="My.mp4" >
<PARAM NAME="autoplay" VALUE="true" >

<EMBED SRC="QTMimeType.pntg" TYPE="image/x-macpaint"
PLUGINSPAGE="http://www.apple.com/quicktime/download"
QTSRC="My.mp4" WIDTH="320" HEIGHT="256"
AUTOPLAY="true" >
</EMBED>

</OBJECT>

请注意:您可以用同样的技术来确保使用QuickTime浏览器插件来播放一些非QuickTime的文件(如.mp3或者.aiff文件)。

在Windows平台上,OBJECT 标识可以在Internet Explorer 4或者更高的版本中使用。参数 ClassID 指定了QuickTime ActiveX控件,而参数 Codebase 则告诉Explorer浏览器如果没有安装ActiveX 控件的话,应该到哪里去找。带有参数 name="src"PARAM 标识的值可以指定为您要发布的MP4文件的URL。

EMBED 标识可以工作在所有其他的Windows浏览器,以及包括Internet Explorer的所有Mac浏览器。这里把 SRC 参数设置为特殊的文件类型,其MIME类型仅用于QuickTime,比如 .pntg (image/x-macpaint) 或者 .qtif (image/x-quicktime)类型的文件,也可以使用 .mov (video/quicktime)文件。这个文件必须存在,并且被浏览器下载了,但还没有被显示出来。浏览器使用QuickTime插件来处理任何这种MIME类型的文件。

参数 PLUGINSPAGE 告诉浏览器如果没有安装QuickTime的话,到哪里去找。QTSRC 参数则保存被发布的MP4文件,QuickTime将会播放这个文件。


遵循ISO

正如“对MPEG-4的支持”章节中讨论的那样,MPEG-4规范不仅是一个视频或音频的编解码器。它包含了丰富的关于多媒体的规范,包括象文本和面部动画这样的内容。

目前,还没有软件实现了MPEG-4规范中所描述的所有媒体。因而MPEG-4定义了样板(profiles)(这个主题在“已定义的样板(Profiles)和级别(Levels)”章节中讨论),这些样板描述一个特定的播放器所支持的MPEG-4的子集,以及一个电影所要求的特征的集合。

举例来说,一个样板0(Profile 0)播放器能够以64 kb/秒的速度播放简单的MPEG-4视频,和44.1和48 kHz的单声道或多声道的AAC音频。 而一个样板0(Profile 0)的电影则不能对播放它的播放器有更多的要求。一个样板0的播放器可以播放任何样板0的电影。

一个样板1(Profile 1)的播放器则支持更大的特征集合,除了包括样板0的所有特征之外,还有其他的特征,如多声道声音和更高位率的视频。

如果一个MP4 电影使用了哪怕是一个样板1所定义的特征(这个特征不包含在样板0的定义中),那它就是样板1的电影,因为它需要样板1的播放器才能可靠播放。

如果一个MP4播放器没有实现哪怕是一个样板1所要求的特征,那它就是样板0的播放器,即使它可能可以播放许多样板1的电影。

QuickTime 6是一个样板0的播放器。它可以播放任何样板0的电影。QuickTime 6也有一些样板1播放器的特征,比如,它有处理更高位率的视频,但它不具备完全的样板1的特征,不能播放所有样板1的电影。

QuickTime可以创建和播放比64Kb/秒更高位率的样板0电影,如果您知道您的电影将会用QuickTime来播放,您可能会考虑利用QuickTime 6支持更高位率这个优点,但是请注意,这样生成的文件就不是遵循ISO的电影。其他样板0的播放器可能不能播放这些文件,即便是QuickTime可以播放。

为了保证和其他播放器的互操作性,只能使用遵循ISO的MP4文件。


流的RTSP即时播放(Instant-On)的增强

QuickTime 6在流媒体方面引入了一个新的功能:即时播放(Instant-On)。这个功能使宽带用户可以快速访问流媒体的内容,因而减少了播放之前的等待时间。宽带用户可以通过使用时间滑块把实时的点播流“擦”一遍。在滑块滑动时,播放的画面也立即得到更新,因而使您可以在QuickTime电影中精确定位您希望看到的内容。

这个功能使得当网络带宽显著超过目标电影的数据率时,可以几乎立即启动流电影。

用户可以在QuickTime设定控制对话框(如下图所示)把这个功能激活。通过滑块可以改变QuickTime预缓冲的时间,最大预缓冲是两倍的电影数据率,最小则相当少。

[image: images/instant_on.gif]

用户界面的变更

QuickTime 6给QuickTime 播放器的用户界面带来了一些变化,这部分将讨论这些变化。包括:

[image: images/kir04.gif] [image: images/kir05.gif] [image: images/kir06.gif]

这些变化并不影响在应用程序接口级别上使用QuickTime的程序员。


对JPEG 2000的支持

QuickTime 6包括对JPEG 2000的支持。这是一个高质量的静态图象压缩算法和图象编码标准,它使用了基于微波(wavelet)技术的艺术压缩技巧。QuickTime 6 对这个格式提供了编码,解码,导入,和导出的支持。

JPEG 2000标准是基于离散微波变形(discrete wavelet transform (DWT)),标量化,上下文建模,算术编码,以及后压缩率分配等技术。这个标准适合于很多用途,从医学图象的数字照片到高级的数字扫描和打印都可以适用。

如果您需要更多把JPEG 2000标准用于静态图象编码的信息,请参考:

http://www.jpeg.org/JPEG2000.htm

最重要的是,JPEG 2000提供了很高的压缩效率,在很多情况下,可以实现每象素一位的视觉无损失压缩,或者甚至更好。

请注意,仅在Mac OS X平台上QuickTime 6支持JPEG 2000。


对Flash 5的支持

QuickTime 6 包含几个新增的和更新过的构件,与支持Macromedia Flash有关。Flash媒体处理器(media handler)和Flash电影导入器在QuickTime 6中得到了更新,还有一个新的Flash属性面板,被加入到QuickTime播放器的信息面板中。


新的Flash媒体处理器

新的Flash媒体处理器支持遵循Flash 5或者更早版本的SWF规范的Macromedia Flash文件(也称作SWF文件)。(先前的QuickTime版本支持遵循Flash 4和更早版本的文件。)如果您需要了解Flash 5新特性的完全列表,请参考Macromedia的文档。最重要的新特性包括:

除了一些限制外,所有的这些新特性在新的Flash媒体处理器的支持下都工作正常。(请参考QuickTime 6的交付说明(Release Notes),它详细描述了这些限制。)

具有QuickTime能力的应用程序把SWF文件打开后,就通过Flash电影导入器把它转化成QuickTime电影,这个主题将在下一个章节进行讨论。这些电影文件是由一个单独的Flash轨道组成,这个轨道上的媒体数据就是原来的SWF文件中的数据。从实质上看,用QuickTime播放器、具备QuickTime能力的应用程序、或者QuickTime浏览器的插件等程序播放这些电影文件,就正如用Flash播放器应用或者Flash浏览器插件播放原来的SWF文件一样。


Flash电影导入器

新的Flash电影导入器在一些方面比原先的导入器更加灵巧。一个主要的变化是,新的导入器扫描部分或者所有被导入的Flash文件,并尝试确定这些文件是否被设置成在打开时自动播放(先前版本的导入器假定所有的SWF文件都应该是自动播放的)。而另外一些设定被从先前版本的导入器沿用下来:play-all-frames选项被设置成 TRUE ,而循环播放(looping)的标志被设置成 FALSE


新的Flash属性信息面板

在QuickTime电影中,Flash轨道可以和其他类型的轨道组合在一起。当您使用Flash轨道中的控件(按键,滑块等)控制其他轨道(视频轨,声音轨,VR轨等等)的播放和设置时,这个功能特别有用。

在这种情况下,内容作者们需要考虑一个在早期版本的Flash媒体处理器里并不存在的功能:版本5的ActionScripts在任何时间都可以读取光标的位置或者鼠标按键的状态。这意味着一些 ActionScripts可以响应鼠标按键的点击,即使这些点击事件并不是发生在Flash轨道上的交互元素上。如果Flash媒体处理器接受和处理了所有发生在轨道方框的点击事件,那么这些点击事件将不再被传递到Flash轨道后面的其他轨道中去。这可以有效地阻止用户和Flash轨道后面的动画轨道或者QuickTime VR轨道进行交互。

新的Flash媒体处理器使得电影的作者可以基于轨道来决定鼠标点击事件的处理机制:是所有的点击事件都由Flash轨道这个特殊的实例来接受和处理,还是仅处理发生在交付元素上的点击事件,而把其他事件传递给后面的轨道层。在QuickTime播放器中,对于特定的Flash轨道,这个设定可以通过新增的Flash 属性(Flash Properties)信息面板来进行调整。请看图 1-10

这个面板包含一个单独的检查框,标识为激活鼠标捕捉(Mouse Capture Enabled)。如果这个检查框被选中,则所有的鼠标点击事件都被定向到Flash轨道上(如果Flash轨道之前的轨道没有处理这些事件的话);如果这个检查框没有被选中,则Flash轨道只处理那些发生在交互元素上的点击事件。

图 1-10 Mac OS X上的QuickTime播放器中的Flash属性信息面板,激活鼠标捕捉检查框被选中

[image: images/flash_info_panel.gif]

当Flash文件被导入成为一个只有单一Flash轨道的电影时,这个轨道的鼠标捕捉选项就会被激活。如果您把这个轨道和其他轨道组合在一起,则可能需要调整一下这个设定,以便得到正确的用户体验。


控制鼠标捕捉设定

Flash轨道的鼠标捕捉设定信息存储在轨道的媒体属性原子中。

Movies.h 头文件中包含常数 kFlashTrackPropertyAcceptAllClicks ,是用来标识原子类型的。原子数据是一个布尔值,如果被设置为 TRUE 意味着接受所有的鼠标点击事件,设置为 FALSE 则意味着仅接受发生在Flash轨道的交付元素上的事件。

下面的代码片段把一个Flash轨道设置成接受所有鼠标点击事件:

QTAtomContainer trackProperties = NULL;
Boolean acceptAllClicks = true;

GetMediaPropertyAtom(flashMedia, &trackProperties);
if (trackProperties != NULL) {
QTInsertChild(trackProperties, 0,
kFlashTrackPropertyAcceptAllClicks, 1, 1,
sizeof(acceptAllClicks), &acceptAllClicks, nil);

SetMediaPropertyAtom(flashMedia, trackProperties);

QTDisposeAtomContainer(trackProperties);
}

新的QuickTime任务管理的应用程序接口

QuickTime 6 introduces a new tasking mechanism designed to improve application performance and operation.

Periodically, applications have to give time to QuickTime by calling such routines as MCIsPlayerEvent(), MCIdle(), MoviesTask(), or TaskMovie(). Typically, QuickTime developers ask the question, how often should I call a particular routine? The answer most frequently given is, 10 to 20 times per second. This works in most cases. But in many other cases, while an application is tasking QuickTime 10 or 15 times per second, half the time QuickTime does not really need to be called, and the application will just be sitting there, spinning. As a consequence, there is an inefficient use of processor time.

In QuickTime 6, a new group of APIs are provided that improve QuickTime tasking from an application’s point of view. These are

For example, where an application once did this

while (true) {
WaitNextEvent(..., &event, 2, ...); // if no event pending, return a
// null event after
// 2/60 of a second
MCIsPlayerEvent(mc, &event);
}

it can now do something like this

UInt32 t;
while (true) {

QTGetTimeUntilNextTask(&t, 60); // how long in 60ths of a second?
WaitNextEvent(..., &event, t, ...);
MCIsPlayerEvent(mc, &event);
}

QTGetTimeUntilNextTask is a new API that lets you pass in a scale??for example, 1/60 of a second or 1/1000 of a second??and returns a duration, that is, the number of 60ths or 1000ths (whatever you ask for) until the next time QuickTime needs to be called.

For example, as shown in the code snippet above, on Mac OS 9 you would call QTGetTimeUntilNextTask, passing in 60 because WaitNextEvent() wants ticks. It will tell you how many 60ths of a second until QuickTime needs to be called again. WaitNextEvent() will not return either until that amount of time has gone by, in which case it will give you a NULL event, or an event took place, in which case it will give you that event.

On Mac OS X, the recommended way to do this on a Carbon application is to use the Carbon event loop timer, as discussed in the section “New Carbon Movie Control”. This is a timer routine that you set up to be called periodically from the Carbon event loop. You set a duration for how often you want it to happen.

The following code snippet shows how you can use both QuickTime’s new tasking mechanism and the Carbon event loop timer code. It also shows how to use the new QTInstallNextTaskNeededSoonerCallback() API.

MyMovieIdlingTimer() is installed by the sample routine InstallMovieIdlingEventLoopTimer() shown in the code snippet below. This routine performs the actual work of idling the movies and/or movie controllers that the application has in use.

static void MyMovieIdlingTimer(EventLoopTimerRef inTimer, 
void *inUserData)
{
OSStatus error;
long durationInMillis;
MyStatePtr myState = (MyStatePtr)inUserData; // Application's state
// related to its list of movies

You insert the code here to idle the movies and/or movie controllers that the application has in use??for example, calls to MCIdle().

    // Ask the idling mechanism when we should fire the next time.
error = QTGetTimeUntilNextTask(&durationInMillis, 1000);
// 1000 == millisecond timescale

if (durationInMillis == 0) // When zero, pin the duration
// to our minimum
durationInMillis = kMinimumIdleDurationInMillis;

// Reschedule the event loop timer
SetEventLoopTimerNextFireTime(myState->theEventTimer,
durationInMillis *
kEventDurationMillisecond);
}

TaskNeededSoonerCallback() is installed using the new QTInstallNextTaskNeededSoonerCallback() to enable QuickTime to awaken the application in order to reschedule some idle time between calls to the event timer function.

static void TaskNeededSoonerCallback(TimeValue duration, 
unsigned long flags,
void *refcon)
{
SetEventLoopTimerNextFireTime((EventLoopTimerRef)refcon,
duration * kEventDurationMillisecond);
}

The InstallMovieIdlingEventLoopTimer() function performs the actual installation of the Carbon event loop timer function. This is called once when the first movie is opened. It also installs a TaskNeededSooner callback that the Idle Manager calls when QuickTime needs your attention.

static OSStatus InstallMovieIdlingEventLoopTimer(MyStatePtr myState)
{
OSStatus error;

Note that myState is a structure the application maintains to “remember” the event loop timer reference, as well as the list of movies or movie controllers that it will need to idle.

    error =  InstallEventLoopTimer(
GetMainEventLoop(),
0, // firedelay
kEventDurationMillisecond * kMinimumIdleDurationInMillis,
// interval
NewEventLoopTimerUPP(MyMovieIdlingTimer),
myState, // This will be passed to us when
// the timer fires
&myState->theEventTimer);

if (!error) {
// Install a callback that the Idle Manager will use when
// QuickTime needs to wake me up immediately
error = QTInstallNextTaskNeededSoonerCallback(
NewQTNextTaskNeededSoonerCallbackUPP(TaskNeededSoonerCallback),
1000, // Millisecond timescale
0, // No flags
(void*)myState->theEventTimer); // Our refcon, the
// callback will
// reschedule it
}

return error;
}

As shown in the above code snippet, when QuickTime decides that the next task is needed sooner, it will call the QTInstallNextTaskNeededSoonerCallback routine. Using that routine, you can reschedule your Carbon event loop timer. This callback proc may be called from interrupt-time or called from another thread on Mac OS X. You can call the Carbon API to reschedule the Carbon event loop timer. When you install the callback, you tell it what scale you like, and then when the callback comes, QuickTime will pass you a duration.

Often when you ask QTGetTimeUntilNextTask, it will return you a 0, which means it needs to be tasked right away. It’s not recommended that you pass a 0 into WaitNextEvent(), for example, because what will happen is that you will completely swamp the CPU. Passing in a 1 to WaitNextEvent() is a good minimum.


QTGetTimeUntilNextTask


Provides the time in specified units, until QuickTime next needs to be called.

OSErr QTGetTimeUntilNextTask (long * duration, long scale);

Parameter Descriptions
duration
A pointer to the returned time to wait before tasking QuickTime again.

scale
The requested time scale.

return value
Error code (for example, paramErr or MovieToolboxUninitialized).

Discussion

Using this routine, you pass in the scale that you’re interested in, whether it is a 60th of second (scale=60), or a 1000th of second (scale=1000). This call then returns a duration that specifies how long you can wait before tasking QuickTime again. In Mac OS X, with the Carbon event loop timer, you generally pass in 1000 and get milliseconds in return, and then schedule your Carbon event loop timer.

Introduced in QuickTime 6.

Header file Movies.h


QTInstallNextTaskNeededSoonerCallback


Installs a callback that is