目录
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=1 else 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
联系开发者:[email protected]
blog: http://blog.csdn.net/u011350110
开源中国地址:http://www.oschina.net/p/dtplayer
由于后面随着开发的进行文章会进行细节的更新,因此为了保证读者随时读到最新的内容,文章禁止转载,多谢大家支持。