avcore事实上它只是一个对外的c++类接口, 目前基于windows实现. 在avcore中, avplayer是一个对外的接口, 因下降依赖关系, 采用pimpl方式实现, 其实现是由player_impl完成的. 也就是说, 在avcore中是由player_impl实现, 由avplayer导出c++接口.c++
avplayer是一个向外部导出接口的类, 其接口以下:git
// 打开媒体类型. #define MEDIA_TYPE_FILE 0 #define MEDIA_TYPE_BT 1 #define MEDIA_TYPE_HTTP 2 #define MEDIA_TYPE_RTSP 3 // 渲染模式. #define RENDER_DDRAW 0 #define RENDER_D3D 1 #define RENDER_OGL 2 class EXPORT_API avplayer { public: avplayer(void); ~avplayer(void); public: // 包含实现类 HWND create_window(LPCTSTR player_name); // 销毁窗口, 只能撤销是由create_window建立的窗口. BOOL destory_window(); // 子类化一个存在的窗口, in_process参数表示窗口是否在同一进程中. BOOL subclasswindow(HWND hwnd, BOOL in_process = TRUE); public: // 打开一个媒体文件 // movie 文件名. // media_type 表示打开的媒体类型. // render_type 表示播放渲染模式, 默认是ddraw渲染. // 注意, 这个函数只打开文件, 但并不播放, 从新打开文件前, 必 // 须关闭以前的媒体文件, 不然可能产生内存泄漏! 另外, 在播放 // 前, avplayer必须拥有一个窗口. BOOL open(const char *movie, int media_type, int render_type = RENDER_DDRAW); // 播放索引为index的文件, index表示在播放列表中的 // 位置计数, 从0开始计算, index主要用于播放多文件的bt // 文件, 单个文件播放可使用直接默认为0而不须要填写 // 参数. BOOL play(int index = 0); // 暂停播放. BOOL pause(); // 继续播放. BOOL resume(); // 中止播放. BOOL stop(); // 关闭媒体, 若是打开的是一个bt文件, 那么 // 在这个bt文件中的全部视频文件将被关闭. BOOL close(); // seek到某个时间播放, 单位是视频时长的百分比. void seek_to(double fact); // 设置声音音量大小. void volume(double vol); // 全屏切换. BOOL full_screen(BOOL fullscreen); // 返回当前播放时间. double curr_play_time(); // 当前播放视频的时长, 单位秒. double duration(); // 当前播放视频的高, 单位像素. int video_width(); // 当前播放视频的宽, 单位像素. int video_height(); // 返回当前播放列表中的媒体文件数. int media_count(); // 返回播放列表index位置的媒体文件名. // 参数name应该在外部分配内存, 经过size参数传入分配的 // 内存大小. 成功返回0, 返回-1表示失败, 返回大于0表示 // name分配的内存不够, 返回值为index对应的文件名长度. int query_media_name(int index, char *name, int size); // 返回当前窗口句柄. HWND get_wnd(); private: player_impl *m_impl; };
由上能够看出使用方法是:github
注意, 内部实现了在播放窗口上点击鼠标左键按窗口宽进行seek, 鼠标右键暂停, F2全屏切换.windows
player_impl实现了avplayer全部接口, 实现代码在player_impl.cpp中, 下面简单介绍下一些主要的函数实现.markdown
open函数主要的功能主要完成判断播放的媒体类型, 根据文件类型建立相应的媒体源(media_source), 而后调用initialize初始化播放器. 并在初始化播放器以后, 初始化音频和视频的渲染器(分别是调用init_audio和init_video, 以及configure函数完成), 这个函数基本上完成了装配一个avplay播放器的过程, 其它的函数基本上辅助性的了.框架
在player_impl.cpp中你可能会看到一个win_data的结构, 也许你第一眼会很疑惑它是用来干吗的, 如今说下: 这个结构是用于create_window函数建立窗口时, Hook窗口过程使之回调到成员函数win_wnd_proc中. 这个原理是之前从MFC那里学来的, 经过在建立窗口前建立一个HCBT_CREATEWND钩子, 以后的建立窗口调用CreateWindowEx时还在未回调窗口过程以前, 就进入HCBT_CREATEWND所设定的钩子, 从而提早得到HWND, 当窗口建立完成以后, 全部消息均可以经过win_wnd_proc来完成回调, 更具体的见代码或理解MFC框架原理(注意这里也可使用WTL的Thunk技术来实现, 本人比较懒, 采用了更简单的方式).ide
subclasswindow用于附加一个不一样由player_impl建立的窗口, 这个其实就是相似MPlayer中的指定窗口渲染.函数
win_wnd_proc窗口消息处理函数, WM_CREATE消息启动了一个ID_PLAYER_TIMER定时器, 用于100毫秒后检测视频的宽高, 而后按这个宽高设置窗口大小, 另外还有一些简单的消息处理, 最值的注意的是若是在ddraw的overlay模式渲染的话, 由于设置了colorkey是RGB(0, 0, 1),因此每次WM_PAINT消息过来时, 必须使用这个颜色的画刷之类去填充窗口背景.spa
以上基本上就是avcore的所有内容了, 仍是至关简单的.code