dtplayer结构设计的几点说明

来源:互联网 发布:帝国cms怎么样 编辑:程序博客网 时间:2024/06/05 15:55

目录


1 dtplayer的设计目的

2 dtplayer子系统设计

3 dtplayer的后续发展

4 版本管理


1 dtplayer的设计目的


    当前的主流播放器,不管是mplayer、vlc、gsteamer,还是作为底层的ffmpeg,都是功能非常强大的,但也有一个问题就是:强大的功能必定带来巨大的代码量和各种细节来困扰希望在此基础上进行二次开发的用户。对于一些希望做些特定功能的用户,如只希望支持单一的文件格式等,由于上述播放器的代码的强聚合性,会导致这个目的变得很难实现,dtplayer的设计之初便考虑了这种特定的需求。各个模块之间独立性非常强,任何模块都可以单摘出来提供服务。而且通过简单的配置就可以去掉ffmpeg的依赖,编程一个非常轻量但五脏俱全的小型播放器。使得dtplayer不仅可以大而全,而且可以小而美。


    ​后面随着功能的不断扩充,dtplayer的代码量也有可能出现爆炸性的增长,但会尽量保持简单,而且通过git进行管理用户可以方便的回到初期的版本来分析和学习。



2 dtplayer子系统设计


dtplayer中实现了几种机制来支撑各种功能的实现

2.1 INI变量

dtplayer支持用户通过配置文件设置环境变量的方式来动态的控制播放器的行为,如屏蔽audio、video

enable disable某些功能等。具体用法可参考sys_set.ini


2.2 log系统

再来说下log系统,代码中实现了一个小型的log系统,来控制log的输出级别,暂时支持的等级有:debug warning info error,默认设置为打印error和info级别的信息


2.3 事件分发系统

播放器中需要进行比较多如:init start pause resume stop等的状态机切换,一般都是通过消息传送-处理的消息完成。这里设计了一个简单的事件分发系统来实现此功能,这里只简单介绍下原理:事件分发系统是一个client-server框架的机制,首先在播放器启动之初会建立一个service(Main-Service),来分发所有的事件,后面每个模块接收信息的模块都注册一个service,不同的service以ID来区分。任何模块都可以发送消息给各个service,消息会统一发送给Main-Servier,挂在MainService的event链表中, Main-server在后台不断的从链表中拿到Event并根据event中的serviceid路由给目的service,每个service owner都启动一个线程来检测event,收到event后就处理。整个播放器的控制都在此机制下运行。相比较直接函数是调用的方式,效率有了很大的提高。


2.4 Element系统

    ​这里使用gstreamer中element的概念,每个decoder streamer decoder render都统称为element。 在dtplayer中为每种element都建立了一个全局链表,而且在播放器启动之初便将支持的格式都注册好挂载在相应的全局链表中,在播放器启动后每个模块都会依据条件从链表中选择合适的element来完成功能。


    ​选择的依据遵循最先匹配的原则,举例说明:当经过demuxer之后,播放器已经得到的a-v decoder的格式信息,但decoder模块可能有多个element都支持此格式,那么挂载在前面的element将会被优先选择。当然用户也可以在配置文件sys_set.ini中强制使用某个element(功能后续会添加),达到灵活的选择element的目的。


    ​这里有个场景应用需要单独列出来讲,那就是dtplayer如何与播放器客户端进行整合,dtplayer与上层播放器的整合其中一个重要的方面就是:如何将dtplayer解码出来的pcm或者yuv传送给客户端,这里可以通过如下方式非常简单的完成:客户端分别实现一个audio和video的render(实现方式参考blog中dtstream如何添加ao,vo文章),然后在播放启动之前先注册到dtplayer中,注册外部的av render会默认放在全局链表的开头,这样就可以方便的选择外部注册的a-v render,而且客户端按照规则实现的av render可借由dtaudio dtvideo模块的函数指针方式回调执行,非常方便。


3 dtplayer的后续发展


dtplayer的基本框架已经完成了,而且也已经添加了demuxer stream decoder render的相应的sample code。后续的发展分为如下几个方面

(1) 开发UI客户端

(2) 扩充各个系统的element,扩展功能

(3) 移动端移植 

(4) 其他方向


4 dtplayer版本管理


dtplayer已经借由ffmpeg实现了强大的视频播放功能,当前版本设定为:v1.0

后续版本的更迭依据为:功能的添加


添加2-3 个重要的element,版本递增一次

注意bug的修改 不会导致版本的更替。


dtplayer的发展需要大家的参与和支持,dtplayer热切盼望大家的到来!


Git:https://github.com/avplayer/dtplayer

Git:https://github.com/peterfuture/dtplayer

Maintainerpeter_future@outlook.com

Blog: http://blog.csdn.net/u011350110

BBS: http://avboost.com/

Wiki: http://wiki.avplayer.org/Dtplayer

0 0
原创粉丝点击