引 言 R峘EI?  
@┛蔫??  
  此处介绍的QuickTime Component在原理上和拙文《Mac OS的Component技术简介》中的描述没有冲突,只是作为一种特例,加上QuickTime本身的一些特性,组织形式上有些区别,这些区别不是本质的。本文引用的实例是Apple官方网站上的示例程序:Electric Image Component。它是用于处理Electric Image(文件扩展名为EIM)的一个典型的QuickTime的Component(插件)。 扖僸p^?  
  这个例子有两大优点: a??g鳲  
  一、内容全面,包括静态图像的导入导出插件Image Importer和Image Exporter,静态图像的编解码插件Image Codec,活动图像导入导出插件Movie Importer和Movie Exporter。 ;呦cZWFF橼  
  二、提供的示例是跨平台的,通过在Windows下安装QuickTime SDK可以编译测试(一般使用VC 6.0或VC .NET),生成名为"ElectricImageWindows.qtx"的插件,供Windows下的基于QuickTime的应用程序使用。 瓡硏k呏74? 
xR?D  
第一节 Image Importer和Image Exporter 7 ??:9? 
Q晞齐黃巙G  
  在本例程中,Image Importer和与之密切配合的Image Decompressor分别对应EI_GraphicsImport和EI_ImageDecompressor两个文件夹的源程序。这两部分可以从整个插件组中剥离出来独立工作,它们完成对静态图像的读取和解码。和完整的插件包一样,在Windows下编译生成插件,在NT系统下复制到"% SystemRoot%/System32/QuickTime"子目录下,就能用QuickTime 6 for Windows播放程序(可在Apple的官方网站免费下载)[1]打开Electric Image静态图像文件。 X??i靯'? 
  需要注意的是,一般Image Importer数据导入后,是经过Decompressor绘制到显示端,这不同于导出压缩数据是直接在Image Exporter里进行。而在Decompressor中是对一个缓冲进行操作。事实上Decompressor是Still Image Codec的一个特例,在本例中,只实现了DrawBand,它正完成了上述的解码绘制的工作。而BandCompress和 BandDecompress两个request handler(一称selector)均没有实现,它们完成的是码流的压缩和解压,这样编解码工作就能方便其他Comoponent调用。 ?裈?螯晢  
  压缩数据,一般从静止图像文件中读取,由QuickTime默认的程序导入。在Image Importer中一个重要的request就是GetDataOffsetAndSize,它的handler向调用者返回图像有效数据的起始偏移和大小。它从基组件的同名request handler中得到偏移和大小,这一般分别就是文件的起始偏移(0)和文件大小,然后根据图像格式需要进行修改。而这个request不仅供一般调用者使用,在Decompressor中也将以此处指定的起始偏移规定的范围为准进行操作。Image Importer中另一个重要的request是GetImageDescription,在这个request的handler中要完成对 ImageDescription结构的生成,这在Decompressor解码中也是必须的。 ?嵶駪? 
  Decompressor解码过程主要在名为 DrawBand的request handler中进行,需要注意的是,QuickTime并不一定将全部的压缩数据都导入内存,而是只先导入指定尺寸的数据。所以数据馈送必须不断调用 API函数InvokeICMDataUPP完成,用户可以指定每次馈送数据的大小,但不能低于上述的指定尺寸。 欉?a孏刈竛  
  Image Exporter相对简单,在其中的名为DoStandaloneExport的request handler中完成主要的导出工作,包括编码,此处编码的输入和输出均完全是对已分配内存的操作。 奏- 葝钰  
,D10veq? 
第二节 Movie Importer和Movie Exporter |芙繩? 
翰 鞈L??  
  Movie Importer完成非QuickTime标准MOV规格的电影(视频或音频)数据的导入和整理。对于QuickTime标准规格的影片事实上并不需要通过Importer的支持而能直接为QuickTime所播放。QuickTime规格以Movie-Track-Media-Sample为主要层次结构的电影控制结构为核心。标准规格文件保存了这个控制结构的数据并能直接被QuickTime解析,从而不需要Importer;非标准的自定义文件格式(包括其他组织定义的如AVI、WMV、MPG、RM等)需要Importer完成解析并相应地建立上述控制结构而后递交QuickTime方能完成导入。这样对非标准文件格式,Exporter则调用QuickTime API获取源端播放音视频数据。由于它们已在QuickTime内部播放,因而显然也是以这种控制结构组织的。随后Exporter将数据根据格式需要输出,从而可形成一个非标准的电影文件,从而完成Importer的逆向工作。 J|!氘栮(J? 
  当然如选择以MAC为主要平台,更一般的需要是制作标准规格的 MOV文件。而区别于各标准MOV格式的是其内部编码方式,这也就是我们制作Component的意义所在。根据上述讨论,很显然,需要在 Exporter端承担更多的Importer端的工作即建立控制结构并落实到最终的输出中,这些也主要通过调用QuickTime API得以实现。 ?耵v  
  值得注意的是对于Exporter端的编码工作本身,QuickTime支持了编码器编码(调用Codec组件)、直接编码(Standalone方式)和可能的转码(Transcode方式,对于特定支持的导入导出组合,采用不经过解码的直接变换),可满足各种需要。本处的Electric Image Component无论是Graphics Exporter还是Movie Exporter均采用Standalone方式,所以编码工作在Exporter代码中可见。 y熦t频%  
~fy?QL? 
第三节 Media Handler ?B磵  
G?@Y岊? 
  Media Handler是一种重要的QuickTime Component,它主要涉及媒体播放时的具体操作。从前面的叙述可知,Importer并不对播放作任何处理,只是做数据的收集,所以播放过程就交给各种Media对应的Media Handler进行处理。QuickTime针对大多数媒体定义了相应的Media Handler,所以用户很少会有必要编写一个Media Handler,即所谓的Derived Media Handler。例外的情况主要有: ?%邼憱m)=  
  一、要面对一种新型的Media类型,当然,这是一种数据类型,但是必须是基于时间的(Time-based),这其实是QuickTime的处理对象的抽象定义。例如:Flash、某些有帧间相互关系的媒体类型等。 G姛?y ? 
  二、对一些特殊的传输介质的不同处理。例如某些网络协议,存储结构等,但在这种情况下首先应该改写另一种QuickTime的Component——Data Handler。 擸聭?犕? 
  三、对一个已有的默认处理不满意。例如笔者遇到的需要对数据文件进行截取的情况。 旬?气脄b? 
  Media Handler在QuickTime的架构中是出于Toolbox之下,Data Handler之上。他供ToolBox调用以实现播放,而数据访问则通过Data Handler。 I钛o</醥G  
  编写Derived Media Handler一般在Open的处理中要设置Base Media Handler,一般它的Subtype设为BaseMediaType。笔者发现对于派生Video类的Media Handler,如果选择VideoMediaType为Subtype的Handler作Base Handler,会绕开本身的处理,其原因还不明。 dV沁葼  
  Media Handler中最主要的request是Idle,它在QuickTime认为适当的时候就会调用。几乎所有的操作都是在响应这个request的函数中完成。对于处理Video的Media Handler而言,最一般的情况就是在这个函数中解码并显示(一般调用QuickDraw)规定时间位置的帧。 Px耾F悷  
  在Media Handler中可以得到大量的播放参数,所以有极大的灵活度。如播放环境,影片数据等都是透明的,甚至可以获取合适的参数,绕开Data Handler,直接用C标准函数对影片文件进行操作。 oFa乲?  
奀?h霯粖?lt;  
  (完) xJ誚╟眿怳  
v?艋?  
注释: 柹5鄹醝?? 
[1] 某些常用的通用播放器如MPC由于并不使用Windows下的QuickTime架构,而只是采用了自身的QuickTime插件播放MOV格式影片,所以它们与此处的所有讨论完全无关。 A猖D穉琀r  
錴ap]z4?

QuickTime Component实例相关推荐

  1. SAP Spartacus单元测试里Component实例的创建细节

    启动命令:ng test storefrontlib 单元测试里,使用TestBed创建Component实例的源代码: 首先在Chrome开发者工具里找到单元测试用例的实现源代码: 在_karma_ ...

  2. SAP 电商云 Spartacus UI Angular Component 动态创建的单步调试

    Jerry 之前的文章SAP 产品 UI 里的容器组件的概念和开发概述介绍过,SAP Spartacus Angular Component,通过我们开发团队自定义的指令 cxComponentWra ...

  3. 关于 Angular Component ngOnDestroy 钩子函数的调用时机

    我开发了一个 Angular Component,实现了 ngOnDestroy 钩子方法之后,没有找到其被调用的方法.查看这个StackOverflow链接后,得知无论是我刷新浏览器,还是从当前页面 ...

  4. Subject 在 SAP Spartacus Popover Component 中的应用

    Subject 是 Rxjs 里的一个工具对象. Subject 是一种特殊类型的 Observable,它允许将值多播到许多观察者. Subject 就像 EventEmitters. 每个 Sub ...

  5. SAP Spartacus 服务器端 nodejs 应用里渲染 Angular Component 的一个例子

    触发方式:将下列 url 粘贴到浏览器地址栏里,回车: http://localhost:4000/Open-Catalogue/Cameras/Hand-held-Camcorders/c/584 ...

  6. SAP Spartacus list.component.ts的listData$数据的触发逻辑

    template指Component页面,而factory指Component实例的构造函数. 下图第三行listData$ | async这个pipe触发了Observable的subscribe操 ...

  7. Angular Component class属性初始化和构造函数执行的先后顺序

    如图,该Component类第13行属性初始化逻辑,以及第17行构造函数里的断点,到底哪一行代码先执行? 在调试器里观察: 首先执行custom Component factory函数,创建Compo ...

  8. Angular5 Component通信

    Angular5是一个非常强大的前端框架,学习曲线较陡,掌握了不同模块(主要指Component)之间的通信机制,就等于掌握了Angular5.下面详尽列举各种通信方式供您参考: 一.从Compone ...

  9. android多媒体框架学习 详解

    原址 一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了! ...

  10. android多媒体框架学习 详解 最新版本

    一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现 ...

最新文章

  1. ESP32-CAM教程一:网页上显示摄像头数据
  2. jquery 源码分析九 - Sizzle
  3. c语言矩阵乘积的几,c语言矩阵相乘
  4. 大型网站架构演化(二)——应用服务和数据服务分离
  5. opencv常用函数
  6. c语言删除字符串s中与c相同的字符串,看不懂这段c语言代码的思路,目的是删除字符串1中与字符串2相同的字符...
  7. 目录遍历漏洞和文件读取漏洞的区别
  8. (转)李嘉诚:成功源于花90%时间考虑失败
  9. WCF中加密数据信息
  10. 关于我国高等数学教材的版权发财户
  11. Android聊天软件的开发(一)--预备知识
  12. 仿选股宝选个头条上下拉加载一页的功能
  13. sqlconnection pooling是什么意思_目标检测领域还有什么可做的?19 个方向
  14. OpenWrt的SR9000有线网卡驱动
  15. python hdf5_安装HDF5 1.8 和H5PY--HDF5和python接口
  16. 【api】核心业务整理
  17. dvdfab虚拟光驱使用教程
  18. MySQL数据库基本语法,数据库设计,事务,多表查询及练习题
  19. python小数乘法_运营管理案例分析:《质保主管 Hank Kolb》.docx
  20. jQuery基础学习【博学谷学习记录】超强总结,用心分享

热门文章

  1. vue中解决跨域问题
  2. 页式存储系统的逻辑地址是由页号和页内地址两部分组成的
  3. 《Neural Network and Deep Learning(神经网络与深度学习)》练习及问题详解
  4. 【基础理论】Jenkins CI/DI持续集成部署
  5. 智能RFID电动车防盗管理系统解决方案
  6. HTTP headers 详解 headers 常用属性
  7. python 单位根检验代码_Python中ADF单位根检验实现查看结果的方法
  8. 国内八家域名注册商优缺点比较(转)
  9. 陕西省计算机分数线,2019陕西省各大学录取分数线最新汇总
  10. Jmeter 使用详解、性能压测分析与性能优化思路