dtplayer总体设计

来源:互联网 发布:sql查询去重 编辑:程序博客网 时间:2024/05/16 13:54


目录
1 dtplayer概述
2 dtplayer编译配置
3 dtplayer播放流程
4 dtplayer支持的格式

5 tudo



1 dtplayer概述


dtplayer是基于ffmpeg2.0及以上版本开发的多媒体播放器。

1.1 设计
dtplayer的结构设计主要侧重如下几个方面:
模块化设计:将多媒体播放的各个部分分别独立开来,体现在虽然调用ffmpeg进行demux、decode、scale但又能方便的通过配置选项去除ffmpeg的依赖。
易于扩展:dtplayer分别对应stream、demuxer、decoder、output建立了独立的模块,方便开发者在任一层次上开发

1.2 dtplayer主要组成部分:
下面是dtplayer的主要组成部分框图。

下面介绍数据流各个部分的功能
dtstream:stream模块,数据输入接口,提供了stream_file和stream_ffmpeg,支持ffmpeg支持的各种格式,用户可以以stream_file作为移植参考(移植过程见:dtplayer如何添加stream)
dtdemux:demux模块,封装了ffmpeg的libavformat模块,并易于扩展,代码中添加了个demuxer_aac作为例子(移植过程参考:dtplayer如何添加demuxer)
dtaudio:audio处理模块,主要包括audio decoder 和 audio output,关于audio的处理都集中在此模块。当前解码器主要是封装的ffmpeg的libavcodec模块进行解码,音频输出添加了alsa sdl接口,移植解码器可以参考dec_audio_faad.c(移植过程参考:dtplayer如何添加audio decoder)
dtvideo:video处理模块,主要包括video decoder和video output,关于video的处理都集中在此模块。当前解码器主要是封装ffmpeg的libavcodec模块进行解码,视频输出添加了sdl1 sdl2的支持。
dtport:数据中转模块,dtport维护两个队列(audio video),即从dtdemuxer读取到的数据会暂存在dtport模块中,等待dtaudio dtvideo模块中的解码器来请求。
dthost:dthost是dtplayer与dtaudio dtvideo dtport之间的桥梁,dtaudio dtvideo dtport本身并不直接与dtplayer通信,所有的交互都是通过dthost来完成,这样减轻了dtplayer的压力,最主要的是使得很多操作变得简单
dtplayer:整个播放的总控模块,直接管理dtdemux dthost等模块,并响应用户的请求
dtutils:一些公共的数据结构及算法

1.3 dtplayer适用人群
dtplayer开发之初并非为了做一个大而全的播放器,恰恰相反,是为了类似广告机之类的应用场景而开发,用户通过移植特定的stream demuxer decoder满足特定的需求。

在项目中通过配置config.mak(set DT_FFMPEG = no)可以方便的去掉ffmpeg依赖,使得dtplayer变得非常轻量。

由于软件还不完善,因此不适合小白用户使用,主要还是面向多媒体开发者。另外作为专业多媒体开发者的参考软件也是不错的选择,后续会增加一些类似解析视频参数、分离av数据等工具性功能。


2 dtplayer编译配置


2.1 代码获取
dtplayer是开源软件,托管在github上课直接通过如下方式获取:
https://github.com/peterfuture/dtplayer.git
2.2 编译方法
dtplayer的编译涉及到三个文件(请结合源码)
rules.mk : 主要是一些公共编译规则,一般不用更改
config.mk:配置文件,通过修改此文件可添加或者删除ffmpeg依赖,配置sdl alsa支持等
Makefile


编译之前先配置:主要是通过配置config.mk中的SETTING 模块


有两个部分,module支持以及环境变量,下面列出部分代码举例

模块配置
#module
DT_VIDEO_SDL=yes
DT_VIDEO_SDL2=no
模块配置部分主要是控制源码的编译以及库的依赖,若没有配置SDL,则SDL对应的代码就不会被编译,

以及对应的环境变量不会被设置,如LDFLAGS-$(DT_VIDEO_SDL)  += -lSDL


环境变量设置

环境变量主要是依据模块的配置而设置

ifeq ($(DT_SDL),yes)    DT_CFLAGS += -DENABLE_VO_SDL=1else    DT_CFLAGS += -DENABLE_VO_SDL=0
endif

并不需要配置环境变量,指配置module即可,环境变量会根据module配置相应的设置


配置完毕,直接执行make就可以了


2.3 配置ffmpeg
由于现阶段dtplayer虽然添加了stream_file  demuxer_aac decoder_faad作为例子,但功能上主要还是依托ffmpeg来完成的
这里也简单介绍下如何配置ffmpeg在dtplayer中使用
(1)下载ffmpeg代码及编译
(2)设置DT_FFMPEG_DIR环境变量,可直接修改config.mk或者直接在~/.bashrc中设置好, 这里主要要设置的是源码目录,而不是安装目录
(3)确保config.mk中关于ffmpeg部分的设置都是enable的,具体如下
DT_DEMUXER_FFMPEG=yes
至此ffmpeg的配置便完成了


3 dtplayer播放流程


下面介绍下dtplayer的基本播放流程

3.1 播放API

在dtplayer代码里,有个示例播放器,代码是:dtm_player.c里面介绍了如何调用dtplayer提供的API进行播放,贴下代码看下

int main (int argc, char **argv)

{

    int ret = 0;

    version_info ();

    if (argc < 2)

    {

        dt_info ("", " no enough args\n");

        show_usage ();

        return 0;

    }


    void *player_priv;

    dtplayer_para_t *para = dtplayer_alloc_para ();

    if (!para)

        return -1;

    strcpy (para->file_name, argv[1]);

    para->update_cb = (void *) update_cb;

    para->no_audio=1;

    //para->no_video=1;

    para->width = 720;

    para->height = 480;

    ret = dtplayer_init (&player_priv, para);

    if (ret < 0)

        return -1;


    dtplayer_release_para (para);

    dtplayer_start (player_priv);

    //here enter cmd loop

    event_loop (player_priv);

    dt_info ("", "QUIT DTPLAYER-TEST\n");

    return 0;

}


启动dtplayer播放,只需要构造一个结构体即可,即dtplayer_para_t,其定义在dtplayer/dtplayer_api.h中

typedef struct dtplayer_para

{

    char file_name[FILE_NAME_MAX_LENGTH];

    int video_index;

    int audio_index;

    int sub_index;


    int loop_mode;

    int no_audio;

    int no_video;

    int no_sub;

    int sync_enable;


    int width;

    int height;


    int (*update_cb) (player_state_t * sta);

} dtplayer_para_t;


最少的参数只需要设置下文件名。然后调用dtplayer_init dtplayer_start就可以启动播放了,非常简单,控制的话此处由于获取了player_priv也就是dtplayer的句柄

后面pause、resume、seek等都直接使用此句柄就可以了


这里还要说明的是,虽然可以直接在dtplayer_para_t中设置noaudio novideo等参数,但dtplayer给大家提供了更好的方法,即配置文件的方法,具体是sys_set.ini

通过设置此配置文件,便可以方便的实现 屏蔽audio video 开关同步,设置输出宽高等,而且不需要重新编译,这个后面会单独写文介绍。


3.2 dtplayer内部播放流程

这里简单介绍下dtplayer的内部播放流程,通过跟踪数据流来介绍

首先回顾下开篇的dtplayer框图,图中不但阐明了dtplayer的基本所有模块,最主要的是介绍了其工作原理,

当文件名传输给dtplayer时,dtplayer会构造dtdemuxer模块,来读取并分析数据,demuxer的作用是解封装,也就是说从demuxer读取过来的数据就是完整的视频帧或者音频es包了。

dtplayer通过dthost模块将数据缓存在dtport中,dthost启动后会启动两个模块,分别是audio模块和video模块,这两个模块又分别启动两个线程,即解码和输出线程,完成视频音频的播放。


这里只是简单介绍下,细节部分后面会陆续有新的文章出来详细介绍,这里只是让大家有个概括的印象。


4 dtplayer支持的格式


4.1 stream格式

目前暂未添加任何dtplayer独有的stream,依赖ffmpeg的demuxer

4.2 demuxer格式

目前暂未添加任何dtplayer独有的demuxer,依赖ffmpeg的demuxer

4.3 decoder

目前暂未添加任何dtplayer独有的decoder,依赖ffmpeg的decoder

4.4 render

音频支持格式:alsa

视频支持格式:sdl1 sdl2


5 tudo


下一步的计划主要包括如下几个方面

5.1 dtplayer UI

5.2 添加一些工具性应用,如解析参数、分离av数据等

5.3 修改bug,使得整个框架趋于稳定

5.4 release version1.0


最后,希望dtplayer能给大家带来一些有用的帮助。


最新消息:dtplayer后续会在avplayer社区运营,后续代码更新将以avplayer社区代码为主


源代码地址:https://github.com/avplayer/dtplayer

联系开发者:peter_future@outlook.com

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

开源中国地址:http://www.oschina.net/p/dtplayer


由于后面随着开发的进行文章会进行细节的更新,因此为了保证读者随时读到最新的内容,文章禁止转载,多谢大家支持。




0 0
原创粉丝点击