第四章 多媒体框架

Size: px
Start display at page:

Download "第四章 多媒体框架"

Transcription

1 多媒体框架 君子务本, 本立而道生 论语 在目前业界主流的多媒体处理框架中,Windows 通常采用的是 DirectShow, 而桌面 Linux 上的多媒体处理框架则较多, 其中最常见的为 GStearmer xine 等 在嵌入式 Linux 领域,Qtopia 平台采用的多媒体处理框架为 GStearmer Nokia 开发的 Maemo Linux 系统采用的多媒体处理框架也是 GStearmer 在 Android 中, 采用的多媒体处理框架为 OpenCORE 在 Android 2.2 后,Android 对多媒体框架进行了很大的调整, 弃用了之前的 opencore 框架, 默认改用 stagefright 框架, 仅仅对 opencore 中的 omx-component 部分做了引用 主要是为了录像和视频电话功能, 另外在混音和多摄像头支持方面也做了增强 stagefright 框架相对也比 opencore 框架更加易懂, 封装也相对简单 但 stagefright 框架推出时间不长, 支持的文件格式也不如 opencore 框架丰富 在 Android 2.2 及以前,OpenCORE 位于 external 目录下, 在 Android 2.3 以后, 多媒体的功能被放置到 frameworks/base/media 中,OpenCore 的概念被弱化 在本书中, 多媒体框架部分将主要依据 OpenCORE 进行讲解 在 OpenCORE 的 pvmf_format_type.h 文件中, 给出了 OpenCORE 目前所支持的图像 音频 视频编码类型 在 Android2.2 中, 目前内置支持的解码媒体格式包括 AAC LC/LTP HE-AACv1 (AAC+) HE-AACv2 (enhanced AAC+) AMR-NB AMR-WB MP3 MIDI Ogg Vorbis PCM/WAVE JPEG GIF PNG BMP H.263 H.26 AVC MPEG- SP 等, 部分厂商在开发的 Android 智能终端中已经提供了对 RM 的支持 内置支持的编码格式包括 AAC LC/LTP AMR-NB AMR-WB PNG JPEG H.263 等, 如果期望在产品中支持更多的媒体格式, 只需增加相应的编解码器即可

2 1 四多媒体框架 框架概述 在 Android 中, 与桌面 Linux 和 Qtopia 通常采用 GStearmer xine MPlayer 不同,Android 采用的是基于 PacketVideo 的 OpenCORE 的多媒体框架方案 由于 OpenCORE 高度的模块化, 采用 OpenCORE 作为多媒体框架有利于加速将产品推向市场 减小操作成本和资源投入 扩展编解码器 增强用户体验等 在对数据源的支持上, 除了本地文件,OpenCORE 还对内容目录 流媒体 OTA (Over-the-Air) 下载 DRM 等提供了支持 目前 OpenCORE 已经应用于 170 多款移动终端中 2009 年 2 月发布的 OpenCORE 2.0 已经提供了对基于 3G-32M 协议的视频电话的支持, 同时在多媒体硬件加速方面进行了优化 需要说明的是,OpenCORE 遵循 OpenMAX 的接口规范, 本质上是 OpenMAX 的一种实现 关于 OpenCORE 在 Android 中的编译, 以及如何编译测试项请参考 android\ external\opencore\ Android.mk 和 android\external\opencore\quick_start.txt 文件 OpenMAX 接口规范 OpenMAX 是 NVIDIA 和 Khronos 在 2006 年制定的多媒体处理框架规范, 同时 Khronos 制定的标准 / 规范还有 OpenGL OpenGL ES OpenVG OpenEL 等 OpenGL ES 在 Android 中作为 3D 渲染引擎使用 OpenMAX 是一个无须授权费的 跨平台的应用程序接口规范, 该规范针对嵌入式设备 移动设备的多媒体软件架构 在 OpenMAX 架构中, 为多媒体的编解码器和数据处理定义了一套统一的集成接口 (OpenMAX IL), 通过对底层硬件的多媒体数据的处理功能进行系统级抽象, 为用户屏蔽了底层的细节 因此, 多媒体应用程序和多媒体框架通过 OpenMAX IL 可以以一种统一的方式来使用编解码器和其他多媒体数据处理功能, 这使得 OpenMAX 拥有跨平台的能力 OpenMAX 的框架如图 -1 所示 图 -1 OpenMAX 框架 107

3 Android 多媒体编程从初学到精通 下面简要介绍 OpenMAX 的 OpenMAX AL OpenMAX IL OpenMAX DL 实现 关于更 详细的说明请参见 android\external\opencore\doc 目录下的文档.2.1 OpenMAX AL 应用层 OpenMAX AL(Appliction Layer)API 在应用程序和 OpenMAX IL 之间提供了一个标准化接口,OpenMAX IL 提供服务以实现被期待的 API 功能 使得应用在多媒体接口上具有了可移植性 OpenMAX AL 包括引擎对象 (Engine Object) 媒体对象(Media Object) 元数据提取器对象 (Metadata Extractor Object) 音频输出混音器对象(Audio Output Mix Objects) 照相机对象 (Camera Objects) LED 阵列对象 (LED Array Objects) FM 对象 (Radio Objects) 振动控制对象 (Vibration Control Objects) 等 在 Android 中, 并没有提供多少关于 OpenMAX AL 的内容, 这里就不再详述了,OpenMAX AL 的头文件位于 external\opencore\extern_libs_v2\khronos\openmax\include 目录下 关于 OpenMAX AL 的更多内容, 请参考文献 [35] 为了实现封装的编解码器给上层提供一个标准化的接口, 在 Android 中, 提供了 AuthorDriver 作为记录引擎和上层应用的接口,PlayerDriver 作为播放引擎与上层应用的接口.2.2 OpenMAX IL 集成层 OpenMAX IL(Integration Layer) 作为在嵌入式和移动设备中使用的音频 视频 图像等编解码器的底层接口 使得应用和多媒体框架可以以统一的方式访问多媒体编解码器和支持组件 编解码器可以是硬件和软件的任意组合, 对用户透明 为了把一个编解码器集成到 OpenCORE 多媒体框架中, 有多种途径, 可以将编解码器封装成一个媒体 I/O 的组件, 也可以封装成一个 OpenCORE 的节点, 或者作为 OpenMAX 的组件被集成到 OpenMAX 的编解码器节点中 对于包含了硬件加速的编解码器而言, 通常会被封装为 OpenMAX 的组件出现 这就要求其必须遵守 OpenMAX IL 的接口规范 OpenMAX IL 的接口 OpenMax Core 在 OMX_Core.h 中定义 OpenMAX 的组件在 OMX_Component.h 中定义 OpenMAX 的组件框架如图 -2 所示 OmxAmrEncoder OmxComponentAmrEncoderAO OpenmaxAacAO OmxAacDecoder OmxAmrDecoder OpenmaxAmrAO OmxComponentAudio AvcEncoder_OMX OmxComponentBase OmxComponentAvcEncAO AvcDecoder_OMX Mp3Decoder OpenmaxMp3AO OmxComponentVideo OpenmaxAvcAO MpegDecoder_OMX OpenmaxMpegAO OmxComponentMpegEncAO MpegEncoder_OMX 108

4 图 -2 多媒体组件框架 四多媒体框架 在 OpenMAX IL 的接口规范中, 有些接口是厂商必须提供的, 必须提供的方法如下 : 1)OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void); 2)OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void); 3)OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle( ); )OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle( ); 5)OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(...); 6)OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent ( ); 7)OMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole ( ); 8)OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel( ); 9)OMX_API OMX_ERRORTYPE OMX_GetContentPipe( ); 除以上方法必须实现外, 为了使 OpenCORE 能够获悉 OpenMAX Core 的配置信息, OMXConfigParser() 被强烈推荐实现 OMXConfigParser() 的定义位于 pv_omx_config_parser.h 文件中 在 OpenCORE 中, 关于 OpenMAX Core 的实现位于 pv_omxcore.cpp 文件中 考虑在实际开发中, 可能存在由多个厂商开发的 OpenMAX Core 实现的可能, 为了避免造成静态编译时的链接问题, 厂商在实现 OpenMAX Core 时, 应考虑增加一个简单的封装层 以封装 OpenMAX Core 的标准接口 如在 OpenCORE 中,OMX_Init() 接口的实现为 : OSCL_EXPORT_REF OMX_ERRORTYPE OMX_MasterInit() return OMX_Init(); // OMX_Init() 的具体实现位于同文件中 在 OpenCORE 中, 为上层提供的封装接口为 OMXInterface 由于采用的是动态加载的方法, 考虑到可能存在多家厂商的 OpenMAX Core 情况,OpenMAX Core 必须以动态库的方式出现 在 OpenCORE 中, 提供了两种编译模式 一种编译模式是封装器和 OpenMAX Core 共享库分别编译 在 OpenMAX Core 动态库中并不包含封装器 该编译模式的实现位于 OpenCORE\codecs_v2\omx\ omx_core_ plugins\template\src\pv_omx_interface.cpp 中 在 PVOMXInterface 类的构造函数中, 利用 dlopen() 函数以 RTLD_NOW 模式打开 OpenMAX Core 共享库 为 OpenMAX IL 接口利用 dlsym() 函数查找对应的符号进行赋值 具体实现为 : 代码 -1 封装器和共享库分别编译 #ifndef OMX_CORE_LIBRARY #define OMX_CORE_LIBRARY "libomxcore.so" #endif class PVOMXInterface : public OMXInterface public: private: PVOMXInterface() iphandle=dlopen(omx_core_library, RTLD_NOW);// 打开共享库 if (NULL==ipHandle) 109

5 Android 多媒体编程从初学到精通 pomx_init=null; pomx_deinit=null; pomx_componentnameenum=null; pomx_gethandle=null; pomx_freehandle=null; pomx_getcomponentsofrole=null; pomx_getrolesofcomponent=null; pomx_setuptunnel=null; pomx_getcontentpipe=null; pomxconfigparser=null; const char* perr=dlerror(); if (NULL==pErr) else else // 加载 OMX core 符号 pomx_init=(tpomx_init)dlsym(iphandle, "OMX_Init"); pomx_deinit=(tpomx_deinit)dlsym(iphandle, "OMX_Deinit"); pomx_componentnameenum=(tpomx_componentnameenum)dlsym(iphandle, "OMX_ComponentNameEnum"); pomx_gethandle=(tpomx_gethandle)dlsym(iphandle, "OMX_GetHandle"); pomx_freehandle=(tpomx_freehandle)dlsym(iphandle, "OMX_FreeHandle"); pomx_getcomponentsofrole=(tpomx_getcomponentsofrole)dlsym(iphandle, "OMX_GetComponentsOfRole"); pomx_getrolesofcomponent=(tpomx_getrolesofcomponent)dlsym(iphandle, "OMX_GetRolesOfComponent"); pomx_setuptunnel=(tpomx_setuptunnel)dlsym(iphandle, "OMX_SetupTunnel"); pomx_getcontentpipe=(tpomx_getcontentpipe)dlsym(iphandle, "OMX_GetContentPipe"); pomxconfigparser=(tpomxconfigparser)dlsym(iphandle, "OMXConfigParser"); ; 另一种编译模式是封装器和 OpenMAX Core 共享库同时编译 在 OpenMAX Core 动态库中包含封装器 该编译模式的实现位于 OpenCORE\codecs_v2\omx\ omx_ sharedlibrary\interface\src\ pv_omx_interface.cpp 中 在该编译模式下, 只能同时编译一个 OpenMAX Core 动态库 具体实现为 : 代码 -2 封装器和共享库同时编译 class PVOMXInterface : public OMXInterface 110

6 public: private: PVOMXInterface() // 直接赋值 pomx_init=omx_init; pomx_deinit=omx_deinit; pomx_componentnameenum=omx_componentnameenum; pomx_gethandle=omx_gethandle; pomx_freehandle=omx_freehandle; pomx_getcomponentsofrole=omx_getcomponentsofrole; pomx_getrolesofcomponent=omx_getrolesofcomponent; pomx_setuptunnel=omx_setuptunnel; pomx_getcontentpipe=omx_getcontentpipe; pomxconfigparser=omxconfigparser; ; ; 四多媒体框架 需要注意的是, 不管是何种编译模式, 实现上均采用了单子模式 (Singleton Pattern) 的设计方法 在运行期间,PVOMXInterface 仅有唯一对象出现 为了使集成的编解码器能够在系统中运行, 必须对编解码器进行注册, 在 OpenCORE 中, 已经提供了 AVC MV(Apple 公司开发 ) H.263 WMA AAC AMR MP3 WMA RV RA 等格式的解码器, 提供了 AVC MV H.263 AMR AAC 等格式的编码器 在 OpenMAX IL 层中, 编解码器均是在 Open Core 的 OMX_Init() 函数中进行注册的, 该函数的实现位于 external\opencore\codecs_v2\omx\omx_common\src\pv_omxcore.cpp 文件中, 而编解码器的注册函数则位于 external\opencore\codecs_v2\omx\omx_common\src\ pv_omxregistry.cpp 文件中 编解码器注册的信息位于 ComponentRegistrationType 的对象中, ComponentRegistrationType 的定义如下 : 代码 -3 ComponentRegistrationType class ComponentRegistrationType public: OMX_STRING ComponentName; // 组件名 OMX_STRING RoleString[MAX_ROLES_SUPPORTED]; OMX_U32 NumberOfRolesSupported; // 角色数量 OMX_ERRORTYPE(*FunctionPtrCreateComponent)(OMX_OUT OMX_HANDLETYPE* phandle, OMX_IN OMX_PTR pappdata, OMX_PTR pproxy,omx_string aomxlibname,omx_ptr &aomxlib, OMX_PTR aoscluuid, OMX_U32 &arefcount);// 创建组件 OMX_ERRORTYPE(*FunctionPtrDestroyComponent)(OMX_IN OMX_HANDLETYPE phandle, OMX_PTR &aomxlib, OMX_PTR aoscluuid, OMX_U32 &arefcount);// 销毁组件 void GetRolesOfComponent(OMX_STRING* arole_string) for (OMX_U32 ii=0; ii<numberofrolessupported; ii++) arole_string[ii]=rolestring[ii]; 111

7 Android 多媒体编程从初学到精通 // 用于动态加载 OMX_STRING SharedLibraryName; // 共享库名 OMX_PTR SharedLibraryPtr; // 共享库指针 OMX_PTR SharedLibraryOsclUuid; // 共享库 UUID OMX_U32 SharedLibraryRefCounter; // 共享库引用计数 ; 为了进行注册, 首先需要创建一个 ComponentRegistrationType 对象, 对其成员进行赋值, 然后将其添加到 OMXGlobalDatad 的 ipregtemplatelist[max_supported_components] 成员中 需要说明的是, 在组件库中的每个组件均有唯一的一个 UUID 来标识, 以 MP3 解码器为例的注册过程如下 : 代码 - MP3Register OMX_ERRORTYPE Mp3Register(OMXGlobalData *data) OMX_S32 ii; ComponentRegistrationType *pcrt=(componentregistrationtype *) oscl_malloc(sizeof (ComponentRegistrationType)); if (pcrt) pcrt->componentname=(omx_string)"omx.pv.mp3dec"; // 组件名 pcrt->rolestring[0]=(omx_string)"audio_decoder.mp3"; // 角色名 pcrt->numberofrolessupported=1; // 角色数量 pcrt->sharedlibraryoscluuid=null; #if USE_DYNAMIC_LOAD_OMX_COMPONENTS // 构造组件 pcrt->functionptrcreatecomponent=&omxcomponentfactorydynamiccreate; // 析构组件 pcrt->functionptrdestroycomponent=&omxcomponentfactorydynamicdestructor; // 共享库名 pcrt->sharedlibraryname=(omx_string)"libomx_mp3dec_sharedlibrary"; pcrt->sharedlibraryptr=null; //UUID OsclUuid *temp=(oscluuid *) oscl_malloc(sizeof(oscluuid)); if (temp==null) // 释放已分配内存 oscl_free(pcrt); return OMX_ErrorInsufficientResources; OSCL_PLACEMENT_NEW(temp, PV_OMX_MP3DEC_UUID); pcrt->sharedlibraryoscluuid=(omx_ptr) temp; pcrt->sharedlibraryrefcounter=0; #endif #if REGISTER_OMX_MP3_COMPONENT #if (DYNAMIC_LOAD_OMX_MP3_COMPONENT==0) pcrt->functionptrcreatecomponent=&mp3omxcomponentfactory; pcrt->functionptrdestroycomponent=&mp3omxcomponentdestructor; 112

8 pcrt->sharedlibraryname=null; pcrt->sharedlibraryptr=null; if (pcrt->sharedlibraryoscluuid) oscl_free(pcrt->sharedlibraryoscluuid); pcrt->sharedlibraryoscluuid=null; pcrt->sharedlibraryrefcounter=0; #endif #endif else return OMX_ErrorInsufficientResources; for (ii=0; ii<max_supported_components; ii++) // 注册组件 if (NULL==data->ipRegTemplateList[ii]) data->ipregtemplatelist[ii]=pcrt; break; if (MAX_SUPPORTED_COMPONENTS==ii) return OMX_ErrorInsufficientResources; return OMX_ErrorNone; 四多媒体框架 每一个编解码器在 OpenMAX 中都对应唯一的一个 UUID 标识符 这些 UUID 标识符定义位于 pv_omxcore.h 文件中.2.3 OpenMAX DL 开发层 OpenMAX DL(Development Layer) 定义了一套 API, 包含了音频 视频和图像功能的函数集合, 这些函数需要由芯片厂商针对处理器特性进行实现和优化, 然后被编解码器厂商在各种编解码器上使用 OpenMAX DL 涵盖了音频信号的处理功能, 如 FFT 过滤器等; 图像处理功能, 如颜色空间转换等 ; 视频处理功能, 如 MPEG- H.26 MP3 AAC 和 JPEG 等编解码器的优化 OpenMAX 通过 idl 和 adl 来支持加速, idl 使用 OpenMAX IL 结构, adl 向 Open MAX DL API 增加了异步接口 由于 OpenMAX DL 涉及太多的硬件细节, 这里就不再介绍了 OpenCORE 框架 113

9 Android 多媒体编程从初学到精通 OpenCORE 的实现是基于 C++ 语言的, 要求平台必须支持 C++ 模板, 但并非所有的 C++ 标准 ( 如运行时类型识别 (RTTI,Run Time Type Indication)) 都要求平台支持 根据层次划分,OpenCORE 主要分为内容策略管理 (Content Pollcy Manager) 多媒体引擎 (MultiMedia Engines) 数据格式解析器(Data Formats Parser) 视频编解码器(Video Codecs) 音频编解码器(Audio Codecs) 操作系统兼容库(OSCL, Operating System Compatibility Library) 等几个部分 OpenCORE 的框架如图 -3 所示 图 -3 OpenCORE 框架 其中, 内容策略管理允许移动终端支持多种商业模型和商业规则 多媒体引擎分为两个部分 :PVPlayer 和 PVAuthor 其中,PVPlayer 提供媒体播放器的功能, 完成各种音频 视频流的回放 (Playback) 功能 ;PVAuthor 提供媒体流记录的功能, 完成各种音频 (Audio) 视频(Video) 流的功能及静态图像捕获功能 数据格式解析器则负责文件格式的解析 视频编解码器 音频编解码器则完成压缩流和元数据流之间的转换 目前 OpenCORE 已经能够支持全部的主流音 视频格式 音频格式有 AAC AMR MP3 WAV 等, 视频格式有 3GP MP JPG 等 为了更好地在不同操作系统提供可移植性 OSCL 包含了基本数据类型 配置 字符串工具 输入 / 输出 错误处理 线程等内容, 类似一个基础的 C++ 库 相对其他模块而言,OpenCORE 的代码量非常庞大,OpenCORE 基于 C++ 实现, 定义了全功能的操作系统移植层, 各种基本功能均被封装成类的形式, 各层次之间的接口多使用继承等方式.3.1 内容策略管理 11

10 四多媒体框架内容策略管理 (CPM,Content Policy Manager) 作为公共框架的子系统, 一般用于确立控制和实施内容的若干规则 最常见的策略管理即数字版权管理 (DRM,Digital Rights Management), 由于 DRM 规则的多样性, 在 CPM 中, 并不侧重于具体算法或协议的直接实现, 而是提供了一个灵活的框架, 为实现这些算法或协议的插件提供开发接口和注册接口 利用 CPM 提供的鉴权 授权 接入接口,CPM 提供了接入被 CPM 保护内容的方法 除了 DRM 以外,CPM 还支持其他策略, 如根据等级或者用户配置限制内容的接入等 在 Android 中, 目前提供了对 DRM 1.0 和 DRM 2.0 的原生实现, 但仅对 DR,M 1.0 提供了 Java 层的接口, 而且 DRM 2.0 的代码在 Android 2.3 中被移除,DRM 的代码主要集中在 frameworks/base/drm 和 frameworks/base/media, 在本书中主要介绍 DRM 的内容 DRM 是保护音频 视频 文档等数字内容版权的一种加密技术 利用 DRM 保护数字内容版权, 首先要建立数字内容授权中心, 编码压缩后的数字内容, 同时利用密钥的公钥对数字内容进行加密保护, 加密的数字内容头部存有密钥 ID 和数字内容授权中心的 URL 用户浏览或者点播时, 根据数字内容头部的密钥 ID 和 URL 信息, 通过数字内容授权中心验证授权后送出的相关私钥进行解密, 用户就可以浏览或播放了 DRM1.0 的制定工作开始于 2002 年 200 年 6 月,OMA 正式发布了 DRM 1.0 版本, 除了 OMA DRM 外, 业界比较主流的 DRM 架构还有 Windows Media DRM 但 DRM 架构基本相同 DRM 1.0 没有涉及很强的保护, 主要制定了 种分发方式 : 转发锁定 (Forward Lock) 组合分发 (Combined Delivery) 分组分发 (Separate Delivery) 超级分发(Super distribution) 在具体的实现上, 分发类型定义位于 frameworks/base/media/java/android/drm/mobile1/ DrmRawContent.java 中 包括四种 :DRM_FORWARD_LOCK DRM_COMBINED_ DELIVERY DRM_SEPARATE_DELIVERY DRM_SEPARATE_DELIVERY_DM 其中 DRM_SEPARATE_DELIVERY_DM 是指在 DRM 消息中分组分发 DRM 的 MIME 类型在 Android 中, 主要包括四种 :DRM_MIMETYPE_RIGHTS_XML (application/vnd.oma.drm.rights+xml) DRM_MIMETYPE_RIGHTS_WBXML(application/vnd. oma.drm.rights+wbxml) DRM_MIMETYPE_MESSAGE(application/vnd.oma.drm.message) 在 Android 中, 在 DrmStore.java 中对转发锁定提供了一个内容提供器, 其受 "android.permission.access_drm" 权限保护 每打开一个 DRM 对象, 就将创建一个会话 (Session ), 原生层的接口位于 frameworks/base/media/libdrm/mobile1/include/objmng/svc_drm.h 中, 在 Java 层中, 对版权对象和 DRM 消息做了封装, 主要 Java 类的作用如下 : DrmConstraintInfo 类提供了 DRM 约束的接口, 如开始日期 结束日期 使用次数等 DrmRights.java 提供了接入 DRM 版权对象的接口 DrmRightsManager 类提供了接入 DRM 版权管理器的接口 允许安装 查询 删除版权对象 DrmRawContent 类提供了接入 DRM 原始内容的接口 能够获取分发的类型和内容的类型等 而 DrmInputStream 类则提供了经解密后的媒体对象内容的接口 115

11 Android 多媒体编程从初学到精通 在 DRM 服务器方面, 除了商业解决方案外, 开源的 openipmp 也是个不错的选择, 其基于 JBoss 应用服务器和 Mysql 数据库, 能够在 Windows 和 Linux 下实现 遗憾的是 openipmp 在 2006 年后已经不再有人维护 但考虑到 DRM 的重要性, 在本节中将稍加介绍 另外, 在 Android 3.0 中,Google 还引入了新的 DRM 框架 在转发锁定方式中, 移动终端禁止转发 DRM 消息 (DRM 消息是将媒体对象打包后生成的文件, 但未加密, 明文存储 ), 但必须支持 DRM 消息文件格式解析 如果移动终端接收到一个包含版权对象 (Drm Rights) 的 DRM 消息 ( 在组合分发方式中, 处理的对象是包含版权对象的 DRM 消息 ), 则需要在提示用户后, 将该 DRM 消息抛弃 移动终端可以播放媒体对象, 但不能对其修改 支持组合分发方式的移动终端必须支持转发锁定方式 在该方式中, 移动终端根据版权对象来播放媒体对象, 版权对象和媒体对象被封装在同一个 DRM 消息中, 在拆包后, 允许用户丢弃媒体对象, 但必须永久保存版权对象 移动终端不得将组合分发方式中的媒体对象转发 支持分组分发方式的移动终端必须支持组合分发和转发锁定 分组分发方式将媒体对象打包成 DCF(DRM Content Format) 格式, 使用对称密钥加密,DCF 文件通过 OMA 下载方式下载到移动终端上, 版权对象则通过其他方式 ( 如 WAP 推送等 ) 发送 在分组发送中, 允许 DCF 文件转发, 但版权对象不允许转发 接收到 DCF 文件的其他终端需要从版权引发器 (Right Issuer) 上获取版权对象 如图 - 所示为通过短信推送的方式, 将版权对象发送给移动终端 媒体对象 HTTP 服务器 HTTP 移动终端 应用服务器 版权对象 推送引发器 推送 OTA 协议 推送接入协议 推送代理网关 图 - OMA DRM 1.0 分组分发 根据分组分发,OMA DRM1.0 还提出了超级分发的概念, 允许在多个移动终端之间传递 DCF 文件, 但不能传递版权对象 当未包含版权对象的移动终端接收到 DCF 文件后, 会根据文件中的定义, 访问对应的版权对象服务器, 提示用户购买相应的版权对象并下载 图 -5 显示了 OMA DRM 1.0 进行超级分发过程 2005 年 6 月 1 日,OMA 发布了最新的 OMA DRM V2.0, 制定了基于 PKI 的安全信任模型, 给出了移动 DRM 的功能体系结构 权利描述语言标准 DRM 数字内容格式 (DCF) 和权利获取协议 ( ROAP) 等 OMA DRM V2.0 包括终端 DRM 代理 内容中心 (Content Issuer) 授权中心 (Rights Issuer) 用户和移动存储设备等外置存储设备(Off-device Storage) 116

12 四多媒体框架 图 -5 OMA DRM 1.0 超级分发 在 OMA DRM V2.0 中, 用户能够通过超级分发等各种方式获得受保护的数字内容, 数字内容使用权利需要通过 ROAP 协议获取, 使用权利与一个或者一组 DRM 代理绑定, 数字内容的使用受到严格的控制 但是由于 DRM 的局限性, 存在着操作麻烦和保护漏洞等问题,DRM 日益受到业界和消费者的质疑, 全球四大唱片公司的百代唱片 (EMI,The Electric and Musical Industries Ltd) 维旺迪环球唱片公司 (UMG,Universal Music Group) 华纳音乐集团(WMG,Warner Music Group) 索尼贝塔斯曼(SONY&BMG Music Entertainment) 先后在 2007 年初到 2008 年初宣布开始提供不带数字版权保护的音乐唱片 Apple 公司在 2009 年早些时候就宣布, 所有通过 itunes 商店售出的音乐都将无 DRM 限制, 也许在不久的将来 DRM 将会在数字出版领域消亡 1.DRM 管理在 CPM 中, 按照 DRM 加密策略的不同, 目前支持两种类型的 DRM: 封装式 DRM (Wrapped DRM) 和嵌入式 DRM(Embedded DRM) 其中封装式 DRM 适用于 OMA DRM 1.0, 嵌入式 DRM 适用于 OMA DRM 2.0 在封装式 DRM 中, 媒体对象的所有数据被封装在一个统一的加密层中, 这有助于 DRM 在更高层次 ( 文件解析器 ) 上去处理数据 但缺点也很明显, 封装式 DRM 不适用于流媒体对象, 对媒体对象的所有数据进行加密层封装是不现实的 而嵌入式 DRM 适应了流媒体数据的特点, 能够支持 OMA DRM 2.0 规范 OMA DRM 2.0 提供的保护机制包括本地回放 累进下载 流播放等 OMA DRM 2.0 基于 ISO BaseMedia 文件格式来保护媒体内容, 该文件格式定义了一个本身为明文的容器来存储 DRM 信息和相应的加密数据 这使上层应用可以不依赖 DRM 代理就能解析该文件的部分内容, 但如果期望解密数据则必须有文件格式解析器的参与 封装式 DRM 和嵌入式 DRM 在 DRM 代理和上层应用间的交互过程有所不同 在封装式 DRM 中, 上层应用不需要从 DRM 容器文件中为 DRM 代理提取 DRM 信息, 封装式 DRM 117

13 Android 多媒体编程从初学到精通 的控制交互过程如图 -6 所示 图 -6 封装式 DRM 的控制交互过程 嵌入式 DRM 需要从 DRM 容器文件中为 DRM 代理提取 DRM 信息, 嵌入式 DRM 的控制交 互过程如图 -7 所示 DRM 代理 DRM 信息 上层应用 版权信息 图 -7 嵌入式 DRM 的控制交互过程 在封装式 DRM 中当对媒体对象的回放所涉及的内容进行读取或者查找时, 媒体内容被 封装在一个统一的加密层上, 明文数据的接入依赖常集成于底层 I/O 文件接口的 DRM 代理, 但数据对上层是透明的 封装式 DRM 的数据交互过程如图 -8 所示 图 -8 封装式 DRM 的数据交互过程 对于嵌入式 DRM, 文件被部分加密, 这就要求上层应用必须自己了解文件格式, 并必 须直接和 DRM 代理通信以获得明文内容 嵌入式 DRM 的数据交互过程如图 -9 所示 图 -9 嵌入式 DRM 的数据交互过程 为了完成媒体内容的接入, 在 CPM 中, 大致需要经过如下过程 : 请求 DRM 资源 打开会话 注册内容句柄 获取内容类型 执行操作 ( 播放 暂停等 ) 执行内容接入 操作结束 关闭会话 释放 DRM 资源 如图 -10 所示为播放器引擎和 CPM 基于封装式 DRM 的 MP 操作的交互过程 在播放器引擎收到 NodeCommandCompleted() 消息后,MP 文件开始执行播放等操作, 当播放停止 118

14 或者结束时,CPM 会收到上层发来的 UsageComplete() 消息 四多媒体框架 PVPlayerEngine PVMFMPFFParserNode PVMFCPM PVMFCPMPlugin 1 : InitCPM() 5 : OpenCPMSession() 2 : Init() : CPMCommandCompleted() 6 : OpenSession() 3 : CreateCPMPlugin() 7 : AuthenticateUser() 8 : CPMPluginCommandCompleted() 9 : CPMCommandCompleted() 10 : RegisterContent() 11 : SetSourceInitializationData() 1 : CPMCommandCompleted() 15 : QueryInterface() 12 : QueryInterfaceSync() 13 : CPMPluginCommandCompleted() 16 : CPMCommandCompleted() 17 : GetCPMContentType() 19 : QueryInterface() 18 : GetCPMContentType() 20 : GetContentAccessFactory() 25 : NodeCommandCompleted() 21 : ApproveUsage() 2 : CPMCommandCompleted() 22 : AuthorizeUsage() 23 : CPMPluginCommandCompleted() 26 : SendUsageComplete() 27 : UsageComplete() 28 : UsageComplete() 30 : CPMCommandCompleted() 29 : NodeCommandCompleted() 31 : CloseCPMSession() 32 : CloseSession() 33 : CPMCommandCompleted() 3 : ResetCPM() 35 : Reset() 36 : Reset() 37 : CPMPluginCommandCompleted() 38 : CPMCommandCompleted() 39 : NodeCommandCompleted() 图 -10 封装式 DRM 的操作交互过程 对于嵌入式 DRM 而言,PVMFCPM::ApproveUsage() 可能会被反复调用, 用于 DRM 授权 2.CPM 插件机制 119

15 Android 多媒体编程从初学到精通 内容策略管理器的作用就是整合一系列与内容管理相关的服务, 并提供统一的接口供上层应用调用, 这些服务如 DRM 内容接入 起始控制 (Parental Control) 等均是作为 CPM 插件出现的 根据多媒体的特性,CPM 为 CPM 插件设计了一系列的规则, 这些规则主要分为 3 类 : 用户鉴权 操作授权 ( 对播放 暂停 快进 快退 复制 保存等进行授权 ) 内容接入 ( 提供打开 阅读 查找等媒体对象的操作 ) 在实现完 CPM 插件后, 为了使 CPM 插件能够在 OpenCORE 框架内可用, 必须首先完成 CPM 插件在 OSCL 组件工厂 (OsclComponentFactory) 的注册 在进行 CPM 插件注册时, 其 MIME 类型标识符必须以 X-CPM-PLUGIN 作为起始字符,CPM 插件的注册过程如下 : 代码 -5 RegisterPlugin OSCL_EXPORT_REF PVMFStatus PVMFCPMPluginFactoryRegistryClient::RegisterPlugin (OSCL_String& amimetype, PVMFCPMPluginFactory& afactory) if (!iclient) return PVMFErrInvalidState; // 确保它是一个有效的 CPM-plugin 的 MIME 字符串 OSCL_HeapString<OsclMemAllocator> cpmregid(pvmf_mime_cpm_plugin); if (amimetype.get_size()>=cpmregid.get_size() && oscl_cistrncmp(cpmregid.get_cstr(), amimetype.get_cstr(), cpmregid.get_size())==0 && (amimetype.get_cstr()[cpmregid.get_size()] == / amimetype.get_cstr()[cpmregid.get_size()] == \0 )) switch (iclient->register(amimetype, (OsclComponentFactory)&aFactory)) case OsclErrNone: return PVMFSuccess; case OsclErrAlreadyExists: return PVMFErrAlreadyExists; case OsclErrNoMemory: return PVMFErrNoMemory; default: return PVMFFailure; else return PVMFErrArgument; 在 CPM 中, 内容是无法直接接入的, 必须通过相应的接口来进行, 如为了获得数据流的内容接入, 必须获得一个相应的 PVMIDataStreamSyncInterface 接口 为了获得内容的描述符信息, 必须获得一个相应的 PVMFCPMPluginAccessUnitDecryptionInterface 接口等 图 -11 显示了内容的接入过程 120

16 PVMFMPFFParserNode PVMFCPMPluginAccessInterfaceFactory PVMIDataStreamSyncInterface PVMFCPMPluginAccessUnitDecryptionInterface 1 : CreatePVMFCPMPluginAccessInterface() 四多媒体框架 2 : Data Stream Pointer 3 : CreatePVMFCPMPluginAccessInterface() : Decryption Interface Pointer 5 : OpenSession() 6 : Session 7 : QueryRandomAccessCapability() 8 : Random Access Capability 9 : Read() 10 : Requested Data 11 : DecryptAccessUnit() 12 : Decrypted Data 13 : Seek() 1 : Data Stream Status 15 : Read() 16 : Requested Data 17 : DecryptAccessUnit() 18 : Decrypted Data 19 : CloseSession() 图 -11 CPM 内容的接入过程 在 OpenCORE 中, 给出了一个 OMA DRM 1.0 规格的 CPM 插件的参考实现 目录为 external\opencore\pvmi\content_policy_manager\plugins\oma1 在目前的实现中,CPM 支持的解析器节点包括 PVMFAMRFFParserNode PVMFAACFFParserNode PVMFMP3FFParserNode PVMFWAVFFParserNode PVMFMP FFParserNode PVMFDownloadManagerNode 等 图 -12 显示了 CPM 的主要类图 PVMFAACFFParserNode PVMFMP3FFParserNode PVMFCPMFactory PVMFCPMStatusObserver PvmiDataStreamObserver PVMFAMRFFParserNode PVMFCPM PVMFMPFFParserNode PVMIDatastreamuserInterface PVMFCPMImpl PVMFCPMPluginFactoryRegistryClient CPMContentUsageContext PVMFCPMPluginCmdStatusObserver PVMFCPMPluginFactory PVMFCPMPluginSession CPMPluginRegistryFactory PVMFCPMPluginInterface CPMPluginContainer CPMPluginRegistry 图 -12 CPM 主要类图 3.OpenIPMP 服务器搭建 121

17 Android 多媒体编程从初学到精通 OpenIPMP 服务器基于 Java 实现, 能够支持 Windows 和 Linux 平台, 其和 DRM 客户端的通信机制基于消息系统 在 OpenIPMP 服务器上, 事实上定义了两种消息系统 :OpenIPMP 消息系统和 OMA 消息系统, 对于通用的 DRM 客户端而言, 基于 OMA 消息系统和 OpenIPMP 服务器进行通信是个现实的选择 需要注意的是, 基于 OMA 消息系统尚无法基于 Web 进行, 目前提供的通信方式为 Web 服务 由于 OpenIPMP 在 2006 年后已经多年没有更新, 和当前的操作系统和编译器会存在着兼容性问题, 如果开发者搭建的是单一的 DRM 服务器, 建议考虑较老版本的操作系统以减少移植的工作量 而通常情况下,DRM 服务器需要和其他服务器协调工作, 在本书中, 将基于的操作系统为 Ubuntu 10.0 LTS 进行简要介绍 OpenIPMP 服务器的搭建需要 My SQL Server 5.1 JBoss.2.3 GA 和 Open JDK 6( 推荐的 JDK 1. 事实上存在兼容性问题 ) 等开发工具 下面开始介绍基于 localhost 的 OpenIPMP 服务器的搭建过程, 如果希望更改 OpenIPMP 的配置, 修改 OMADRMWS/server_config.xml 和 osms/serverconfigdata.xml 配置文件即可 通过 Ubuntu 10.0 LTS 的新立德软件管理器即可顺利安装 My SQL Server 5.1 和 Open JDK 6, 然后从 上下载 openipmp_v202.zip, 从 JBoss 官网上下载 JBoss.2.3 GA 将 OpenIPMP 和 JBoss 解压到 /usr 目录下 然后在 /etc/environment 中添加 JBOSS_HOME 环境变量设置为 /usr/jboss-.2.3.ga 接着开始 OpenIPMP 服务器的编译 : #cd /usr/openipmp2/src/server #chmod a+x install.sh #./install.sh 在编译过程中, 会出现一些简单的语法错误, 根据日志提示, 修改错误, 即可顺利完成服务器的编译 在服务器编译完成后,OpenIPMP 会根据系统配置的 JBOSS_HOME 环境变量, 将 OpenIPMP 的输出文件安装到 JBoss 的 /usr/jboss-.2.3.ga /server/default 目录下 接下来需要启动 JBoss 服务器 : #cd /usr/jboss-.2.3.ga/bin #chmod a+x run.sh #./run.sh 完成 JBoss 服务器的启动后, 即可在浏览器中登录 OpenIPMP 服务器了, 地址为 上述工作一切正确的话, 在浏览器中会出现的界面如图 -13 所示 图 -13 OpenIPMP 的注册界面 122

18 四多媒体框架接着要开始的是进行用户的注册过程 在进行注册前, 需要将 OpenIPMP 中的 server.p12 文件拷贝一份到 /usr/jboss-.2.3.ga /conf 中 否则无法完成注册过程 在注册完成后,OpenIPMP 服务器会为相应的用户名如 miaozl 生成一份 P12 文件如 miaozl.p12 需注意保存哟 为了对不同的多媒体格式进行 DRM 保护, 需要为 OpenIPMP 添加相应的格式插件 在 OpenIPMP 中默认携带了 MPEG2 和 MPEG 的插件, 下面以 MPEG 插件为例介绍编译过程 : 首先进入 /usr/openipmp2/src/demo/mpegip 下找到 mpegip-1.5.rar 文件并解压 然后开始编译 : # cd /usr/openipmp2/src/demo/mpegip/mpegip-1.5/sdl #chmod a+x configure #./configure #make #make install #cd.. #chmod a+x cvs_bootstrap #./ mpegip-1.5 disable-mplive #make #make install 当然由于编译器已经是 gcc. 的缘故, 在整个编译过程会遇到非常多的语法错误问题, 需要开发者耐心的一步步修改 这是件十分头疼的事 在完成编译后, 即可生成 mpcreator 和 mpplayer 两个工具,mpcreator 用来问多媒体文件增加保护,mpplayer 用来播放经 DRM 加密后的文件 MPEG2 的插件的生成也有类似的编译过程.3.2 多媒体引擎 在 OpenCORE 中, 媒体引擎从编解码的类型上可以分为 3 种 : 播放引擎 (PVPlayer Engine) 记录引擎( PVAuthor Engine) 双向引擎 ( PV2way Engine) 另外适配器引擎( Adapter Engine) 和元数据引擎 (PV Metadata Engine) 也是不可缺少的一部分, 在本书中将着重介绍播放引擎 记录引擎和双向引擎 数据源 (Data Source) 和数据槽 (Data Sink) 等通常被抽象成媒体 I/O(Media I/O), 或被直接封装在 PVMF 节点中 如果直接封装在 PVMF 节点中, 媒体设备可以直接和多媒体引擎进行通信, 多媒体引擎和媒体设备间的代码实现也最少, 但这要求创建一个新的 PVMF 节点 如果将媒体设备抽象成媒体 I/O 设备, 多媒体引擎可以通过与该媒体 I/O 接口通信的方式操作媒体设备, 这有利于减小实现的复杂性, 但会导致代码规模和层次的增加 在目前的实现中, 数据源类包括 PvmfMediaInputNode PVMFDummyFileInputNode PVMFFileDataSource 等 ; 数据槽类包括 PVMFDummyFileOutputNode PVMFFileOutputNode PVMFFileDataSink 等 1.PVPlayerInterface 播放引擎在 OpenCORE 中, 目前支持的播放媒体格式包括 MP 3GPP RSTP 流会话和 SMIL 等 播放引擎依赖于 OSCL PVMF OMX IL 等组件 123

19 Android 多媒体编程从初学到精通 图 -1 中描述了播放引擎的主要接口类图, 客户端通过 PVPlayerInterface 获得播放引擎进行相关的操作, 而播放引擎则利用 3 个观察器 PVMFNodeCmdStatusObserver PVMFNodeInfoEventObserver PVMFNodeErrorEventObserver 来为客户端提供异步的命令完成状况和异常信息等消息 Client PVCommandStatusObserver PVPlayerFactory PVPlayerInterface PVInformationalEventObserver PVPlayerEngine PVErrorEventObserver 图 -1 播放接口类图 需要说明的是, 在一般情况下, 在上层应用和播放引擎之间不需要适配器, 但如果 PVPlayerInterface 提供的接口无法满足上层应用的需要, 就需要在 OSCL 和上层应用之间构建一个基于新 OSCL 接口的适配层 在为特定平台或者操作系统做 OpenCORE 移植时, 这种设计策略常常需要 播放引擎的实现主要位于 external\opencore\engines\player 目录中, 图 -15 显示的是播放引擎的类图 AndroidSurfaceOutput AndroidAudioOutput PVPlayer PVPlayerDataSinkPVMFNode PVPlayerDriver MediaPlayerInterface PVPlayerDataSink PVPlayerInterface PVPlayerFactory PVPlayerDataSinkFilename PVPlayerDataSource PVPlayerEngine PVPlayerDataSourceURL PVPlayerDataSourcePVMFNode 图 -15 播放引擎主要类图 播放引擎具有较复杂的运行环境, 为了便于播放引擎的运行, 播放引擎引入了状态机的 12

20 四多媒体框架设计框架 在 OpenCORE 中, 播放引擎的状态切换是基于 PVPlayerInterface 接口的, 相互的状态触发事件由下层的 PVMF 组件发出 相关的状态在 pv_player_types.h 文件中定义 在完成引擎的初始化后, 播放引擎将处于 PVP_STATE_IDLE 状态, 在该状态下, 通过 PVPlayerEngine::AddDataSource() 方法可以将数据源添加到引擎中, 在添加数据源成功后, 通过 PVPlayerEngine::Init() 方法发送 PVP_ENGINE_COMMAND_INIT 命令, 引擎将会转换为 PVP_STATE_INITIALIZED 状态 在 PVP_STATE_INITIALIZED 状态下, 客户端可以查询数据源的各种信息, 如媒体轨迹 元数据等 同时通过 PVPlayerEngine::AddDataSink() 方法可以添加播放引擎的数据槽 在完成添加数据槽的操作后, 通过 PVPlayerEngine::Prepare() 方法发送 PVP_ENGINE_ COMMAND_PREPARE 命令, 引擎将会转换为 PVP_ENGINE_STATE_PREPARING 状态 在 PVP_ENGINE_STATE_PREPARING 状态, 数据源将会为接下来的媒体播放进行一个排序方面的准备, 然后通过 PVPlayerEngine::Start() 方法发送 PVP_ENGINE_ COMMAND_START 命令, 引擎将会转换为 PVP_STATE_STARTED 状态, 开始播放媒体 在 PVP_STATE_STARTED 状态, 用户可以执行暂停 停止等操作, 如果执行了 PVPlayerEngine::Stop() 方法操作, 引擎将会转换为 PVP_STATE_INITIALIZED 状态 ; 如果执行 PVPlayerEngine::Pause() 方法操作, 引擎将会转换为 PVP_STATE_PAUSED 状态 在 PVP_STATE_PAUSED 状态, 用户可以执行恢复 停止等操作, 如果执行了 PVPlayerEngine::Stop() 方法操作, 引擎将会转换为 PVP_STATE_INITIALIZED 状态 ; 如果执行 PVPlayerEngine:: Resume() 方法操作, 引擎将会转换为 PVP_STATE_STARTED 状态 在执行操作的过程中, 如果发生了错误或者异常, 系统将会转为 PVP_STATE_ERROR 状态, 并尝试从错误中恢复 如果发生的是无法恢复的错误, 引擎将会清除所有痕迹, 转为 PVP_STATE_IDLE 状态 如果错误可以恢复, 在出错前状态为 PVP_STATE_INITIALIZED PVP_STATE_PREPARED PVP_STATE_STARTED PVP_STATE_PAUSED 等时, 引擎将会转为 PVP_STATE_INITIALIZED 状态, 否则引擎转为 PVP_STATE_IDLE 状态 当出错恢复完成时, 引擎将会发送相关的异步消息通知 图 -16 显示了播放引擎的状态图 RemoveDataSource() AddDataSink() Init() PVP_STATE_IDLE PVP_STATE_INITIALIZED Prepare() PVP_STATE_PREPARED AddDataSource() Reset() RemoveDataSink() Stop() Stop() Start() PVP_STATE_ERROR Stop() PVP_STATE_STARTED Resume() Pause() PVP_STATE_PAUSED 图 -16 播放引擎状态图 需要说明的是, 在默认情况下, 播放引擎并不是多线程安全的, 为了支持多线程, 可以 125

21 Android 多媒体编程从初学到精通 有两种方法, 一种方法是利用 OSCL 代理接口组件提供多线程支持, 另一种方法是在适配层中为特定平台添加多线程支持 2.PVAuthorEngineInterface 记录引擎在记录引擎中, 对音频 视频文件均提供了记录支持, 其客户端可以分为两种类型 : 上层应用和适配器 其中适配器客户端作用在于将记录引擎的接口映射为其他框架或者应用所需的特定接口 记录引擎支持的数据源包括摄像头 麦克风, 甚至未经编码的元数据流等 经过记录引擎处理, 源数据流会被编码为客户端指定的数据格式 客户端通过 PVAuthorEngineInterface PVErrorEventObserver PVInformationalEvent Observer PVCommandStatusObserver 等观察器来接受命令 状态信息和错误信息等 记录引擎的实现位于 external\opencore\engines\author 目录下, 图 -17 显示的是记录引擎的类图 VideoSourceNode AudioSourceNode Client PVCommandStatusObserver PVAuthorEngineFactory PVMFNodeInterface PVAuthorEngineInterface PVInformationEventObserver DataSinkNode PVAuthorEngine PVErrorEventObserver 图 -17 PVAuthor 类继承关系图 在记录引擎中, 状态之间的变迁同样是通过状态机控制的, 其状态包括 PVAE_STATE_IDLE PVAE_STATE_OPENED PVAE_STATE_INITIALIZED PVAE_STATE_ RECORDING PVAE_STATE_PAUSED PVAE_STATE_ERROR 等, 图 -18 显示了记录引擎中的状态跃迁 PVAE_STATE_INITIALIZED Reset() Init() Start() Stop() PVAE_STATE_IDLE Open() PVAE_STATE_OPENED PVAE_STATE_RECORDING Reset() Close() Reset() Reset() Pause() Resume() PVAE_STATE_ERROR PVAE_STATE_PAUSED 图 -18 PVAuthor 引擎状态图 当执行多媒体记录时, 首先要创建一个记录引擎, 然后添加数据源 具体的执行过程如 图 -19 所示 126

22 Client PVAuthorEngineFactory PVAuthorEngine 四多媒体框架 1 : CreateAuthor() 2 : Create() 3 : CommandCompleted() : AddDataSource() 5 : CommandCompleted() 6 : SelectComposer() 7 : CommandCompleted() 8 : AddMediaTrack() 9 : CommandCompleted() 10 : Init() 11 : CommandCompleted() 12 : Start() 13 : CommandCompleted() 1 : Pause() 15 : CommandCompleted() 16 : Resume() 17 : CommandCompleted() 18 : Stop() 19 : CommandCompleted() 20 : RemoveDataSource() 21 : CommandCompleted() 22 : Close() 23 : CommandCompleted() 图 -19 PVAutoor 执行过程图 在添加完数据源后, 还需要选择组合器和添加 MediaTrack, 才方能开始媒体记录 3.CPV2WayInterface 双向引擎随着芯片处理能力和无线带宽的提高,3G 技术得到不断推广, 视频电话逐渐走进普通用户的视野 为了支持视频电话业务, 在 OpenCORE 中, 提供了依赖于平台的多媒体双向引擎, 对 H.32M(3G-32M 在 H.32M 基础上指定了 H.263 作为强制基本标准, 而把 MPEG- 作为视频编码推荐标准,AMR 作为音频编码强制标准, 主要用于无线网络 ) H.323( 主要用于有线互联网, 无 QoS 保障 ) SIP( 侧重 NGN 网络 ) 等主流视频电话协议栈都提供了支持 在 3G 移动终端中, 通常采用的是 3G-32M 协议栈, 目前拥有 3G-32M 协议栈核心技术的厂商主要有达丽星 (Dilithium) 锐迪讯(Radvision) 等 随着无线移动网络进一步朝着 IP 化的方向演进和基于 3G-32M 协议栈控制复杂等缺陷方面的考虑, 在 3GPP R5 版本中, 正式引入了基于 SIP 协议族的多媒体子系统 (IMS, IP Multimedia Subsystem), 使基于 SIP 的移动视频通话业务成为可能 双向引擎的输入数据可以有麦克风 摄像头等, 输出数据源有显示屏 扬声器等 数据源和数据槽均由以应用或者适配层的形式存在的客户端添加 客户端利用工厂类 CPV2WayEngineFactory 或者 CPV2WayProxyFactory 来获得一个继承 127

23 Android 多媒体编程从初学到精通 CPV2WayInterface 接口的双向引擎的引用 ( 在目前的版本中, 双向引擎为 CPV32m2Way) 另外, 客户端还必须实现双向引擎的观察者接口 (PVCommandStatusObserver PVInformationalEventObserver PVErrorEventObserver), 以获得收到命令完成情况 状态信息和错误信息的途径, 并将这些接口传递给双向引擎 客户端还应基于 PV2WayMIO 类或 PVMFNodeInterface 接口实现双向引擎所需的数据源和数据槽, 数据源和数据槽在实现上都是基于 Oscl_Vector 向量的 客户端会通过 CPV2WayInterface 接口执行视频会话过程中的相关操作, 如初始化 添加数据源 添加数据槽 连接 暂停 恢复 断连等 双向引擎的实现位于 external\opencore\engines\2way 目录下, 如图 -20 所示为双向引擎的主要类的继承关系图 PV2WaySourceAndSinksFile PV2WayConsoleSourceAndSinks PVInformationalEventObserver PVErrorEventObserver PV2WaySourceAndSinksBase PVCommandStatusObserver Client CPV2WayEngineFactory PV2WayMIOObserver PVMFNodeInterface CPV2WayInterface CPV32m2Way PV2WaySink PV2WayMIO PV2WaySource CPV2WayProxyAdapter 图 -20 PV2Way 类继承关系图 在目前的设计中,OpenCORE 的双向引擎内置了 7 种状态 : 空闲 (EIdle) 初始化 (EInitializing) 建立 (ESetup) 连接中 (EConnecting) 已连接 (EConnected) 断连中 (EDisconnecting) 重设(EResetting) 其中 EIdle 状态模式为双向引擎对象的初创状态, 尚没有任何资源被分配 在 EInitializing 状态下, 引擎尝试获得可用的设备资源 ( 如编解码 内存等 ), 准备接受建立参数和视频连接 如果成功, 则引擎状态转换为 ESetup 状态, 如果失败, 则释放已请求成功的资源, 转换为 EIdle 状态 在收到编码 复用 捕获能力 渲染能力等建立参数的过程中, 引擎处于 ESetup 状态, 在引擎状态转换为 EConnecting 状态之前, 有效的数据源和数据槽应被添加到双向引擎中 当引擎对象收到一个请求连接的呼叫时, 引擎转换为 ESetup 状态 在该模式下, 移动终端将和远程终端交换媒体支持能力和信道配置信息, 为接下来的媒体信道连接做好准备 在协议栈的控制面信令完成通信后, 终端开始尝试基于通信双方的支持能力建立音频 视频轨迹, 数据源和数据槽将在这一过程中转入运行, 引擎转换为 EConnecting 状态 当因通信完成或者资源不足等原因, 引擎决定断开信道和复用设备时, 引擎的状态转换为 EDisconnecting 状态 如果终端开始释放所有双向引擎占用的通信资源, 则引擎转为 EResetting 状态 128

24 图 -21 显示了双向引擎的状态跃迁 四多媒体框架 //ResetComplete EIdle Init() EResetting EInitializing Reset() ESetup Connect() EDisconnecting //DisconnectZComplete EConnecting Disconnect EConnected ConnectComplete() 图 -21 PV2Way 状态图 在 Android 中, 目前支持的基于 CPV2WayInterface 接口的双向引擎为 CPV32m2Way 数据源和数据槽均是基于 PV2WayMIO 类派生的 为了进行视频通话, 首先需要创建一个双向引擎, 然后添加数据源和数据槽, 具体的交互过程如图 -22 所示 Client CPV2WayEngineFactory CPV32m2Way 1 : CreateTerminal() 2 : NewL() : CommandCompleted() 3 : ConstructL() 5 : Init() 6 : CommandCompleted() 7 : AddDataSink() 8 : CommandCompleted() 9 : AddDataSource() 10 : CommandCompleted() 11 : Disconnect() 12 : CommandCompleted() 13 : Reset() 15 : DeleteTerminal() 1 : CommandCompleted() 图 -22 PV2Way 交互过程图 OpenCORE 所能支持的媒体格式参看 pvmf_format_type.h 客户端和服务器进行通信协 商编码的过程如下 : 代码 -6 FormatInList 的实现 129

25 Android 多媒体编程从初学到精通 CodecSpecifier* PV2WayMIO::FormatInList(PVMFFormatType& type) Oscl_Map<PVMFFormatType, CodecSpecifier*, OsclMemAllocator, pvmf_format_type_key_compare_class >::iterator it = iformatsmap.begin(); it=iformatsmap.find(type); // 查找匹配格式 if (!(it==iformatsmap.end())) return (*it).second; return NULL;.3.3 文件解析和组合 由于同时涉及播放文件和记录文件两种功能, 因此 OpenCORE 中的文件格式处理有两种类型 一种是解析器 (Parser), 用于解析文件 ; 另一种是组合器 (Composer), 用于记录文件 在媒体文件的播放过程中, 一个视频文件会包含音频流和视频流的组合, 如在一个 MP 文件中, 可能包含了 AMR 或 AAC 的音频压缩流, 以及 H263 MPEG 或者 H26 AVC 的视频压缩流 这些流文件被封装在一个包文件中, 媒体播放器首先要做的就是将这些流文件从包文件中解析出来, 然后根据文件类型的不同调用不同的解码器进行解码, 最后将解码后的元数据流输送到相应的硬件设备进行播放 在媒体文件的记录过程中, 涉及视频 音频 图像的捕获功能 如在录像过程中, 首先需要从硬件设备分别获得视频元数据流和音频元数据流, 然后根据相关的配置信息, 将元数据流压缩成相应格式的压缩流, 并写入文件中, 最终组合成相应的包文件 需要说明的是, 目前中 高端的移动终端上都配备了专门用于多媒体加速的 DSP, 相关的音频 视频编解码工作都会在专用 DSP 上进行 OpenCORE 关于文件格式解析的内容位于 external\opencore\fileformats 和 external\opencore\protocols\sdp\parser 目录下 下面分别以 MP3 和 MPEG- 为例来分析解析器 组合器的实现 1. 解析器在 Android 中, 目前内置了 AVI MPEG- WAV MP3 AMR AAC 等格式的解析器 下面以 MP3 为例介绍解析器的实现, 相关的文件包括 imp3ff.cpp mp3fileio.cpp mp3parser.cpp mp3utils.cpp 等 具体实现位于 external\opencore\fileformats\ mp3\parser 目录下 在 Android 中,MP3 解析器节点的注册是在 PVMERegistryPopulator::RegisterAllNodes() 方法中完成的 为了进行 MP3 文件的播放, 需要将 MP3 的数据源添加到播放引擎中, 在添加数据源的过程中会进行文件解析 MP3 播放时进行文件解析的过程如图 -23 所示 130

26 Client PVPlayerEngine PVPlayerDataSource PVPlayerRecognizerRegistry PVMP3FFRecognizerPlugin 四多媒体框架 MP3Parser 1 : AddDataSource() 2 : DoAddDataSource() 3 : GetDataSourceContextData() : GetDataSourceFormatType() 5 : DoQuerySourceFormatType() 6 : QueryFormatType() 7 : Recognize() 8 : DoRecognize() 9 : CheckForDataAvailability() 10 : RunRecognitionPass() 11 : Recognize() 12 : IsMp3File() 13 : OSCL_NEW() 1 : IsMp3File() 15 : GetMP3Header() 16 : DecodeMP3Header() 图 -23 MP3 播放时的文件解析过程 流程说明 : 在客户端通过 PlayerDriver 添加数据源的过程中,PVPlayerEngine 引擎会向一个线程安全的事件队列 ithreadsafequeue 中添加 PVP_ENGINE_COMMAND_ADD_ DATA_SOURCE 命令 当 PVPlayerEngine 引擎收到该命令后, 调用 DoAddDataSource() 方法进行数据源的添加 根据传过来的命令 ID,PVPlayerEngine 引擎获得当前的 PVPlayerDataSource 对象, 然后调用 PVPlayerDataSource::GetDataSourceFormatType() 方法查看当前的文件格式 如果文件格式未知, 就需要根据传递的命令 ID 和命令上下文调用 DoQuerySourceFormatType() 方法进行文件格式的解析了 在 DoQuerySourceFormatType() 方法中, 会经过一系列的操作获得一个 PVMFCPMPluginAccessInterfaceFactory 对象, 然后根据该对象调用 PVPlayer RecognizerRegistry:: QueryFormatType() 方法打开识别器 (Recognizer) 的会话并进行识别 PVMFRecognizerRegistry 对象通过调用 PVMFRecognizerRegistryImpl::Recognize() 方法, 向自身发送一个 PVMFRECREG_COMMAND_RECOGNIZE 命令, 将工作交给 PVMF RecognizerRegistryImpl::DoRecognize() 方法进行接下来的处理 在 PVMFRecognizerRegistryImpl::DoRecognize() 方法中, 首先会通过 CheckFor DataAvailability() 方法验证数据的有效性, 然后通过 RunRecognitionPass() 方法调用解析器插件 直到这时,PVMP3FFRecognizerPlugin 才有了用武之地 在 PVMP3FFRecognizerPlugin::Recognize() 方法中, 会首先通过 OSCL_NEW() 方法创建一个 IMpeg3File 对象 然后调用 IMpeg3File::IsMp3File() 方法判断该文件是不是 MP3 文件 131

27 Android 多媒体编程从初学到精通 在 IMpeg3File::IsMp3File() 方法中, 会通过 OSCL_NEW() 方法创建一个 MP3Parser 对象, 然后在 MP3Utils 和 MP3FileIO 的配合下, 通过 MP3Parser::GetMP3Header() 尝试获得 MP3 的头文件 如果成功, 再通过 MP3Parser::DecodeMP3Header() 来解析该头文件, 通过同样成功, 则确认该文件就是 MP3 文件了 在完成了文件的解析后, 即开始解码工作, 关于 MP3 的解码工作请参考 节 MP3 的解码过程 2. 组合器在 Android 中, 目前内置了 MPEG- 等格式的组合器, 组合器的实现要比解析器复杂的多 下面以 MPEG- 为例介绍组合器的实现, 相关的文件位于 external\ 了 opencore\fileformats\mp\composer 目录下 如图 -2 所示为 MP 记录时的文件解析过程 Client AuthorDriver PVAuthorEngine PVMpFFComposerNode PVA_FF_IMpegFile 1 : handlesetoutputformat() 2 : SelectComposer() 3 : DoSelectComposer() : QueryRegistry() 5 : CreateComposer() 6 : CreateMpFFComposer() 7 : creatempfile() 8 : setpresentationtimescale() 9 : setversion() 10 : settitle() 11 : setauthor() 12 : setcopyright() 13 : setdescription() 1 : setrating() 15 : setcreationdate() 16 : setmoviefragmentduration() 17 : setalbuminfo() 18 : setrecordingyear() 19 : setperformer() 20 : setgenre() 21 : setclassification() 22 : setkeyword() 23 : setlocationinfo() 2 : addtrackreference() 25 : preparetoencode() 图 -2 MP 记录时的文件解析过程 流程说明 : 在进行 MP 记录时, 客户端会通过 PVMediaRecorder::setOutputFormat() 方法向记录引擎 PVAuthorEngine 发送 AUTHOR_SET_OUTPUT_FORMAT 消息, 设置输出文件的格式 在 AuthorDriver 的监听线程收到 AUTHOR_SET_OUTPUT_FORMAT 消息后, 会调用 handlesetoutputformat() 方法进行输出格式 MIME 类型的设置 然后调用 PVAuthorEngine 引擎的 SelectComposer() 方法进行组合器的选择 PVAuthorEngine 引擎首先向自身发送 PVAE_CMD_SELECT_COMPOSER 消息到事件队 132

28 四多媒体框架列中, 一旦收到该消息, 即调用 DoSelectComposer() 方法, 根据消息携带的 MIME 类型获得相应的 UUID, 然后调用 PVAuthorEngineNodeFactoryUtility::CreateComposer() 方法创建组合器 接下来系统根据 UUID 判定是否创建 MP 文件, 如果是, 则调用 PVMpFFComposerNodeFactory::CreateMpFFComposer() 方法创建 MP 的组合器 当开始媒体记录时,MP 组合器会被调用 DoStart() 方法, 在该方法中, 组合器会创建 MP 文件, 设置记录模式 缓冲等, 然后设置时间戳 版本号 标题 作者 版权 备注等信息, 最后调用 PVA_FF_IMpegFile::prepareToEncode() 方法开始编码工作 需要说明的是,AuthorDriver 为记录引擎和上层应用的接口,PlayerDriver 为播放引擎与上层应用的接口.3. 编解码器 所有的 OpenCORE 编解码器均被封装在由 Khronos 定义的开放标准 OpenMAX IL 接口中, 上层的 PVMF 框架在与编解码器进行通信时, 必须通过 OpenMAX IL 接口进行 这样的设计便于集成三方的编解码器到 OpenCORE 中, 保证了 PVMF 框架的可扩展性和灵活性 如果希望为 OpenCORE 框架增加一种文件格式的播放支持, 则包含文件解析器 解码器等方面的工作 如果希望增加一种文件格式的记录支持, 则包含文件组合器 编码器等方面的工作 1. 编码器就目前而言, 主流的视频编码包括 MPEG- 等, 音频编码包括 AMR AAC 等 在 Android 中, 目前提供了 AMR-NB SBC 等音频编码器的实现和 AVC H26 和 MV H263 等视频编码器的实现 下面针对 AAC 涉及的 MPEG-2 和 MP 3GP 等涉及的 MPEG- 进行简单的背景介绍 1)MPEG-2 MPEG-2 是 MPEG 工作组于 199 年发布的一个视频和音频压缩国际标准 MPEG-2 通常用来为广播信号 ( 如卫星电视 有线电视等 ) 提供视频和音频编码,MPEG-2 经少量修改后, 成为 DVD 产品的核心编码技术 MPEG-2 的系统描述部分 ( 一部分 ) 定义了传输流, 它定义了一套在非可靠介质上传输数字视频信号和音频信号的机制, 主要用在广播电视领域 MPEG-2 的视频部分 ( 二部分 ) 和 MPEG-1 类似, 但是它提供了对隔行扫描视频显示模式的支持 ( 隔行扫描广泛应用在广播电视领域 ) MPEG-2 视频并没有对低位速率 ( 小于 1Mbps) 进行优化, 在 3Mb/s 及以上位速率情况下,MPEG-2 明显优于 MPEG-1 另外 MPEG-2 向后兼容, 也就是说, 所有符合标准的 MPEG-2 解码器也能够正常播放 MPEG-1 视频流 MPEG-2 技术也应用在了 HDTV 传输系统中 MPEG-2 的三部分定义了音频压缩标准 该部分改进了 MPEG-1 的音频压缩, 支持两通道以上的音频 MPEG-2 音频压缩部分也保持了向后兼容的特点 MPEG-2 的七部分定义了不能向后兼容的音频压缩, 该部分提供了更强的音频功能 133

29 Android 多媒体编程从初学到精通 通常我们所说的 MPEG-2 AAC 指的就是这一部分 MPEG-2 视频通常包含多个 GOP(GOP=Group Of Pictures), 每一个 GOP 包含多个帧 帧的类型有 I- 帧 P- 帧和 B- 帧等 其中 I- 帧用于帧内编码,P- 帧用于前向估计,B- 帧用于双向估计 一般来说输入视频速率为 25 帧 / 秒 (CCIR 标准 ) 或者 帧 / 秒 (FCC 标准 ) MPEG-2 支持隔行扫描和逐行扫描 在逐行扫描模式下, 编码的基本单元是帧 ; 在隔行扫描模式下, 基本编码可以是帧, 也可以是场 (field) 原始输入图像首先被转换到 YCbCr 颜色空间 其中 Y 是亮度,Cb 和 Cr 是两个色度通道 对于每一通道, 首先采用块分割, 然后形成 宏块 (macroblocks), 宏块构成了编码的基本单元 每一个宏块再分割成 8 8 的小块 色度通道分割成小块的数目取决于初始参数设置 例如, 在常用的 YCbCr 20 格式下, 每个色度宏块只采样出一个小块, 所以 3 个通道宏块能够分割成的小块数目是 +1+1=6 个 对于 I- 帧, 整幅图像直接进入编码过程 对于 P- 帧和 B- 帧, 首先做运动补偿 通常来说, 由于相邻帧之间的相关性很强, 宏块可以在前帧和后帧中对应相近的位置找到相似的区域匹配 偏差即偏移量作为运动向量被记录下来, 运动估计重构区域的误差被送到编码器中编码 对于每一个 8 8 小块, 需要通过离散余弦变换把图像从空间域转换到频域, 将得到的变换系数被量化并重新组织排列顺序, 从而增加长零的可能性 然后做游程编码 (run-length code), 最后进行哈夫曼编码 (Huffman Encoding) I- 帧编码有助于减少空间域冗余,P- 帧和 B- 帧有助于减少时间域冗余 GOP 是由固定模式的一系列 I- 帧 P- 帧 B- 帧组成的 常用的结构由 15 个帧组成, 具有 IBBPBBPBBPBBPBB 形式 GOP 中各个帧的比例的选取和带宽 图像的质量要求有一定关系 例如 B- 帧的压缩时间几乎是 I- 帧的 3 倍, 所以对于计算能力不强的某些实时系统, 可能需要减少 B- 帧的比例 MPEG-2 输出的比特流可以是匀速也可以是变速的 在 DVD 应用上, 最大比特率可达 10. Mb/s 如果要使用固定比特率, 就需要不断地调节量化尺度以产生匀速的比特流 但是, 提高量化尺度可能带来可视的失真效果, 如马赛克现象 MPEG-2 由 ISO/IEC 定义, 其各部分的定义如下 ISO/IEC : 系统 - 描述视频和音频的同步和多路技术 ISO/IEC : 视频 - 视频压缩 ISO/IEC : 音频 - 音频压缩, 包括多通道的 MP3 扩展 ISO/IEC : 测试规范 ISO/IEC : 仿真软件 ISO/IEC :DSM-CC(Digital Storage Media Command and Control) 扩展 ISO/IEC :Advanced Audio Coding(AAC) ISO/IEC : 实时接口扩展 ISO/IEC :DSM-CC 规范 2)MPEG- 13

30 四多媒体框架 MPEG- 是一套用于音频 视频信息的压缩编码标准, 由 ISO 和 IEC 下属的活动图像专家组 (MPEG,Moving Picture Experts Group) 负责制定 MPEG- V1.0 在 1998 年 10 月通过, MPEG- V2.0 在 1999 年 12 月通过 MPEG- 主要用途在于流媒体 光盘 视频电话 电视广播等 MPEG- 包含了 MPEG-1 及 MPEG-2 的绝大部分功能及其他格式的长处, 并加入及补充了对虚拟现实模型语言 (VRML,Virtual Reality Modeling Language) 的支持 面向对象的合成文件 ( 包括音效 视频及 VRML 对象 ), 以及对 DRM 及其他交互功能 MPEG- 具有灵活的框架, 用户可以根据自身的情况采用某些功能的集合 MPEG- 由 ISO/IEC 196 定义, 其各部分的定义如下 ISO/IEC 196-1, 系统部分 : 描述视讯和音频的同步, 以及混合方式 ISO/IEC 196-2, 视讯部分 : 定义了一个对各种视觉信息 ( 包括视讯 静态纹理 计算机合成图形等 ) 的编解码器 XviD ISO/IEC 196-3, 音频部分 : 定义了一个对各种音频信号进行编码的编解码器的集合 包括 AAC 的若干变形和其他一些音频 语音编码工具 ISO/IEC 196-, 一致性部分 : 定义了对本标准其他的部分进行一致性测试的程序 ISO/IEC 196-5, 参考软件部分 : 提供了用于演示功能和说明本标准其他部分功能的软件 ISO/IEC 196-6, 多媒体传输集成框架 (DMIF,Delivery Multimedia Integration Framework) ISO/IEC 196-7, 优化的参考软件 : 提供了对实现进行优化的例子 ISO/IEC 196-8, 在 IP 网络上传输 : 定义了在 IP 网络上传输 MPEG- 内容的方式 ISO/IEC 196-9, 参考硬件 : 提供了用于演示怎样在硬件上实现本标准其他部分功能的硬件设计方案 ISO/IEC , 高级视频编码 (AVC,Advanced Video Coding): 定义了一个视频编解码器 AVC 和 XviD 都属于 MPEG- 编码, 但由于 AVC 属于 MPEG- Part 10, 在技术特性上比属于 MPEG- Part2 的 XviD 要先进, 而从技术上讲, 它和 ITU-T H.26 标准是一致的, 故全称为 MPEG- AVC/H.26 ISO/IEC , 基于 ISO 的媒体文件格式 : 定义了一个存储媒体内容的文件格式 ISO/IEC , 知识产权管理和保护 (IPMP,Intellectual Property Management and Protection) 拓展 ISO/IEC 196-1,MPEG- 文件格式 : 定义了基于 ISO/IEC 的用于存储 MPEG- 内容的容器文件格式 ISO/IEC ,AVC 文件格式 : 定义了基于 ISO/IEC 的用于存储 ISO/IEC 的视频内容的文件格式 ISO/IEC , 动画框架扩展 (AFX,Animation Framework extension) ISO/IEC , 同步文本字幕格式 ISO/IEC , 字体压缩和流式传输 ( 针对公开字体格式 ) 135

31 Android 多媒体编程从初学到精通 ISO/IEC , 综合用材质流 (Synthesized Texture Stream) ISO/IEC , 简单场景表示 (LASeR,Lightweight Scene Representation) ISO/IEC , 用于渲染的 MPEG-J 拓展 在 OpenCORE 中, 目前已经提供了 AVC MV H.263 AMR AAC 等格式的编码器 MV 是由 Apple 公司开发的一个文件格式, 它是基于 MPEG- 的二部分压缩的 MV 与 MP 的不同在于,MV 文件中的音频 视频轨道是相互独立的,MV 文件的音频采用的是 AAC 的编码方式, 而视频采用的则是 H.26 的编码方式 离散余弦变换 (DCT, Discrete Cosine Transform) 是对语音和图像信号进行变换的优秀方法, 其变换特性接近 KLT(Karhunen-Loeve Transform) 1986 年由 Prencen 和 Bradly 提出了一种改进的离散余弦变换 [32] (MDCT,Modified Discrete Cosine Transform), 利用 50% 的样点叠加和时域混叠消除 (TDAC) 滤波器组, 在不降低变换编码性能的情况下, 有效地克服了 DCT 块处理运算中的边缘效应 [33] ( 块边缘噪声 ) 在相同编码效率的情况下,MDCT 的性能优于 DCT 目前在语音 宽带音频及图像信号的变换编码中, 都普遍采用 MDCT 下面是 Android 在设置视频数据源后, 调用视频编码器的过程, 如图 -25 所示 Client AuthorDriver PVAuthorEngine PVMFOMXEncNode OmxComponentMpegEncAO 1 : handlesetvideoencoder() 2 : AddMediaTrack() 3 : DoAddMediaTrack() : GetPvmfFormatString() 5 : IsCompressedFormatDataSource() 6 : CreateEncoder() 7 : CreatePVMFOMXEncNode() 8 : Prepare() 9 : DoPrepare() 10 : OSCL_NEW() 11 : SetEncoderMode() 12 : ConstructComponent() 13 : GetOmxHandle() 图 -25 录制 MP 时调用编码器的过程 流程说明 : 当进行录像时, 开发者需要通过 PVMediaRecorder::setVideoEncoder() 方法向记录引擎发送 AUTHOR_SET_VIDEO_ENCODER 消息来设置视频的解码器 当记录引擎中的 AuthorDriver 收到 AUTHOR_SET_VIDEO_ENCODER 消息后, 通过 handlesetvideoencoder() 方法设置媒体的 MIME 类型, 并通过 mvideoinputmio:: SetFrameRate() 方法和 mvideoinputmio:: SetFrameSize() 方法来设置帧速率和帧大小, 接着通过调用 PVAuthorEngine::AddMediaTrack() 方法开始添加媒体轨迹 PVAuthorEngine::AddMediaTrack() 方法会通过向自身发送 PVAE_CMD_ADD_ 136

32 四多媒体框架 MEDIA_TRACK 命令, 调用 PVAuthorEngine::DoAddMediaTrack() 方法来执行添加媒体轨迹的请求 在这一过程中, 首先根据命令携带的 MIME 类型, 通过 PVAuthorEngine NodeFactoryUtility::QueryRegistry() 方法来查询相应的 UUID, 然后调用 PVAuthorEngine NodeFactoryUtility::CreateEncoder() 进行编码器节点的创建 当录制视频格式为 MP 时, 相应的 UUID 为 KPVMFOMXVideoEncNodeUuid, 通过 PVMFOMXEncNodeFactory 创建编码节点 PVMFOMXEncNode 当上层调用 PVMediaRecorder::prepare() 方法时, 最终会调用到 PVMFOMX EncNode::Prepare() 方法来执行准备工作 在执行准备工作的 PVMFOMXEncNode::DoPrepare() 方法中, 会调用 OpenMAX Core 的 OMX_MasterGetHandle() 方法, 根据组件名来具体执行编码器的检索和创建, 最终创建 MpegEncOmxComponentFactory 对象 在 MpegEncOmxComponentFactory 对象创建的过程中, 会首先通过 OSCL_NEW() 方法为一个 OmxComponentMpegEncAO 对象分配内存, 然后调用 OmxComponentMpegEncAO 的 SetEncoderMode() 方法和 ConstructComponent() 方法构建出具体的编码器对象, 并返回给上层相应的句柄 编码器的具体实现位于 external\opencore\codecs_v2 目录中, 具体的编码器实现在这里就不再多做介绍了, 音频编码请参考 节 AMR 的编码过程, 视频编码请参考 节视频的编码过程 2. 解码器在 OpenCORE 中, 目前已经提供了 AVC MV H.263 WMA AAC AMR MP3 WMA RV RA 等格式的解码器 为了提高渲染速度, 在解码器的输出缓冲 (Output Buffer) 和渲染组件的缓冲之间应尽量避免复制和转换等操作的发生 出于这样的目的, 在设计时, 解码器的输出缓冲的宽高 位深等约束应与渲染组件的特性保持一致 图 -26 显示了相关的解码类图 PVMFOMXAudioDecNodeFactory PVMFOMXAudioDecNode PVMFOMXVideoDecNode PVMFOMXVideoDecNodeFactory PVMFOMXDecPort PVMFOMXBaseDecNode PvmiMIOObserver PVMediaOutputNode PvmiMIOSession PVMediaOutputNodeFactory PVMFFixedSizeBufferAlloc PvmiMIOAviWavFile PvmiMIOCommLoopback PvmiMIOCommLoopbackFactory PvmiMIOControl PvmiMIOAviWavFileFactory AndroidSurfaceOutput PVFMVideoMIO AndroidAudioInput PvmiMIOFileInputFactory PvmiMIOFileInput PVFMAudioMIO AndroidCameraInput 137

33 Android 多媒体编程从初学到精通 图 -26 解码相关类图 下面以 MP 为例进行解码器调用的介绍, 需要注意的是, 对于视频的播放, 需要同时调 用两个解码器 : 音频解码器和视频解码器, 分别送到相应的设备进行解码 其中视频解码器 的调用过程如图 -27 所示 音频解码器的调用过程和视频解码器相似, 这里就不再介绍了 Client PVPlayer PlayerDriver PVMediaOutputNodeFactory PVPlayerDataSinkPVMFNode PVPlayerEngine PVPlayerNodeRegistry 1 : setdatasource() 2 : prepareasync() 3 : run_init() : run_set_video_surface() 5 : PlayerSetVideoSurface() 6 : handlesetvideosurface() 7 : AndroidSurfaceOutput() 8 : CreateMediaOutputNode() 9 : set() 10 : PVPlayerDataSinkPVMFNode() 11 : SetDataSinkNode() 13 : handlesetdatasource() 12 : AddDataSink() 1 : AddDataSource() 15 : DoAddDataSource() 16 : GetPVPlayerState() 17 : DoSetupSourceNode() 18 : QueryRegistry() 19 : CreateNode() 图 -27 播放 MP 时调用视频解码器的过程 流程说明 : 当欲进行视频的播放时, 首先通过 MediaPlayer 调用原生层的媒体播放服务, 如果播放类型为 PV_PLAYER, 则提供服务的对象为 PVPlayer 当通过 MediaPlayer 添加数据源时, 最终将调用 PVPlayer::setDataSource() 方法来执行这一操作, 但仅保存数据源的路径 当调用 MediaPlayer::prepareAsync() 方法时, 通过 PVPlayer 会创建一个 Player SetDataSource 对象, 并向自身发送一个 PLAYER_SET_DATA_SOURCE 命令 当处理完成时, 调用回调函数 run_init() 在 run_init() 方法中, 会调用 run_set_video_surface() 方法进行视频 Surface 的设置 同时通过 run_set_audio_output() 方法来设置音频输出 在 run_set_audio_output() 方法中, 为了设置音频输出, 需要通过向自身发送 PLAYER_SET_AUDIO_SINK 命令, 并在 handlesetaudiosink() 方法中处理该命令 在 handlesetaudiosink() 方法中, 如果对实时性有要求, 则创建一个 AndroidAudioOutput 对象, 否则创建 AndroidAudioStream 对象 将音频路由到 Audio Flinger 然后通过 PVMediaOutputNodeFactory::CreateMediaOutputNode() 方法创建一个输出节点, 并将输出节点添加到音频槽中 138

34 四多媒体框架当播放引擎收到自身发送的 PLAYER_SET_DATA_SOURCE 命令时, 会调用 handlesetdatasource() 方法进行处理, 播放引擎首先从命令中提取出 URL, 然后对 URL 类型进行判断 如果是 RTSP, 则调用 PVPlayerDataSourceURL::SetDataSourceFormatType() 方法设置数据源类型为 PVMF_MIME_DATA_SOURCE_RTSP_URL; 如果是 HTTP, 则调用 PlayerDriver::setupHttpStreamPre() 方法设置数据源类型为 PVMF_MIME_DATA_SOURCE_ HTTP_URL 并设置上下文 当数据源是文件时, 如果后缀为 sdp, 则设置数据源类型为 PVMF_MIME_DATA_ SOURCE_SDP_FILE, 然后设置上下文 接着通过 PVPlayerEngine::AddDataSource() 方法向播放引擎发送 PVP_ENGINE_COMMAND_ADD_DATA_SOURCE 命令,PVPlayerEngine 引擎会在 DoAddDataSource() 方法中进行处理 为了添加数据源, 首先要判断播放引擎状态是不是 PVP_STATE_IDLE, 如果是, 则进行 DoSetupSourceNode() 方法的调用, 通过 PVPlayerNodeRegistry:: QueryRegistry() 方法进行解码器节点的查询, 并创建节点 如果是进行 MP 的播放, 创建的节点为 MpegDecoder_OMX 解码器本身的实现比较复杂, 在本书中提供了 AMR 和 MP3 的解码过程, 可以参考 节 AMR 的解码过程和 节 MP3 的解码过程 视频的解码过程可以参考 节视频的解码过程.3.5 OSCL 底层移植 OSCL 在 OpenCORE 中扮演了举足轻重的角色, 提供了跨平台特性的支持, 要求底层系统能够提供如动态内容管理 线程 文件 I/O 网络套接字 DNS(Domain Name Services) 和时间服务等 如果希望将 OpenCORE 向一个新平台移植, 主要工作就是在 OSCL 层进行的 由于 OSCL 涉及的硬件细节较多, 不是本书的重点, 在此就不做过多介绍了 下面介绍 OSCL 中涉及的最常用的字符编码格式的转换情况 Unicode 向 UTF8 转换的算法为 : 代码 -7 Unicode 向 UTF8 转换的过程 OSCL_EXPORT_REF int32 oscl_unicodetoutf8(const oscl_wchar *szsrc, int32 nsrclen, char *strdest, int32 ndestlen) int32 i=0; int32 i_cur_output=0; char ch_tmp_byte; if (ndestlen<=0) return 0; /* ERROR_INSUFFICIENT_BUFFER */ 139

35 Android 多媒体编程从初学到精通 for (i=0; i<nsrclen; i++) if (BYTE_1_REP>szSrc[i]) /* 1 个字节 utf8 表示 */ if (i_cur_output+1<ndestlen) strdest[i_cur_output++]=(char)szsrc[i]; else // 设置结束符 strdest[i_cur_output]='\0'; return 0; /* ERROR_INSUFFICIENT_BUFFER */ else if (BYTE_2_REP>szSrc[i]) /* 2 个字节 utf8 表示 */ if (i_cur_output+2<ndestlen) strdest[i_cur_output++]=(char)(szsrc[i]>>6 0xc0); strdest[i_cur_output++]=(char)((szsrc[i] & 0x3f) 0x80); else strdest[i_cur_output]='\0'; /* Terminate string */ return 0; /* ERROR_INSUFFICIENT_BUFFER */ else if (SURROGATE_MAX>szSrc[i] && SURROGATE_MIN<szSrc[i]) /* 个字节代理对表示 */ if (i_cur_output+<ndestlen) ch_tmp_byte=(char)(((szsrc[i] & 0x3c0)>>6)+1); strdest[i_cur_output++]=(char)(ch_tmp_byte>>2 0xf0); strdest[i_cur_output++]=(char)(((ch_tmp_byte & 0x03) 0x80) (szsrc[i] & 0x3e) >> 2); else // 设置结束符 strdest[i_cur_output]='\0'; return 0; /* ERROR_INSUFFICIENT_BUFFER */ else /* 3 个字节 utf8 表示 */ if (i_cur_output+3<ndestlen) strdest[i_cur_output++]=(char)(szsrc[i]>>12 0xe0); 10

36 四多媒体框架 strdest[i_cur_output++]=(char)(((szsrc[i]>>6) & 0x3f) 0x80); strdest[i_cur_output++]=(char)((szsrc[i] & 0x3f) 0x80); else // 设置结束符 strdest[i_cur_output]='\0'; return 0; /* ERROR_INSUFFICIENT_BUFFER */ // 设置结束符 strdest[i_cur_output]='\0'; // 以字节为单位返回 return i_cur_output; UTF8 向 Unicode 转换的算法为 : 代码 -8 UTF8 向 Unicode 转换的过程 OSCL_EXPORT_REF int32 oscl_utf8tounicode(const char *szsrc, int32 nsrclen, oscl_wchar *strdest, int32 ndestlen) int32 i=0; int32 i_cur_output=0; if (ndestlen<=0) // We cannot append terminate 0 at this case. return 0; /* ERROR_INSUFFICIENT_BUFFER */ unsigned char *pszsrc=(unsigned char *)szsrc; while (i<nsrclen) // 处理代理对 if (SIGMASK_3_1 <= pszsrc[i]) if (i+2<nsrclen && i_cur_output+1<ndestlen) strdest[i_cur_output++]=(wchar_t)(((wchar_t)pszsrc[i]<<12) (((wchar_t)pszsrc[i+1] & 0x3f)<<6) ((wchar_t)pszsrc[i+2] & 0x3f)); i += 3; else // 设置结束符 strdest[i_cur_output]=0; return 0; /* ERROR_INSUFFICIENT_BUFFER */ 11

37 Android 多媒体编程从初学到精通 else if (SIGMASK_2_1 <= pszsrc[i]) /* if (i+1<nsrclen && i_cur_output+1<ndestlen) strdest[i_cur_output++]=(wchar_t)(((wchar_t)pszsrc[i] & ~0xc0)<<6 ((wchar_t)pszsrc[i+1] & ~0x80)); i+=2; else // 设置结束符 strdest[i_cur_output]=0; / return 0; /* ERROR_INSUFFICIENT_BUFFER */ else /* 单个字节表示 */ if (i<nsrclen && i_cur_output+1<ndestlen) strdest[i_cur_output++]=(wchar_t)pszsrc[i]; ++i; else // 设置结束符 strdest[i_cur_output]=0; return 0; /* ERROR_INSUFFICIENT_BUFFER */ // 设置结束符 strdest[i_cur_output]=0; return i_cur_output;.3.6 A/V 同步 播放引擎在渲染 (Render) 多媒体数据时需要保持一个暂时的同步, 也就是通常所说的 A/V 同步 为了达到 A/V 同步, 需要如下信息 : 媒体回放的时钟 媒体数据的时间戳 从 Sink 中获取的时间信息 ( 比如从音频设备设定的特定的采样率来获取的播放速率 ) 等 1. 媒体时钟 PVMFMediaClock, 媒体时钟主要负责维持一个时间的引用, 从而保持媒体回放的节奏, 获取和实现媒体播放的同步 1) 时间源媒体时钟可以作为一个时间源提供给多媒体, 它本身可能来自于系统时钟或其他时间源 12

38 四多媒体框架 ( 如音频设备时钟 ) 它可以给多媒体提供一个时间基准, 同时来维护该时间基准 2) 时钟观察者媒体时钟可以把自己作为一个观察者, 来通知对象时钟状态的改变 以下接口实现了其作为观察者的角色 PVMFMediaClockObserver: 用来通知时钟基值, 时钟计数的更新, 时钟的调整 PVMFMediaClockStateObserver: 用来通知时钟状态的改变 PVMFMediaClockNotificationsObs: 用来获取回调通知 3)NPT 映射媒体时钟是一个单调递增的时钟, 而媒体在播放时却可能需要定位 (Seek) 到任意位置 为了控制媒体的播放, 使其正确渲染, 媒体时钟需要在媒体时钟时间和 NPT 之间维护一个 NPT ( Normal Play Time ) 映射, 任意对媒体播放位置的改变将会通知进行一次映射 媒体时钟和 NPT 之间的映射公式为 :NPT=(media_time ) ) 时钟的回调在媒体时钟上设置回调是组件采取动作的基础, 这些回调可以减少在时钟发生改变时, 组件自己需要设置它们的时钟的时间 媒体时钟采用输入特定时间窗口来取代绝对时间, 这样可以使处于竞争状态的任务或线程尽可能早的得到响应 5) 延迟处理当集成了多个不同媒体流的数据槽同时输出时, 每个槽都可能会有不同程度的延迟, 为了弥补不同媒体流之间的延迟从而同步播放, 就需要进行延迟处理 每个 Sink 都向媒体时钟注册自己的延迟, 最后由媒体时钟来调整最终调度的延迟 6)NPT 时钟转换当一个新的 NPT 开始时, 用户可以给媒体时间设置一个绝对时间 用户还可以任意调整 NPT 的方向 ( 如向前 向后 ) 2. 时间戳为了及时, 准确地输出媒体数据, 就不得不考虑媒体数据中包含的时间戳信息, 以及媒体回放时钟 如果时间戳值等于当前回放时间, 则媒体数据是同步的, 需要进行渲染 ; 如果时间戳小于当前回放时间, 则说明媒体数据到达时间晚了 ; 反之, 如果时间戳大于当前回放时间, 则说明媒体数据到达时间早了 如何处理这些来早的或来晚的媒体数据则取决于 PVPlayer 引擎的配置 在通常情况下, 来早的数据需要等待, 直到播放时间到达 ; 来晚的数据则会被丢弃而不被渲染, 但有时候来晚的数据也会被渲染 3. 同步音频音频数据的渲染通常不需要外部时钟来进行同步, 因为音频设备通常会被配置一定的采样率来消化音频数据 因此, 音频设备被配置的这个采样率通常也作为媒体回放时钟的速率 1) 渲染开始时的同步一旦媒体时钟开始后, 就必须要求媒体数据尽可能快地被渲染, 然而硬件在渲染时很可能需要额外的时间, 或者硬件需要等到更多的媒体数据被缓存 因此会导致媒体时钟的开始 13

39 Android 多媒体编程从初学到精通 时间与媒体数据真正被输出的时间不一致, 从而导致播放引擎报告给应用程序的播放进度与真实播放进度产生误差 为了解决这一问题, 在硬件没有开始输出媒体数据时, 将媒体时钟设置暂停状态, 当硬件开始输出媒体数据时, 给媒体时钟发一个消息来通知媒体时钟也开始运行 这样就可以保证在媒体时钟开始的时候, 媒体数据也开始进行输出 作为一个主动态的 MIO 组件, 无论时钟状态为暂停还是运行, 播放引擎都向 MIO 组件传送数据, 而 MIO 组件也应该继续接受和缓存数据, 并决定何时把数据发送到硬件 而作为一个被动态的 MIO 组件, 只有当时钟状态为运行时, 播放引擎才向 MIO 组件发送数据, 而接收到数据的 MIO 组件也需要将收到的数据立即发送给硬件 2) 重新定位后的同步当应用程序请求重新定位媒体播放位置时,MIO 组件和硬件缓存的数据需要被立即释放, 并且在新的位置开始播放 3) 播放中的同步尽管硬件消费数据的速率应该与媒体时钟的速率是一致的, 但他们毕竟是单独运行的, 因此不可避免会有一些不同 在通常情况下, 这中间的差距会很小, 然而随着播放的进行, 差距将会被积累, 最终导致不同步 因此, 为了控制短时间内播放时钟与音频输出进程差距在很小的范围内, 需要不时地调整两者之间的差, 使之小于一个特定的阈值. 同步视频与音频输出相比, 视频的输出需要参考一个时钟来决定何时输出一个特定的视频帧, 视频帧的输出要尽可能与该帧的时间戳保持一致 播放引擎维护了一个与音频播放同步的播放时钟, 因此一旦视频输出与播放时钟同步, 那么也就意味着视频输出与音频输出同步 5. 音视频同步音视频同步是音频同步和视频同步的终极目标 在播放引擎架构中, 媒体时钟需要调整以便与音频输出过程相一致, 而对于视频输出来说, 在输出一个视频帧时, 应使该帧的时间戳与媒体时钟同步 因此音频输出设备 视频帧的时间戳与媒体时钟的结合便构成了 A/V 同步 A/V 同步的具体实现, 在本书中不是介绍的重点, 这里就不再详述了 关于媒体时钟的内容请参考 external\opencore\pvmi\pvmf\src\pvmf_media_clock.cpp 文件 Stagefright 框架 Stagefright 框架是 Android 2.3 正式引入的多媒体框架, 其在 Android 2.0 中就已经添加到 Android 的代码库中 Stagefright 框架的引入对上层应用没有影响, 其接口在原生的多媒体服务中引入 static sp<mediaplayerbase> createplayer(player_type playertype, void* cookie, notify_callback_f notifyfunc) 1

40 case STAGEFRIGHT_PLAYER: LOGV(" create StagefrightPlayer"); p = new StagefrightPlayer; break; 四多媒体框架 Stagefright 框架和 opencore 框架切换非常简单, 目前 Stagefright 已经成为默认的媒体播放器 static player_type getdefaultplayertype() return STAGEFRIGHT_PLAYER; Stagefright 框架并没有完全抛弃 opencore 框架的内容, 而是封装了一个 OMX 层用于引用 opencore 的 OMX 组件部分 Stagefright 框架本身同样比较复杂, 下面分播放框架和记录框架两部分进行简要说明 1. 播放框架 Stagefright 的播放主要是围绕着 AwesomePlayer 进行的, Stagefright 播放框架的类图如 图 -28 所示 SoftwareRenderer StagefrightPlayer OMXCodec AwesomeEvent VideoRenderer AwesomePlayer MediaSource WAVExtractor AudioPlayer MPEGExtractor OggExtractor MediaExtractor MPEG2TSExtractor AMRExtractor MP3Extractor ARTSPController DRMExtractor MatroskaExtractor 图 -28 Stagefright 播放框架的类图 在 Stagefright 播放框架中,AwesomePlayer 是最重要的一个类, 如果支持硬件视频渲染, 则需要对 VideoRenderer 进行实现, 在 Qualcomm 平台上, 相应的类为 QComHardwareRenderer 如果不支持硬件视频渲染, 系统将采取软件渲染的方式, 相应的渲染类为 SoftwareRenderer 当然软件渲染会会造成系统性能的下降 也不支持高清视频 解析器的封装是通过 MediaExtractor 类进行的, 对于不同的多媒体格式, 针对 MediaExtractor 进行实现即可, 目前 Stagefright 支持的媒体播放格式包括 WAV OGG MP AMR MP3 等 AwesomePlayer 通过 AwesomeEvent 事件来驱动整个播放过程 15

<4D F736F F D20B5DA34D5C22020B6E0C3BDCCE5BFF2BCDC>

<4D F736F F D20B5DA34D5C22020B6E0C3BDCCE5BFF2BCDC> ANDROID 多媒体编程从初学到精通 作者 : 华清远见 第 4 章 多媒体框架 -- Windows DirectShow Linux GStearmer xine Linux Qtopia GStearmer Nokia Maemo Linux GStearmer Android OpenCORE Android 2.2 Android opencore stagefright opencore

More information

幻灯片 1

幻灯片 1 Android 的多媒体系统 Android 的多媒体系统 第一部分多媒体系统的结构 第二部分多媒体的各个层次 第三部分多媒体实现的核心部分 OpenCore 第一部分多媒体系统的结构 Android 的多媒体部分的框架涉及到应用层 JAVA 框架 C 语言框架 硬件抽象层等环节 多媒体主要包括两方面的内容 : 输入输出环节 ( 音频视频的输入输出 ) 中间处理环节 ( 编解码环节 ) 其中, 输入输出环节由其他方面的硬件抽象层实现,

More information

Android 的多媒体框架 OpenCore 介绍 分为几个阶段 : 1 整个 Android 的多媒体框架 OpenCore 2 Player 和 Author 的详细介绍 2 OpenCore 和 Android 其他部分的集成 第一部分 OpenCore 概述 OpenCore 的另外一个常

Android 的多媒体框架 OpenCore 介绍 分为几个阶段 : 1 整个 Android 的多媒体框架 OpenCore 2 Player 和 Author 的详细介绍 2 OpenCore 和 Android 其他部分的集成 第一部分 OpenCore 概述 OpenCore 的另外一个常 Android 的多媒体框架 OpenCore 介绍 分为几个阶段 : 1 整个 Android 的多媒体框架 OpenCore 2 Player 和 Author 的详细介绍 2 OpenCore 和 Android 其他部分的集成 第一部分 OpenCore 概述 OpenCore 的另外一个常用的称呼是 PacketVideo, 它是 Android 的多媒体核心 在防站的过程中, PacketVideo

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

声 明 本 公 司 及 全 体 董 事 监 事 高 级 管 理 人 员 承 诺 不 存 在 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 真 实 性 准 确 性 完 整 性 承 担 个 别 和 连 带 的 法 律 责 任 本 公 司 负 责 人 和 主 管 会 计 工 作 的

声 明 本 公 司 及 全 体 董 事 监 事 高 级 管 理 人 员 承 诺 不 存 在 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 真 实 性 准 确 性 完 整 性 承 担 个 别 和 连 带 的 法 律 责 任 本 公 司 负 责 人 和 主 管 会 计 工 作 的 声 明 本 公 司 及 全 体 董 事 监 事 高 级 管 理 人 员 承 诺 不 存 在 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 真 实 性 准 确 性 完 整 性 承 担 个 别 和 连 带 的 法 律 责 任 本 公 司 负 责 人 和 主 管 会 计 工 作 的 负 责 人 会 计 机 构 负 责 人 保 证 公 开 转 让 说 明 书 中 财 务 会 计 资

More information

第 3 章 数 据 在 计 算 机 中 的 表 示 43 在 进 位 计 数 制 中 有 数 码 数 位 ( 位 置 ) 基 数 和 位 权 等 用 语 数 码 是 在 一 个 计 数 制 中 用 来 表 示 数 值 的 符 号 ; 数 位 是 指 数 码 在 一 个 数 中 所 处 的 位 置 ;

第 3 章 数 据 在 计 算 机 中 的 表 示 43 在 进 位 计 数 制 中 有 数 码 数 位 ( 位 置 ) 基 数 和 位 权 等 用 语 数 码 是 在 一 个 计 数 制 中 用 来 表 示 数 值 的 符 号 ; 数 位 是 指 数 码 在 一 个 数 中 所 处 的 位 置 ; 第 3 章 数 据 在 计 算 机 中 的 表 示 3.1 数 据 与 数 制 计 算 机 中 使 用 的 数 据 一 般 可 以 分 为 两 大 类 : 数 值 数 据 和 字 符 数 据 数 值 数 据 常 用 于 表 示 数 的 大 小 与 正 负 ; 字 符 数 据 则 用 于 表 示 非 数 值 的 信 息, 例 如 : 英 文 汉 字 图 形 和 语 音 等 数 据 数 据 在 计 算

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

VIDEOJET connect 7000 VJC-7000-90 zh- CHS Operation Manual VIDEOJET connect 7000 zh-chs 3 目 录 1 浏 览 器 连 接 7 1.1 系 统 要 求 7 1.2 建 立 连 接 7 1.2.1 摄 像 机 中 的 密 码 保 护 7 1.3 受 保 护 的 网 络 7 2 系 统 概 述 8 2.1 实 况

More information

水晶分析师

水晶分析师 大数据时代的挑战 产品定位 体系架构 功能特点 大数据处理平台 行业大数据应用 IT 基础设施 数据源 Hadoop Yarn 终端 统一管理和监控中心(Deploy,Configure,monitor,Manage) Master Servers TRS CRYSTAL MPP Flat Files Applications&DBs ETL&DI Products 技术指标 1 TRS

More information

MPEG AVS AV AVS:JVT AVS

MPEG AVS AV AVS:JVT AVS AVS 2003 7 30 MPEG AVS AV AVS:JVT AVS HPA Customer site A HPA Customer site B Harmonic Enterprise 1 Customer site C / (MPEG, H26x, AVS) (ISMA) DVB DVD (S/C/T) (TCP/IP) MPEG MPEG VCD: MPEG-1(ISO/IEC 11172)

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

untitled

untitled T.sonic 820 ...1...1... 1...2...3...4... 4...4...4...4...4...5... 5 OLED...6... 6...7...7...7...8...8...8...8...8...8...8...8...8...8...9...9 /...9 A-B :...9...9 T.sonic 820...9...10... 10 MP3, WMA WMA-DRM10...10...11...11...12

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

ViewStick 2_UG_TC.pdf

ViewStick 2_UG_TC.pdf ViewStick 2 Wireless Presentation Gateway : VS16704 ViewSonic ViewSonic 25 ViewSonic ViewSonic ViewSonic 50 C (122 F) 0 C (32 F) 35 C (95 F) FCC FCC FCC / FCC ID FCC ID: GSS-VS15989 FCC 15 (1) (2) FCC

More information

SA29 Simplified Chinese user manual

SA29 Simplified Chinese user manual SA95 SA90 SA96 SA940 SA945 SA90 SA946 SA95 SA986 Philips Philips www.philips.com/welcome ? www.philips.com/welcome 6. 6. 6 7. 7. 8. 8.4 9.4. USB 9.4. 9.5 0.5. 0.6 0.6. 0.6. 0.6. 0 4 4. 4.. 4.. 4.. 4. 4

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Session Number VVT-291 Cisco ACNS / Microsoft WMT Don't Know None Others Investor relations Business to business collaboration Marketing events raining for customers and suppliers External communications

More information

* r p . 4 6 12 3 5 7 8 9bk bm btbsbrbqbp bo bn bl [ ] [ ] [ ] [ ] [SET] 1 2 3 4 5 6 7. cmcl ck 8 9 0 bk bl bm bn bo 1 2 1 2+ - bp bq 8 2 4 6 br r bs p bt ck cl cm 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

长 安 大 学 硕 士 学 位 论 文 基 于 数 据 仓 库 和 数 据 挖 掘 的 行 为 分 析 研 究 姓 名 : 杨 雅 薇 申 请 学 位 级 别 : 硕 士 专 业 : 计 算 机 软 件 与 理 论 指 导 教 师 : 张 卫 钢 20100530 长安大学硕士学位论文 3 1 3系统架构设计 行为分析数据仓库的应用模型由四部分组成 如图3 3所示

More information

使 用 本 说 明 书 感 谢 您 购 买 三 星 手 机 本 手 机 基 于 三 星 的 高 科 技 和 高 标 准, 为 您 提 供 高 品 质 的 移 动 通 信 和 娱 乐 享 受 本 使 用 说 明 书 专 门 用 于 指 导 您 了 解 手 机 的 功 能 与 特 性 使 用 手 机 之

使 用 本 说 明 书 感 谢 您 购 买 三 星 手 机 本 手 机 基 于 三 星 的 高 科 技 和 高 标 准, 为 您 提 供 高 品 质 的 移 动 通 信 和 娱 乐 享 受 本 使 用 说 明 书 专 门 用 于 指 导 您 了 解 手 机 的 功 能 与 特 性 使 用 手 机 之 SCH-S569 使 用 说 明 书 使 用 本 说 明 书 感 谢 您 购 买 三 星 手 机 本 手 机 基 于 三 星 的 高 科 技 和 高 标 准, 为 您 提 供 高 品 质 的 移 动 通 信 和 娱 乐 享 受 本 使 用 说 明 书 专 门 用 于 指 导 您 了 解 手 机 的 功 能 与 特 性 使 用 手 机 之 前, 请 先 仔 细 阅 读 本 说 明 书, 以 确 保 安

More information

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD Leica MC170 HD Leica MC190 HD 5 6 7 8 11 12 13 14 16 HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD 22 23 24 26 Leica MC170 HD Leica MC190 HD ( ) 28

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

54 15 ipod/iphone/mp3/psp/pda

54 15 ipod/iphone/mp3/psp/pda 54 15 ipod/iphone/mp3/psp/pda 21 38 35 PCuSER Contents Part 1...11 Trick 01...12 Trick 02...14 Trick 03...18 Trick 04...19 Trick 05 DVD-R/RW...21 Trick 06 DVD+R/RW...22 Trick 07 DVD-RAM...23 Trick 08 Doubler

More information

前 言 版 权 2012 Vivitek Corporation. 是 Vivitek Corporation 的 商 标 其 他 商 标 是 其 各 自 所 有 者 的 资 产 值 重 量 和 尺 寸 等 均 为 近 似 值 规 格 如 有 变 更, 恕 不 另 行 通 知 免 责 声 明 本 文

前 言 版 权 2012 Vivitek Corporation. 是 Vivitek Corporation 的 商 标 其 他 商 标 是 其 各 自 所 有 者 的 资 产 值 重 量 和 尺 寸 等 均 为 近 似 值 规 格 如 有 变 更, 恕 不 另 行 通 知 免 责 声 明 本 文 前 言 版 权 2012 Vivitek Corporation. 是 Vivitek Corporation 的 商 标 其 他 商 标 是 其 各 自 所 有 者 的 资 产 值 重 量 和 尺 寸 等 均 为 近 似 值 规 格 如 有 变 更, 恕 不 另 行 通 知 免 责 声 明 本 文 档 中 的 信 息 如 有 变 更, 恕 不 另 行 通 知 制 造 商 对 于 本 文 档 中 的

More information

Microsoft Word - fm.doc

Microsoft Word - fm.doc 多 媒 体 技 术 毕 业 设 计 指 导 与 案 例 分 析 贺 雪 景 杨 平 高 幼 年 编 著 清 华 大 学 出 版 社 北 京 内 容 简 介 本 书 通 过 六 个 案 例 介 绍 了 多 媒 体 专 业 毕 业 设 计 项 目 的 开 发, 包 括 使 用 Authorware 开 发 的 模 拟 型 课 件, 使 用 FrontPage2003 和 ASP 开 发 的 网 络 类

More information

untitled

untitled Sansa Fuze TM MP3 1-866-SANDISK (726-3475) www.sandisk.com/techsupport www.sandisk.com/sansa Fuze-8UM-CHS ... 3... 4 Sansa Fuze TM... 6... 6... 7... 7 Sansa Fuze... 7... 8... 9... 9... 10... 11... 11...

More information

四川省普通高等学校

四川省普通高等学校 四 川 省 普 通 高 等 学 校 计 算 机 应 用 知 识 和 能 力 等 级 考 试 考 试 大 纲 (2013 年 试 行 版 ) 四 川 省 教 育 厅 计 算 机 等 级 考 试 中 心 2013 年 1 月 目 录 一 级 考 试 大 纲 1 二 级 考 试 大 纲 6 程 序 设 计 公 共 基 础 知 识 6 BASIC 语 言 程 序 设 计 (Visual Basic) 9

More information

AXIS P7224 Video Encoder Blade – Installation Guide

AXIS P7224 Video Encoder Blade – Installation Guide 安 装 指 南 AXIS P7224 刀 片 视 频 编 码 器 中 文 法 律 考 虑 事 项 视 频 和 音 频 监 视 可 能 会 受 法 律 限 制, 各 个 国 家 / 地 区 的 法 律 会 有 所 不 同 如 将 本 产 品 用 于 监 控 目 的, 需 要 先 检 查 是 否 符 合 你 所 在 区 域 内 的 法 律 规 定 本 产 品 包 括 四 个 (4) H.264 解 码

More information

SA1MXX Chinese user manual

SA1MXX Chinese user manual Register your product and get support at www.philips.com/welcome SA1MXX02B SA1MXX02KN SA1MXX02K SA1MXX04KN SA1MXX02W SA1MXX04B SA1MXX04K SA1MXX04P SA1MXX04W SA1MXX04WS SA1MXX08K 1 2 2 3 2 Digital Audio

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

ebook140-8

ebook140-8 8 Microsoft VPN Windows NT 4 V P N Windows 98 Client 7 Vintage Air V P N 7 Wi n d o w s NT V P N 7 VPN ( ) 7 Novell NetWare VPN 8.1 PPTP NT4 VPN Q 154091 M i c r o s o f t Windows NT RAS [ ] Windows NT4

More information

audiogram3 Owners Manual

audiogram3 Owners Manual USB AUDIO INTERFACE ZH 2 AUDIOGRAM 3 ( ) * Yamaha USB Yamaha USB ( ) ( ) USB Yamaha (5)-10 1/2 AUDIOGRAM 3 3 MIC / INST (XLR ) (IEC60268 ): 1 2 (+) 3 (-) 2 1 3 Yamaha USB Yamaha Yamaha Steinberg Media

More information

SA054 Chinese user manual

SA054 Chinese user manual SA05404K SA05408K SA0546K Philips Philips Philips www.philips.com/welcome www.philips.com/welcome ii 3 2 6 2. 6 2.2 6 3 7 3. 7 3.2 8 3.3 8 3.4 9 3.4. USB 9 3.4.2 9 3.5 0 3.6 0 3.6. 0 3.6.2 0 3.6.3 0 4

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

前 言 版 权 2014 Vivitek Corporation. 是 Vivitek Corporation 的 商 标 其 他 商 标 是 其 各 自 所 有 者 的 资 产 值 重 量 和 尺 寸 等 均 为 近 似 值 规 格 如 有 变 更, 恕 不 另 行 通 知 免 责 声 明 本 文

前 言 版 权 2014 Vivitek Corporation. 是 Vivitek Corporation 的 商 标 其 他 商 标 是 其 各 自 所 有 者 的 资 产 值 重 量 和 尺 寸 等 均 为 近 似 值 规 格 如 有 变 更, 恕 不 另 行 通 知 免 责 声 明 本 文 前 言 版 权 2014 Vivitek Corporation. 是 Vivitek Corporation 的 商 标 其 他 商 标 是 其 各 自 所 有 者 的 资 产 值 重 量 和 尺 寸 等 均 为 近 似 值 规 格 如 有 变 更, 恕 不 另 行 通 知 免 责 声 明 本 文 档 中 的 信 息 如 有 变 更, 恕 不 另 行 通 知 制 造 商 对 于 本 文 档 中 的

More information

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0 SDChain-Matrix 节点搭建指南 目录 1 环境要求... 3 2 软件下载... 4 3 安装部署... 4 3.1 部署可执行程序目录... 4 3.2 部署配置文件目录... 4 3.3 部署数据库文件目录... 4 3.4 部署日志文件目录... 4 3.5 部署依赖库文件目录... 4 4 配置参数... 5 5 启动运行... 7 5.1 普通模式启动... 7 5.2 加载启动模式...

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

CA-C750К

CA-C750К 1 3 3 4 PC 4 USB 5 5 6 8 9 11 mediasync Manager?...13 mediasync Manager 15 25 38 39 41 41 DRM...44 Image Manager...44 47 49 49 50 50 51 51 51 52 / 52 A-B 53 MP3 53 /FM 54 FM 55 FM 55 BMP56 56 57 57 58

More information

复件 Chinese usermanual android tv box

复件 Chinese usermanual android tv box Android TV Box User Manual 産 品 說 明 書 型 號 : TD-Q8 序 言 非 常 感 謝 您 選 擇 安 卓 多 媒 體 播 放 器, 爲 了 方 便 您 盡 快 熟 悉 使 用, 我 們 爲 您 配 備 了 用 戶 使 用 說 明 書, 在 使 用 前 請 認 真 閱 讀 並 妥 善 保 存, 以 備 參 考 聲 明 本 産 品 內 含 自 動 聯 網 功 能, 該

More information

ÿþ

ÿþ 100 15 http://www.cyberlink.com 886-2-8667-1298 886-2-8667-1385 Copyright (C) 2014 CyberLink Corporation. All rights reserved. ...1...1...1...3...3...3...4...4...7...7...8...9...9...10...12...13...14...17...17...18...19...21...21

More information

/ 212ºF (100ºC) 2 UL CR2032 DL2032 3 Wave SoundTouch SoundTouch SoundTouch Bose / 3 Bose Corporation 1999/5/EC 32ºF (0 C) 113

/ 212ºF (100ºC) 2 UL CR2032 DL2032 3 Wave SoundTouch SoundTouch SoundTouch Bose / 3 Bose Corporation 1999/5/EC  32ºF (0 C) 113 Owner s Guide / 212ºF (100ºC) 2 UL CR2032 DL2032 3 Wave SoundTouch SoundTouch SoundTouch Bose / 3 Bose Corporation 1999/5/EC www.bose.com/compliance. 32ºF (0 C) 113ºF (45 C) 1 EN/IEC 60825 CD 1 1 CLASS

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

<4D6963726F736F667420576F7264202D20B3C9B6BCBCD1B7A2B0B2CCA9BFC6BCBCB9C9B7DDD3D0CFDEB9ABCBBECAD7B4CEB9ABBFAAB7A2D0D0B9C9C6B1B2A2D4DAB4B4D2B5B0E5C9CFCAD0D5D0B9C9CBB5C3F7CAE9A3A8C9EAB1A8B8E5A3A9B1A8CBCDC8D5C6DAA3BA32303135C4EA36D4C23136C8D52E6

<4D6963726F736F667420576F7264202D20B3C9B6BCBCD1B7A2B0B2CCA9BFC6BCBCB9C9B7DDD3D0CFDEB9ABCBBECAD7B4CEB9ABBFAAB7A2D0D0B9C9C6B1B2A2D4DAB4B4D2B5B0E5C9CFCAD0D5D0B9C9CBB5C3F7CAE9A3A8C9EAB1A8B8E5A3A9B1A8CBCDC8D5C6DAA3BA32303135C4EA36D4C23136C8D52E6 创 业 板 风 险 提 示 声 明 : 本 次 股 票 发 行 后 拟 在 创 业 板 市 场 上 市, 该 市 场 具 有 较 高 的 投 资 风 险 创 业 板 公 司 具 有 业 绩 不 稳 定 经 营 风 险 高 退 市 风 险 大 等 特 点, 投 资 者 面 临 较 大 的 市 场 风 险 投 资 者 应 充 分 了 解 创 业 板 市 场 的 投 资 风 险 及 公 司 所 披 露 的

More information

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品 Autodesk Product Design Suite Standard 20122 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品设计 Autodesk Product Design Suite Standard 版本包包括以下软件产产品

More information

Microsoft Word - 第1章 Android基本概念.docx

Microsoft Word - 第1章 Android基本概念.docx Android 系 统 下 Java 编 程 详 解 作 者 : 华 清 远 见 第 1 章 Android 基 本 概 念 本 章 简 介 本 章 主 要 介 绍 Android 基 本 概 念 方 面 的 内 容, 包 括 Android 平 台 特 性 Android 系 统 架 构 Android 开 发 框 架 和 Android 开 发 环 境 搭 建 1.1 Android 简 介 Android

More information

1. ( B ) IT (A) (B) (C) (D) 2. ( A ) (A) (B) (C) (D) 3. ( B ) (A) GPS (B) GIS (C) ETC (D) CAI 4. ( D ) (A) (B) (C) (D) 5. ( B ) (Stored Program) (A) H

1. ( B ) IT (A) (B) (C) (D) 2. ( A ) (A) (B) (C) (D) 3. ( B ) (A) GPS (B) GIS (C) ETC (D) CAI 4. ( D ) (A) (B) (C) (D) 5. ( B ) (Stored Program) (A) H ... 2... 4... 6... 8... 10... 12... 14... 16... 18... 20... 22... 24... 25... 26... 28 1. ( B ) IT (A) (B) (C) (D) 2. ( A ) (A) (B) (C) (D) 3. ( B ) (A) GPS (B) GIS (C) ETC (D) CAI 4. ( D ) (A) (B) (C)

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

OK dvp5990k_93_cs.indd :41:08

OK dvp5990k_93_cs.indd :41:08 56......... dvp5990k_93_cs.indd 56 2008-3-25 16:41:08 57............ OK............ dvp5990k_93_cs.indd 57 2008-3-25 16:41:08 58 dvp5990k_93_cs.indd 58 2008-3-25 16:41:09 DVD 1 2 3 4 5 6 7 8 9 a 1 f u

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

untitled

untitled IP Video 9100(A) IP VIDEO 9100(A) 說 IP Video 9100(A) 說 : V2.38 : 2006.11-1 - FCC CE 1. IP Video 9100(A). 2. IP Video 9100(A).. 3. 4. 9100(A) 5. 9100(A) - 2 - IP VIDEO 9100(A) 說 1.... 4... 2.... 5......

More information

TD

TD *TD-000212-05* 20- 应用实例 4 本例显示的是使用两个亚低 音扬声器和多个顶箱的双声 道 立体声 设置 除了各声道都增加了一个顶 箱外 也可以增加更多的顶 箱 本例和例 3 的情况一 致 声道 2 或 右声道 声道 1 或 左声道 要接到更多的顶箱 将最后 一个顶箱的全幅线路输出接 头处的线缆接到下一个顶箱 的全幅线路输入接头 在不 降低信号质量的情况下 最

More information

WD TV Live Streaming Media Player User Manual

WD TV Live Streaming Media Player User Manual WD TV 流 媒 体 播 放 器 Live 目 录 1 重 要 用 户 信 息................................. 1 重 要 安 全 说 明......................................... 1 WD 服 务 与 支 持........................................ 2 记 录 您 的 WD 产 品

More information

2009 年第 6 期 高清总动员 35

2009 年第 6 期 高清总动员 35 要说 08 年最成功的高清机, 非三合一 F1/F2 莫属 它集中了国内不同的高清接收需求, 整合了当时能想到的各种功能, 为欣赏高清奥运, 满足高端发烧人士, 做出了贡献 F1/F2 的成功, 说明不依赖进口, 我们也有能力打造顶级的高清机, 并且更适合国内的使用习惯 不过, 即使 F1/F2 的终极版, 也不兼容 ABS-S 或 ISDB-S, 没有网络功能, 不能 USB 录像等等, 有一定的局限性

More information

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc 在 VMWare-5.5+RedHat-9 下建立 本机 QTopia-2.1.1 虚拟平台 张大海 2008-5-9 一 资源下载 1. 需要以下安装包 : tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2.tar.gz qt-x11-free-3.3.4.tar.gz

More information

Microsoft Word - 2010第11期_总167期__0.3.doc

Microsoft Word - 2010第11期_总167期__0.3.doc 利 用 DLNA/UPnP 提 供 融 合 的 数 字 家 庭 生 活 王 劲 松 摘 要 : 本 文 介 绍 了 一 个 综 合 的 数 字 家 庭 应 用 场 景, 涉 及 通 信 计 算 机 和 广 播 电 视 行 业, 并 由 此 引 出 DLNA/UPnP 对 数 字 家 庭 生 活 的 支 持 DLNA/UPnP 协 议 是 构 建 在 IP 协 议 之 上, 并 完 成 家 庭 网 络

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

epub 61-2

epub 61-2 2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +

More information

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

/ 2 UL CR2032 DL F (100 C) / CLASS 1 KLASSE 1 LUOKAN 1 KLASS 1 LASER PRODUCT LASER PRODUKT LASER LA

/ 2 UL CR2032 DL F (100 C) / CLASS 1 KLASSE 1 LUOKAN 1 KLASS 1 LASER PRODUCT LASER PRODUKT LASER LA Owner s Guide ค ม อผ ใช 사용자안내서 用户指南 使用者指南 دليل المالك WAVE SOUNDTOUCH SERIES IV WIRELESS MUSIC SYSTEM / 2 UL CR2032 DL2032 3 212 F (100 C) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. / 11. 12. 1 CLASS 1 KLASSE 1 LUOKAN

More information

X713_CS_Book.book

X713_CS_Book.book / / /USB ) ; ; C D ; ; B B 1 >> 2 3 B 1 ( > > ) 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 GSM GPS ( ) 手机已连接到 GSM 网络 指示条越多, 接收质量越好 GPS 2 ...........................4.............................. 4 Micro SD (

More information

计算机网络实验说明

计算机网络实验说明 计算机网络实验说明 龚旭东 电三楼 420 lzgxd@mailustceducn 2011 年 11 月 1 日 龚旭东 (TA) 计算机网络实验说明 2011 年 11 月 1 日 1 / 20 Outline 1 实验系统介绍 实验环境实验流程 2 实验内容编程实验交互实验观察实验 3 一些控制台命令 4 实验报告说明 龚旭东 (TA) 计算机网络实验说明 2011 年 11 月 1 日 2

More information

ebook140-9

ebook140-9 9 VPN VPN Novell BorderManager Windows NT PPTP V P N L A V P N V N P I n t e r n e t V P N 9.1 V P N Windows 98 Windows PPTP VPN Novell BorderManager T M I P s e c Wi n d o w s I n t e r n e t I S P I

More information

上海市教育考试院关于印发新修订的

上海市教育考试院关于印发新修订的 沪 教 考 院 社 考 2012 7 号 上 海 市 教 育 考 试 院 关 于 印 发 上 海 市 高 等 学 校 计 算 机 等 级 考 试 大 纲 (2012 年 修 订 ) 的 通 知 各 有 关 高 校 : 为 进 一 步 加 强 本 市 高 校 计 算 机 基 础 教 学 工 作, 推 进 学 校 更 加 科 学 合 理 地 设 置 计 算 机 基 础 课 程 及 安 排 教 学 内 容,

More information

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco Windows RTEMS 1 Danilliu MMI TCP/IP 80486 QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos ecos Email www.rtems.com RTEMS ecos RTEMS RTEMS Windows

More information

FPGAs in Next Generation Wireless Networks WPChinese

FPGAs in Next Generation Wireless Networks WPChinese FPGA 2010 3 Lattice Semiconductor 5555 Northeast Moore Ct. Hillsboro, Oregon 97124 USA Telephone: (503) 268-8000 www.latticesemi.com 1 FPGAs in Next Generation Wireless Networks GSM GSM-EDGE 384kbps CDMA2000

More information

01

01 ZEBRA 技术白皮书 条码编码 101 相关知识介绍 引言 20 70 数据 80 20 90 (JIT) AIAG EIA HIBCC HAZMAT 条码的优势提高数据准确性 99% 85% / / 提升效率 / 2 Zebra Technologies 保持一致性 ID 改进库存和资产管理 成本 / 效益分析 ID ID ID (ERP) RFID Zebra Technologies 3 ID

More information

ltu

ltu 資 訊 管 理 系 學 齡 前 自 主 學 習 之 行 動 裝 置 輔 助 系 統 指 導 教 授 : 李 靜 怡 教 授 組 員 名 單 : 蔡 承 育 988C012 黃 佳 誼 988C026 鄭 亦 琦 988C060 廖 曼 伶 988C108 中 華 民 國 1 0 2 年 5 月 嶺 東 科 技 大 學 資 訊 管 理 系 學 齡 前 自 主 學 習 之 行 動 裝 置 輔 助 系 統

More information

<4D6963726F736F667420576F7264202D203230303930373037B9E3B6ABCAA1CBAEC0FBB9A4B3CCCAD3C6B5BCE0BFD8CFB5CDB3BCBCCAF5B9E6B7B6A3A8CAD4D0D0A3A9C7A9B7A22E646F63>

<4D6963726F736F667420576F7264202D203230303930373037B9E3B6ABCAA1CBAEC0FBB9A4B3CCCAD3C6B5BCE0BFD8CFB5CDB3BCBCCAF5B9E6B7B6A3A8CAD4D0D0A3A9C7A9B7A22E646F63> 广 东 省 水 利 信 息 化 技 术 规 范 广 东 省 水 利 工 程 视 频 监 控 系 统 技 术 规 范 ( 试 行 ) 二 九 年 七 月 广 东 省 水 利 厅 前 言 广 东 省 水 利 工 程 视 频 监 控 系 统 技 术 规 范 ( 下 称 本 规 范 ) 是 广 东 省 水 利 信 息 化 技 术 规 范 之 一, 根 据 广 东 省 水 利 信 息 化 发 展 的 需 要

More information

Nero 手册 <应用程序>

Nero 手册 <应用程序> Nero Burning ROM 手 册 Nero AG 版 权 和 商 标 信 息 Nero Burning ROM 手 册 及 其 所 有 内 容 受 版 权 保 护 并 且 归 Nero AG 所 有 保 留 所 有 权 利 本 手 册 包 含 受 国 际 有 效 版 权 保 护 的 材 料 未 经 Nero AG 明 确 书 面 许 可, 不 得 复 制 传 播 或 转 录 本 手 册 的

More information

03 最 新 計 算 機 概 論 3-1 文 字 表 示 法 (multimedia) (text) (image) (audio) (video) (text) (bit pattern) 01010101 11111111 ASCII (American Standard Code for In

03 最 新 計 算 機 概 論 3-1 文 字 表 示 法 (multimedia) (text) (image) (audio) (video) (text) (bit pattern) 01010101 11111111 ASCII (American Standard Code for In 03 最 新 計 算 機 概 論 3-1 3-2 3-3 3-4 3-5 3-6 03 最 新 計 算 機 概 論 3-1 文 字 表 示 法 (multimedia) (text) (image) (audio) (video) (text) (bit pattern) 01010101 11111111 ASCII (American Standard Code for Information

More information

2_dvdr3380_97_CT_21221b.indd

2_dvdr3380_97_CT_21221b.indd 64 65 66 ALL 3 67 a STANDBY-ON 2 a b c d e f g h i j k l b TIMER c SYSTEM-MENU d e SELECT f REC g. > h TOP MENU i ANGLE j RETURN k SUBTITLE l REC MODE 68 m n REC SOURCE o DISC-MENU p OK q EDIT r PLAYÉ

More information

卷首语

卷首语 四 川 大 学 S- 赛 沃 邦 2009 年 11 月 11 日 1 第 一 章 团 队 简 介... 3 第 二 章 执 行 摘 要... 3 2.1 团 队 使 命... 3 2.2 营 销 经 营 目 标... 4 2.3 面 临 地 主 要 挑 战... 4 2.4 核 心 竞 争 力 ( 关 键 成 功 因 素 )... 4 2.5 整 体 行 动 计 划... 5 第 三 章 环 境

More information

Leica IC90 E Leica IC90 E: USB 20 HDMI 22 SD () CLR ( ) 30 CLR ( ) 31 EXPSURE () 32 RESLUTIN ( ) 33 SETUP CAMER

Leica IC90 E Leica IC90 E: USB 20 HDMI 22 SD () CLR ( ) 30 CLR ( ) 31 EXPSURE () 32 RESLUTIN ( ) 33 SETUP CAMER Leica IC90 E 4 5 6 10 Leica IC90 E 12 13 Leica IC90 E: 14 16 18 USB 20 HDMI 22 SD 24 25 () 27 28 29 CLR ( ) 30 CLR ( ) 31 EXPSURE () 32 RESLUTIN ( ) 33 SETUP CAMERA ( ) 34 SETUP USER 35 SETUP ETHERNET

More information

使 用 本 说 明 书 感 谢 您 选 购 三 星 手 机 本 手 机 基 于 三 星 的 高 科 技 和 高 标 准, 为 您 提 供 极 高 品 质 的 移 动 通 信 和 娱 乐 享 受 本 使 用 说 明 书 专 门 用 于 指 导 您 了 解 手 机 的 功 能 与 特 性 请 先 阅 读

使 用 本 说 明 书 感 谢 您 选 购 三 星 手 机 本 手 机 基 于 三 星 的 高 科 技 和 高 标 准, 为 您 提 供 极 高 品 质 的 移 动 通 信 和 娱 乐 享 受 本 使 用 说 明 书 专 门 用 于 指 导 您 了 解 手 机 的 功 能 与 特 性 请 先 阅 读 SCH-I559 使 用 说 明 书 使 用 本 说 明 书 感 谢 您 选 购 三 星 手 机 本 手 机 基 于 三 星 的 高 科 技 和 高 标 准, 为 您 提 供 极 高 品 质 的 移 动 通 信 和 娱 乐 享 受 本 使 用 说 明 书 专 门 用 于 指 导 您 了 解 手 机 的 功 能 与 特 性 请 先 阅 读 说 明 文 件 使 用 手 机 之 前, 请 先 仔 细 阅

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

政府機關資訊通報第295期(5月)

政府機關資訊通報第295期(5月) 第 295 期 101 年 5 月 5 日出版 財政部文書檔管系統(公文線上簽核) 推展簡介 雲端虛擬化平台於臺中市政府資訊中心之 建置與應用 考選部 國家考試試務整合性管理系統 簡介 全國首創第四級之高雄土地利用調查 作業特點 統整式知識內容管理系統建構實務 考選部行政系統整合平台暨 線上申辦及薪資差勤系統 建置經驗分享 目 次 機 關 動 態... 1 法 務 部 調 查 局... 1 內 政

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

ICS 13.310 A 91 SZDB/Z 深 圳 市 标 准 化 指 导 性 技 术 文 件 SZDB/Z 158 2015 交 通 运 输 行 业 视 频 监 控 联 网 系 统 通 用 技 术 要 求 General technical specification for video monitoring network system of transportation industry in

More information

Microsoft Word zw

Microsoft Word zw 第 1 章 Android 概述 学习目标 : Android Android Android Studio Android Android APK 1.1 1. 智能手机的定义 Smartphone 2. 智能手机的发展 1973 4 3 PC IBM 1994 IBM Simon PDA PDA Zaurus OS 1996 Nokia 9000 Communicator Nokia 9000

More information

特别关注 图2 视频和音频储存媒体所用DRM技术案例* * 图1 DVD采用的DRM技术和其流程案例 *目标是保护刻录完成的DVD内容 是版权持有者对数字内容复制方 式对策的需求 以终端设备厂家为中心 开发内容加密方式CSS Content Scrambling System 内容加扰系统 引入到D

特别关注 图2 视频和音频储存媒体所用DRM技术案例* * 图1 DVD采用的DRM技术和其流程案例 *目标是保护刻录完成的DVD内容 是版权持有者对数字内容复制方 式对策的需求 以终端设备厂家为中心 开发内容加密方式CSS Content Scrambling System 内容加扰系统 引入到D * 流 媒 体 国 际 标 准 化 DRM 技 术 动 态 综 述 李 颖 白 海 燕 王 莉 乔 晓 东 / 中 国 科 学 技 术 信 息 研 究 所 北 京 100038 摘 要 :DRM 既 是 内 容 流 通 领 域 的 重 要 技 术, 也 是 确 保 同 时 满 足 内 容 的 创 作 者 提 供 商 用 户 等 不 同 角 色 需 求 这 一 复 杂 流 通 环 境 的 必 要 技

More information

untitled

untitled IP Video 9100B-RS IP VIDEO 9100(B) 說 IP Video 9100B-RS 說 : 2.39-RS : 2007.1-1 - FCC CE 1. IP Video 9100B-RS. 2. IP Video 9100B-RS. 3. 4. 9100B-RS 5. 9100B-RS - 2 - IP VIDEO 9100(B) 說 1.... 4... 2.... 5

More information

AndroidUsersGuide.book

AndroidUsersGuide.book Android 2.3 2010 12 13 Android 2.3 2 Copyright 2010 Google Inc. Google Google Android Nexus Nexus Nexus S Nexus S Android Market Android Market Gmail Google Apps Google Google Checkout Google Google Google

More information

<4D6963726F736F667420576F7264202D20C9CFBAA3CAD0BCC6CBE3BBFAB5C8BCB6BFBCCAD4C8FDBCB6BFBCCAD4B4F3B8D95FBDA8D2E9B8E55F5F303632352E646F63>

<4D6963726F736F667420576F7264202D20C9CFBAA3CAD0BCC6CBE3BBFAB5C8BCB6BFBCCAD4C8FDBCB6BFBCCAD4B4F3B8D95FBDA8D2E9B8E55F5F303632352E646F63> 上 海 市 高 等 学 校 计 算 机 等 级 考 试 ( 三 级 ) 考 试 大 纲 -- 建 议 稿 -- 2007-6-25 25 目 录 上 海 市 高 等 学 校 计 算 机 等 级 考 试 三 级 总 体 说 明 -----------------1 三 级 ( 计 算 机 系 统 与 网 络 技 术 ) 考 试 大 纲 ---------------------2 三 级 ( 管 理

More information

01-43_dvp3146K_98_eng1.indd

01-43_dvp3146K_98_eng1.indd 44 47 47 V04_Draft_ VP3146k_98_ CHNin44 44 2007-2-2 15:26:52 45 V04_Draft_ VP3146k_98_ CHNin45 45 2007-2-2 15:26:52 ! 5cm (20") 10cm (40") 10cm (40") 5cm (20") 46 V04_Draft_ VP3146k_98_ CHNin46 46 2007-2-2

More information

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech - OfficeCoder 1 2 3 4 1,2,3,4 xingjiarong@mail.sdu.edu.cn 1 xuchongyang@mail.sdu.edu.cn 2 sun.mc@outlook.com 3 luoyuanhang@mail.sdu.edu.cn 4 Abstract. Microsoft Word 2013 Word 2013 Office Keywords:,, HTML5,

More information

UX-J51_UF

UX-J51_UF MICRO COMPONENT SYSTEM UX-J51 CA-UXJ51 SP-UXJ51 TM INSTRUCTIONS GVT0294-005A [UF] STANDBY MAINS STANDBY STANDBY 1. 2. 1. 2. 3. 1M 4. 2 [ ] 1. 2. 3. 10 cm 10 5 Pb Hg Cd Cr (VI) PBB PBDE X O O X O O X O

More information

2014 年 87 月 259 日 K-HW508K / HW516K K-NL408K / NL416K 最新固件版本 :V3.200 容量 供应商 系列 型号 格式 可用性 兼容性能 备注 500G Seagate Pipeline HD2 ST CS - 可用 Seagate Pi

2014 年 87 月 259 日 K-HW508K / HW516K K-NL408K / NL416K 最新固件版本 :V3.200 容量 供应商 系列 型号 格式 可用性 兼容性能 备注 500G Seagate Pipeline HD2 ST CS - 可用 Seagate Pi 纠正点从 2014 年 5 月 12 日的版本开始 我们缺少的 4TB 硬盘的型号 : WJ-ND400 / 和 WJ-HD616K / WJ-716K / WJ-ND400 WJ-HD616K WJ-HD716K 4TB 红 40PURX-64GVNY0 AF OK 4TB 红 40EFRX-68WT0N0 AF OK 纠正点 1 2014 年 87 月 259 日 K-HW508K / HW516K

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

eHELP_asia_TW_pro4-2(WT60W)_0415.indb

eHELP_asia_TW_pro4-2(WT60W)_0415.indb 請 先 讀 我 代 表 意 義 及 操 作 O K 方 塊 中 的 字 母 代 表 遙 控 器 按 鍵 Menu 青 綠 色 字 母 代 表 螢 幕 顯 示 項 目 此 e 導 覽 中 的 參 考 返 回 向 前 跳 至 選 單 項 目 本 e 導 覽 中 的 圖 示 僅 為 示 意 圖 觀 賞 我 的 首 頁 資 訊 我 的 首 頁 是 連 接 到 如 電 視 應 用 程 式 等 的 入 口 頁

More information

系统架构 - 模块划分 功能 状态机 H265 主要的模块 : 1. 顶层模块 H265ENC_top 包括 sys_ctrl,enc_core 及 fetch 三个模块 2. sys_ctrl 就是一个状态机, 控制 fetch 和 enc_core 中各子模块的工作 3. enc_core 编码

系统架构 - 模块划分 功能 状态机 H265 主要的模块 : 1. 顶层模块 H265ENC_top 包括 sys_ctrl,enc_core 及 fetch 三个模块 2. sys_ctrl 就是一个状态机, 控制 fetch 和 enc_core 中各子模块的工作 3. enc_core 编码 3.1 系统架构与模块仿真文件 作者 : 江亲炜 日期 :2017/1/8 系统架构 - 模块划分 功能 状态机 H265 主要的模块 : 1. 顶层模块 H265ENC_top 包括 sys_ctrl,enc_core 及 fetch 三个模块 2. sys_ctrl 就是一个状态机, 控制 fetch 和 enc_core 中各子模块的工作 3. enc_core 编码器的核心 4. 存取 cur_pixel

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

Symbian多媒体架构分析

Symbian多媒体架构分析 多媒体应用开发 要内容 多媒体框架 (MMF) 客户端 API 音频程序开发视频程序开发摄像头使用 媒体框架 (MMF) 客户端 API 放音调 播放音调 (1) 指定周期和频率的简单声音 (2)DTMF( 双音多频 ) 电话信号声音 (3) 存储在文件或描述中的声音序列 (4) 在手机中的预定义的声音序列 放音调 框架 放音调 播放音调工具类 CMdaAudioToneUtility 侦听器接口类

More information

RunPC2_.doc

RunPC2_.doc PowerBuilder 8 (5) PowerBuilder Client/Server Jaguar Server Jaguar Server Connection Cache Thin Client Internet Connection Pooling EAServer Connection Cache Connection Cache Connection Cache Connection

More information

1. 基本概念 作业 (job) 一次多媒体操作称之为一个作业, 一次多媒体请求里可以包含多个作业 容器 (container) 多媒体文件的格式 编码器 (codec) 音视频文件的编码格式 搜狐多媒体服务支持转码格式 Container Audio Codecs Video Codecs fla

1. 基本概念 作业 (job) 一次多媒体操作称之为一个作业, 一次多媒体请求里可以包含多个作业 容器 (container) 多媒体文件的格式 编码器 (codec) 音视频文件的编码格式 搜狐多媒体服务支持转码格式 Container Audio Codecs Video Codecs fla 搜狐云台多媒体服务 Java SDK User Guide 搜狐云台多媒体服务 Java SDK User Guide 欢迎使用 1. 基本概念 2.Media java 客户端 2.1 初始化客户端 2.2 初始化客户端 3.Job 操作 3.1 创建 Job 3.2 查询 Job 3.3 取消 Job 3.4 检验 job 参数 欢迎使用 本文档是搜狐多媒体服务提供的开发者指南文档 本文档并不会详细描述

More information