Skip to content

接口设计

chenk edited this page Jun 7, 2018 · 2 revisions

fanplayer 的接口采用了标准 C 的函数接口,这样可以保证更好的兼容性和可移植性。

ffplayer.h 中定义了全部的接口:

// 函数声明
void* player_open    (char *file, void *win);
void  player_close   (void *hplayer);
void  player_play    (void *hplayer);
void  player_pause   (void *hplayer);
void  player_seek    (void *hplayer, int64_t ms);
void  player_setrect (void *hplayer, int type, int x, int y, int w, int h);
int   player_snapshot(void *hplayer, char *file, int w, int h, int waitt);
void  player_setparam(void *hplayer, int id, void *param);
void  player_getparam(void *hplayer, int id, void *param);

player_open 函数,传入一个需要播放的 url 地址,可以是本地文件,也可以是网络流媒体 url,第二个参数 win 需要传入用于视频渲染的窗口。在 windows 平台上传入窗口句柄即可。函数调用成功后会返回一个 void* 类型的 hplayer,你也可以理解为播放器的句柄。在内部实现中,其实就是一个指向 player context 结构体的指针。采用 void* 类型,就是为了隐藏了内部 context 的细节。其余的接口函数都需要传入 player_open 所获得的 hplayer。

针对播放、暂停、定位、设置显示区域、截屏,这些功能,提供对应的接口函数,方便用户调用。对于扩展的功能,定义了 player_setparam 和 player_getparam 两个接口来实现。

播放进度和播放时间,定义了两种通知方式,一种是 callback 回调函数:

// player event callback
typedef void (*PFN_PLAYER_CALLBACK)(void *vdev, int32_t msg, int64_t param);

回调参数说明:

vdev 是视频渲染设备的句柄,普通用户可以不用关心这个参数
msg  是消息类型,目前有以下三种:
    PLAY_PROGRESS   播放进度消息
    PLAY_COMPLETED  播放完成消息
    PLAY_SNAPSHOT   截屏完成消息
param 为附加参数
    当 msg 类型为 PLAY_PROGRESS 时,表示当前播放进度,ms 为单位

我们可以通过

player_setparam(g_hplayer, PARAM_PLAYER_CALLBACK, callback_func);

来注册和取消注册回调(要取消注册将 callback 置为 NULL 即可)

另外一种是默认的消息通知机制(不注册 callback 的只是默认为此机制)

windows 平台上为标准的窗口消息:

#define MSG_FANPLAYER    (WM_APP + 1)

windows 程序只需要处理这个消息即可

另外播放器还可以通过定时查询的方法,来获取播放进度:

// 获取多媒体文件的总长度和当前播放位置(毫秒为单位)
LONGLONG total = 1, pos = 0;
player_getparam(g_hplayer, PARAM_MEDIA_DURATION, &total);
player_getparam(g_hplayer, PARAM_MEDIA_POSITION, &pos  );

更多更详细的接口说明,请大家参考 ffplayer.h 中的注释。

Clone this wiki locally