opencore官方文档中文版.docx
- 文档编号:29537573
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:14
- 大小:94.99KB
opencore官方文档中文版.docx
《opencore官方文档中文版.docx》由会员分享,可在线阅读,更多相关《opencore官方文档中文版.docx(14页珍藏版)》请在冰豆网上搜索。
opencore官方文档中文版
1.简介
本文档为PVPlayer开发者提供详细的SDK开发信息.包括媒体信息的层次结构,流程的控制和数据流图,状态机,错误处理,异步事件的处理,以及用例场景。
该文档还包括在android平台下调试的相关介绍。
PVPlayerSDK定义
PVPlayerSDKisasetofcomponentsandmodulesthatallowssynchronizedplaybackofmultimediapresentations.Amultimediapresentationisdefinedasacollectionofvariousmediathatarerenderedtogetherinsomesortofasynchronousmanner.Thiscouldbeintheformofafileencodedintoaspecific
format(likeMP4,3GPP),aliveRTSPstreamingsession,oraSMILpresentationoranyotherform.
Inadditiontostandardplaybackfeaturessuchasrepositioningandvolumecontrol,PVPlayerSDKoffers
moresophisticatedfeaturessuchasdownloadingofcontentandplaybackofcontentasitisbeing
downloaded.TheamountoffeaturescontainedinaparticularPVPlayerSDKdependsonthe
requirements,designdecisions,andlimitationsimposedbytheplatformsandchosendesign.
PVPlayerSDK使用范围
PVPlayerSDKincludesallcomponentsneededtosatisfythedefinitionabovebutexcludestheapplication(graphicalorcommand-line)whichusesthePVPlayerSDK,theoperatingsystemorplatformthatPVPlayerSDKrunsonanddatasources.multimediafile,streamingserver)andsinks.audiodevice,display)forthemultimediapresentation.ThescopeofPVPlayerSDKcouldbefurtherreducedforparticularplatformwithparticularfeaturesets,butthisdocumentcoversthelargestextentofPVPlayerSDK.PVPlayerSDKiscomposedofandutilizesothercomponentsfromPacketVideo.OSCL,PVMFnodes)socertaindetailsmightbereferredtoanotherdocument.
2.高层次设计(HLD)
简介和局限性
PVPlayerSDK包含所有必要的特点来支持这个要求先前的部分。
这个特性的要求是被设计来处理的很全面的应用程序。
这个模块结构和设计的扩展提供了便利的机制,不过由于opencore的复杂性,相对起MPLAYER,VLC等多媒体播放器来说,扩展格式相对麻烦点。
而且PVPlayer在新版本和升级PVPlayer的SDK里,可能会有不兼容的BUG。
开发环境和工具
PVPlayerSDK是c++语言实现的,所以它需要ANSIC++开发工具支持平台。
不过对于开发者不要求每个特征定义为c++标准。
例如,RTTI异常处理。
然而,C++编译环境是必需的,在Android环境中用的是G++编译,PVPlayerSDK也需要另一种类型的接口(例如。
C,Java),PVPlayerSDK提供了一种适配接口,但内部部件还需在c++环境下编译.
PVPlayerSDK源代码是基于PacketVideo的操作系统(OSCL)和PacketVideo多媒体框架(PVMF)。
PVPlayerSDK依赖OSCL来提供系统的功能,是便携式在平台上(例如,它作为一个操作系统的抽象层提供了平台的API来了PVPlayerSDK)。
PVMF框架是确定多媒体架构包PVPlayerSDK。
OSCL需要一个平台和服务的相对完整操作系统,如动态记忆、管理、多线程、文件I/O、网络、域名服务,时钟信息。
结构和组件
PVPlayerSDK是一个标准架构,结构灵活的、可扩展的,轻巧的多媒体播放框架。
PVPlayer引擎是播放器的核心。
引擎使用PVMF节点和节点图表数据处理和内部注册时,节点的图形结构。
下图是PVPlayerSDK简单框架图。
、图一PVPlayerSDK软件框架图
控制流
回放控制PVPlayerSDK是user(这里一般是开发者)的PVPlayer,典型的LINUX应用程序,通过BINDLE一个服务给JAVA层调用。
PVPlayerSDKapi提供了如调用初使化、setdatasourse、prepare、开始(停止)多媒体播放等等。
在PVPlayerSDK、控制流量通常是自上而下的。
这个应用程序请求被PVPlayer收到后经引擎适配。
这个PVPlayer引擎根据先前注册的节点并通过相应的标识控制PVMF节点数据。
有一些控制数据连接节点之间,但主要的控制数据PVPlayer引擎和PVMF节点之间。
数据流
PVPlayerSDK多媒体数据流过程的通过一个或更多的PVMF节点连接在一起。
PVMF节点类型使用和结构将取决于回放文件源参数的类型进行相应播放操作。
文件类型主要是提取文件元数据的具体参数,由PVPlayer引擎或PVMF提取节点PVPlayerSDK通过适当的接口返回给用户。
3.PVPlayer引擎设计
PVPlayer引擎是PVPlayerSDK的心脏。
它接收和处理所有PVPlayerSDK从用户和管理PVMF播放多媒体所需的组成及相关业务的请求。
其任务应用和简化高级控制。
这个PVPlayer引擎也侦测,处理,和过滤事件和信息生成多媒体播放操作控制。
PVPlayerInterfaceAPI
PVPlayer用户界面PVPlayer引擎通过PVPlayerInterface接口类来确定是否有一种适配接口用户和PVPlayer引擎。
PVPlayerInterface是一种OSCL-based接口和遵循公共接口,除了多媒体播放特定api,PVPlayerInterface提供方法检索SDK信息、操纵和取消的命令。
并描述PVPlayerInterfaceAPI,指的是一种PVPlayerInterfaceAPI文档生成的支持的标记。
异步操作
ThePVPlayerengineprocessesmostcommandsinitiatedbyAPIcallsasynchronously.Therearesomecommandsthatareprocessedsynchronouslyandtheycanbedifferentiatedbythereturnvalue.SynchronouscommandsreturnaPVMFstatuscodewhichtellstheuserwhetherthecommandsucceededornotandifitdidfail,whattheerrorwas.AllasynchronouscommandsreturnacommandID.Fortheusertobenotifiedofasynchronouscommandcompletion,theusermustspecifyacallbackhandlerwheninstantiatingPVPlayerengineviathefactoryfunction.Whentheasynchronouscommandcompletes,PVPlayerenginecallsthecallbackhandlerwiththecommandIDforthecommand,commandstatus,andanyotherrelevantdata.Toprocessthecommandasynchronously,thePVPlayerengineisimplementedasanactiveobject,whichgetstorunaccordingtotheactiveschedulerrunninginthethread.ThePVPlayerengineexpectsschedulertobeavailablewheninstantiatedandtheengineitselfwillnotdirectlycreateathreadorscheduler.
Withasynchronouscommands,thereisapossibilityofcommandsnotcompletinginexpectedtime.Todealwiththisissue,PVPlayerengineprovidesstandardPVSDKAPIstocancelaspecificorallissuedcommands.TheuserofPVPlayerSDKcanusetheseAPIstocancelanyrequestthatdidnotcompleteintimeorarenotneededduetochangingcircumstances.InPVPlayerengine,itmighthavetodealwithlowerlevelcomponentsthatbehaveasynchronously.TopreventanunresponsivelowerlevelcomponentfromblockingPVPlayerengineoperation,PVPlayerenginehastimeouthandlingforanyasynchronouscommandsthatitissues.Whentimeoutdoesoccur,theasynchronouscommandiscanceledandishandledappropriately.commandfailure,errorevent).
事件处理
ThePVPlayerenginenotifiestheuseroferrorsandotherinformationnotrelatedtoAPIcallsasunsolicitedevents.ThenotificationishandledbymakingacallbackonhandlersspecifiedbytheuserofPVPlayerengine.Therearetwocallbackhandlers,oneforerroreventsandoneforinformationalevents,thatmustbespecifiedbytheuserwheninstantiatingPVPlayerengineviathefactoryfunction.
引擎框架
下面的图表说明了应用程序使用PVPlayer引擎的接口PVPlayerInterface时直接适配。
PVPlayerFactory处理实例化组件和destory的PVPlayerEngine对象。
所有PVPlayer引擎的api提供PVPlayerInterface。
PVPlayerEngine采用三种回收处理过的应用,PVCommandStatusObserver,PVInformationalObserver,PVErrorEventObserver,通知申请上述指令完成同步误差和信息的事件。
图二类图
状态机
图三状态机
PVPlayer引擎实例化后状态为IDLE,在IDLE状态时,可以调用AddDataSource()来指定需要回放的多媒体数据,然后调用init()初始化数据并且状态转为INITIALIZED,在进入INITIALIZED
状态的时候,用户可以获取媒体的tracks和metadata,并且可以调用AddDataSink()去指定具体的datasinks去回放.
在所有的datasinks添加后,用户调用Prepare(),使引擎建立相关的PVMF节点,并为数据流指定多媒体播放的数据源和数据接收器,建立需要播放的数据流队列.用户在PREPARED状态时调用Start()进入到STARTED状态,启动多媒体播放.在调用Stop()后回到INITIALIZED状态并且刷新多媒体数据流.
在STARTED状态时,用户也可以调用Pause().Stop().调用Stop()后停止回放,刷新所有数据流,并且使引擎回到初始化状态.调用Pause(),会停止回放,但不会刷新数据流,而且可以调用Resume()继续从暂停的地方播放.在PAUSED状态时可以调用Stop()使引擎回到初始化状态.
调用Stop()回到INITIALIZED状态后,数据队列可以通过调用AddDataSink()和RemoveDataSink()来添加和删除.在调用Prepare()\Start()重新回放,但是关闭回到IDLE状态时,或需要重新打开另一个媒体文件时,需要调用Reset().因为在IDLE状态调用RemoveDataSink()不能删除所有数据队列.调用Reset()后,又回到起始状态,流程如上一样.如果用户想退出PVPlayer,也可以调用Reset(),在PREPARED,STARTED,PAUSED状态时都可以调用该函数.
如果PVPlayer引擎收到错误信息或从其它组件传来错误事件后,引擎会发送ERROR状态并且尝试恢复.如果这个错误是不可恢复的,刚引擎会清空所有状态和数据列回到IDLE状态.此时用户应该等待PVMFInfoErrorHandlingCompleteinformationalevent.
以上是这个状态机的简要描述,具体参考OPENCORE源码.
4.接口
默认接口
PVPlayer的接口是标准的OSCL-based接口,引擎的API都是通过这些接口来调用相对应的操作,但是像一些OSCL类型的组件和PVMF类型的组件里需要注意有些不同.
适配层
ftheinterfacetoPVPlayerSDKneedstobedifferentthantheOSCL-basedinterface,anotherinterfacelayerneedstobecreatedto“wrap”aroundtheOSCL-basedinterface.This“wrapper”isreferredtoasan
adaptationlayerforOSCL-basedPVPlayerenginepossiblereasontocreateanadaptationlayerwouldbetoencapsulatetheOSCLinterfacewithtypesandcomponentsofaparticularplatformoroperatingsystem.ANSICinterface,Symbianinterface).AnotherreasonwouldbethattheadaptationlayermodifiestheinterfaceandbehaviorofPVPlayerSDK
tomatchtheexpectationoftheapplication.legacyinterface).TheadaptationlayercouldalsocombinePVPlayerSDKwithanotherSDKorcomponenttoprovideaunifiedinterfacetotheblockdiagramsbelowillustratehowtheadaptationlayerrelatestoPVPlayerEngineanditsOSCL-basedinterface.Thediagramontherightshowstheadaptationlayeraddingmorefunctionalitybyincludinganotherengine.
PvPlayer
AdapationLayer
pvPlayer
OSCLInterface
pvPlayerEngine
pvPlayer+AdapationLayer
Another
Engine
pvPlayerOSCL
Interface
pvPlayerEngine
图四适配层
多线程支持
默认的OSCL-based接口不支持多线程,所以在使用多线程的时候,适配层需要提供一个功能来实现.一种方法是使用OSCLproxy接口组件来提供多线程的支持.另一种方法是添加一个另外的PlatformThreadingSupport.两种方法的框图如下.
图五多线程支持
媒体数据输出到数据池
PVPlayer引擎利用PVMF节点指定数据输出的数据池,但大部份使用的时候,同步数据通过适合的渲染后再送到媒体输出设备.在输出视频流的时候,需要一个显示设备,音频流需要一个PCM音频输出设备.媒体输出设备是一个具体的特定平台.输出设备的创建有两个方法可以实现:
(1)在PVMF节点里封装一个mediadevice,引擎可以直接调用,这种方法可以最大限度的减少PVPlayer和接口层的代码,但是需要创建一个新的PVMF节点.
(2)直接调用PVmediaI/O接口,在I/O接口中调用输出设备.这种方法相对于第一种来说并不需要创建新的PVMF节点,复杂性也小.但增加了代码的层次和和代码量.下图是两种方法的引擎.更多PVI/O接口的信息,参考PVMEDIAI/Odatasheet.
图6媒体输出的两种方法
5.PVMFNode
本节给出PVMF简短的描述节点,由PVPlayer引擎使用。
只有PVMF节点OSCL和PVMF基于组件都包括在内。
没有特定于平台PVMF节点覆盖。
欲了解更多有关特定节点(1,低于或平台特定一)的详细信息,请参阅该节点文件。
数据池节点(DataSinkNodes)
数据池节点是PVPlayer的引擎中输出数据前最后的数据终点.
PVMFMediaOutputNode
PVMFMediaOutputNodeisawrappernodearoundthePVmediaI/Ointerfacetooutputdata.ThenodetranslatesnodecommandsandincomingmediadatatoappropriatemediaI/OactionsandhandlesmediaI/Oevents.UsingPVMFMediaOutputNodeallowsencapsulationofplatformanddevicespecificoutput
interfacewithPVmediaI/Ointerface.
PVMFFileOutputNode
PVMFFileOutputNodeaccessesthefiledirectlyusingOSCLfileI/Otowritemediadatacominginviatheport.Thenodehassomecapabilitytounderstandformattypeandtowriteoutdataappropriatelyforthespecifiedformattype(AMRfileheaderforAMRIETFformat).
6.同步机制
在OPENCORE官方文档中对时间戳相关介绍,有些难懂,为了更利于理解,我在网上找了一篇简单介绍实时视频的时间戳和视频流畅的关系的文章,可以更好的理解.最后再附上原翻译
媒体内容在播放时,最令人头痛的就是音视频不同步。
从技术上来说,解决音视频同步问题的最佳方案就是时间戳:
首先选择一个参考时钟(要求参考时钟上的时间是线性递增的);生成数据流时依据参考时钟上的时间给每个数据块都打上时间戳(一般包括开始时间和结束时间);在播放时,读取数据块上的时间戳,同时参考当前参考时钟上的时间来安排播放(如果数据块的开始时间大于当前参考时钟上的时间,则不急于播放该数据块,直到参考时钟达到数据块的开始时间;如果数据块的开始时间小于当前参考时钟上的时间,则“尽快”播放这块数据或者索性将这块数据“丢弃”,以使播放进度追上参考时钟)。
可见,避免音视频不同步现象有两个关键——一是在生成数据流时要打上正确的时间戳。
如果数据块上打的时间戳本身就有问题,那么播放时再怎么调整也于事无补。
如图,视频流内容是从0s开始的,假设10s时有人开始说话,要求配上音频流,那么音频流的起始时间应该是10s,如果时间戳从0s或其它时间开始打,则这个混合的音视频流在时间同步上本身就出了问题。
打时间戳时,视频流和音频流都是参考参考时钟的时间,而数据流之间不会发生参考关系;也就是说,视频流和音频流是通过一个中立的第三方(也就是参考时钟)来实现同步的。
第二个关键的地方,就是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- opencore 官方 文档 中文版