首页 > 其他 > 详细

dtplayer总体设计

时间:2014-03-22 17:22:47      阅读:475      评论:0      收藏:0      [点我收藏+]
目录
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的主要组成部分框图。
bubuko.com,布布扣
下面介绍数据流各个部分的功能
dtstream:stream模块,数据输入接口,暂未实现,后续会添加file示例
dtdemux:demux模块,封装了ffmpeg的libavformat模块,并易于扩展,后续会实现一个mp3的示例
dtaudio:audio处理模块,主要包括audio decoder 和 audio output,关于audio的处理都集中在此模块。当前解码器主要是封装的ffmpeg的libavcodec模块进行解码,音频输出添加了alsa接口,后面会添加libmad解码库作为示例
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开发之初并非为了做一个大而全的播放器,恰恰相反,是为了类似广告机之类的应用场景而开发,支持某单一格式,因此整个项目通过配置config.mak去掉ffmpeg依赖会变得非常轻量。由于软件还不完善,因此不适合小白用户使用,主要还是面向多媒体开发者。另外作为专业多媒体开发者的参考软件也是不错的选择,后续会增加一些类似解析视频参数、分离av数据等工具性功能。

2 dtplayer编译配置

2.1 代码获取
dtplayer是开源软件,托管在github上课直接通过如下方式获取:
https://github.com/peterfuture/dtplayer.git
2.2 编译方法
dtplayer的编译涉及到三个文件(请结合源码)
rules.mk : 主要是一些公共编译规则,一般不用更改
config.mk:配置文件,通过修改此文件可添加或者删除ffmpeg依赖,配置sdl alsa支持等
Makefile: 不说大家都知道
编译之前先配置:配置有两个部分,module支持以及环境变量,下面列出部分代码举例
宏设置
DT_CFLAGS += -DENABLE_VO_SDL=1
DT_CFLAGS += -DENABLE_VO_SDL2=0
如通过上面例子可方便配置SDL还是SDL2,作用是当配置为1时dtplayer源码中对应的部分会被注册
模块配置
#module
DT_VIDEO_SDL=yes
DT_VIDEO_SDL2=no
模块配置部分主要是控制源码的编译,若没有配置SDL,则SDL对应的代码就不会被编译,以及对应的环境变量不会被设置,如LDFLAGS-$(DT_VIDEO_SDL) += -lSDL、
配置好,直接执行make就可以了
2.3 添加ffmpeg支持
由于现阶段dtplayer并为添加任何独立的streamer demuxer decoder等,基本功能都是依托ffmpeg来完成的
这里也详细说下如何配置ffmpeg在dtplayer中使用
(1)下载ffmpeg代码及编译
(2)设置DT_FFMPEG_DIR环境变量,可直接修改config.mk或者直接在~/.bashrc中设置好, 这里主要要设置的是源码目录,而不是安装目录
(3)确保config.mk中关于ffmpeg部分的设置都是enable的,具体有如下几个
DT_CFLAGS += -DENABLE_DEMUXER_FFMPEG=1
DT_CFLAGS += -DENABLE_VDEC_FFMPEG=1
DT_CFLAGS += -DENABLE_ADEC_FFMPEG=1
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 添加一整套的示例即stream demuxer decoder 等供大家参考
5.3 添加一些工具性应用,如解析参数、分离av数据等
5.4 修改bug,使得整个框架趋于稳定
5.5 release version1.0


最后,希望dtplayer能给大家带来一些有用的帮助。
联系开发者:peter_future@outlook.com
开源中国地址:http://www.oschina.net/p/dtplayer

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

dtplayer总体设计,布布扣,bubuko.com

dtplayer总体设计

原文:http://blog.csdn.net/u011350110/article/details/21799415

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!