libplayer接口
原创,转载请注明http://www.cnblogs.com/yeying/archive/2010/12/16/1907626.html
看了网上的libplayer说明,都是贴来贴去的,好像没多少人用这个出色的库,调用mplayer,vlc,xine等播放器都自己写程序接口,开始我想使用网上推荐的QT直接调用,发现虽然很简单,但是一旦mplayer崩溃,QT程序直接死掉,问题不少,还需要考虑很多错误处理的问题,而且mplayer等播放器功能很强大,写接口的工作量也不小,而libplayer本身已经实现了所有的接口,非常方便,我是在pc和嵌入式环境(arm)下测试过,都很好用,下面是我自己写的接口说明,主要是根据libplayer的例子代码和player.h头文件,有不对的地方,请大家指出。
调用此接口,需要包含player.h头文件,并将libplayer.so的文件路径加入到LD_LIBRARY_PATH中,编译应用程序。
1. player_t * player_init (player_type_t type,
player_verbosity_level_t verbosity, player_init_param_t *param);
参数1:其中type取PLAYER_TYPE_MPLAYER
typedef enum {
PLAYER_MSG_NONE, /* no error messages */
PLAYER_MSG_VERBOSE, /* super-verbose mode: mostly for debugging */
PLAYER_MSG_INFO, /* working operations */
PLAYER_MSG_WARNING, /* harmless failures */
PLAYER_MSG_ERROR, /* may result in hazardous behavior */
PLAYER_MSG_CRITICAL, /* prevents lib from working */
} player_verbosity_level_t;
参数2:
一般采用PLAYER_MSG_WARNING级别
参数3:
typedef struct player_init_param_s {
/** 音频输出驱动*/
player_ao_t ao;
/** 视频输出驱动*/
player_vo_t vo;
/** Window ID to attach the video (X Window). */
uint32_t winid;
/** Public event callback. */
int (*event_cb) (player_event_t e, void *data);
/** User data for event callback. */
void *data;
/**
* Display to use with X11 video outputs.
*
* The string has to follow the same rules that the DISPLAY environment
* variable. If \p display is NULL, then the environment variable is
* considered.
*/
const char *display;
/** Picture decoding quality. */
player_quality_level_t quality;
} player_init_param_t;
================================
例子:
player_t *player;
player_init_param_t param;
static int event_cb (player_event_t e, pl_unused void *data);
memset (¶m, 0, sizeof (player_init_param_t));
param.ao = PLAYER_AO_AUTO;
param.vo = PLAYER_VO_TCC89FB;// 如果是PC机,使用PLAYER_VO_AUTO
param.event_cb = event_cb;
param.quality = PLAYER_QUALITY_NORMAL;
player = player_init (PLAYER_TYPE_MPLAYER, PLAYER_MSG_WARNING, ¶m);
================================
■ 反初始化
void player_uninit (player_t *player);
播放控制
■ 获取当前播放文件的mrl
mrl_t * player_mrl_get_current (player_t *player);
■ 将指定的mrl设置为当前播放
void player_mrl_set (player_t *player, mrl_t *mrl);
■ 将指定的mrl设置为当前播放
void player_mrl_append (player_t *player, mrl_t *mrl, player_mrl_add_t when);
■ 播放列表中上一文件
void player_mrl_previous (player_t *player);
■ 播放列表中下一文件
void player_mrl_next (player_t *player);
■ pb模式下,继续播放下一视频
void player_mrl_continue (player_t *player);
■ 将指定的mrl从列表中删除
void player_mrl_remove (player_t *player);
■ 暂停当前播放
void player_playback_pause (player_t *player);
■ 开始新的播放
void player_playback_start (player_t *player);
■ 停止当前播放
void player_playback_stop (player_t *player);
■ 移除列表中所有文件
void player_mrl_remove_all (player_t *player);
■ 获取当前播放时间位置
int player_get_time_pos (player_t *player);
■ 获取当前播放百分比
int player_get_percent_pos (player_t *player);
■ 设置播放模式
void player_set_playback (player_t *player, player_pb_t pb);
这里有两种模式:PLAYER_PB_SINGLE和PLAYER_PB_AUTO模式
■ 跳转到指定位置
void player_playback_seek (player_t *player, int value, player_pb_seek_t seek);
typedef enum player_pb_seek {
PLAYER_PB_SEEK_RELATIVE,// 相对跳转
PLAYER_PB_SEEK_ABSOLUTE,// 绝对跳转
PLAYER_PB_SEEK_PERCENT,// 百分比跳转
} player_pb_seek_t;
■ 设置循环模式
void player_set_loop (player_t *player, player_loop_t loop, int value);
typedef enum player_loop {
PLAYER_LOOP_DISABLE = 0,
PLAYER_LOOP_ELEMENT,
PLAYER_LOOP_PLAYLIST,
} player_loop_t;
■ 返回播放器状态
player_pb_state_t player_playback_get_state (player_t *player);
typedef enum player_pb_state {
PLAYER_PB_STATE_IDLE,
PLAYER_PB_STATE_PAUSE,
PLAYER_PB_STATE_PLAY,
} player_pb_state_t;
获取文件信息
■ 获取指定mrl的文件类型,音频还是视频
mrl_type_t mrl_get_type (player_t *player, mrl_t *mrl);
mrl_type_t可以取MRL_TYPE_AUDIO或MRL_TYPE_VIDEO
■ 获取指定mrl的视频编码
char * mrl_get_video_codec (player_t *player, mrl_t *mrl);
■ 获取指定mrl的文件大小
off_t mrl_get_size (player_t *player, mrl_t *mrl);
■ 获取指定mrl的metadata
char * mrl_get_metadata (player_t *player, mrl_t *mrl, mrl_metadata_type_t m);
其中mrl_metadata_type_t 取值
typedef enum mrl_metadata_type {
MRL_METADATA_TITLE,
MRL_METADATA_ARTIST,
MRL_METADATA_GENRE,
MRL_METADATA_ALBUM,
MRL_METADATA_YEAR,
MRL_METADATA_TRACK,
MRL_METADATA_COMMENT,
} mrl_metadata_type_t;
■ 获取指定mrl文件属性
uint32_t mrl_get_property (player_t *player, mrl_t *mrl, mrl_properties_type_t p);
typedef enum mrl_properties_type {
MRL_PROPERTY_SEEKABLE,// 是否支持seek操作
MRL_PROPERTY_LENGTH,// 文件长度
MRL_PROPERTY_AUDIO_BITRATE,// 音频比特率
MRL_PROPERTY_AUDIO_BITS,// 音频
MRL_PROPERTY_AUDIO_CHANNELS,// 音频通道
MRL_PROPERTY_AUDIO_SAMPLERATE,// 音频采样率
MRL_PROPERTY_VIDEO_BITRATE,// 视频比特率,除以1000换算为kbps
MRL_PROPERTY_VIDEO_WIDTH,// 视频宽度
MRL_PROPERTY_VIDEO_HEIGHT,// 视频高度
MRL_PROPERTY_VIDEO_ASPECT,// 视频原始比例
MRL_PROPERTY_VIDEO_CHANNELS,// 视频通道
MRL_PROPERTY_VIDEO_STREAMS,// 视频流
MRL_PROPERTY_VIDEO_FRAMEDURATION,// 视频一帧持续时间
} mrl_properties_type_t;
音轨控制
■ 获取音轨个数
uint32_t mrl_get_metadata_audio_nb (player_t *player, mrl_t *mrl);
■ 获取音轨metadata
int mrl_get_metadata_audio (player_t *player, mrl_t *mrl, int pos,
uint32_t *id, char **name, char **lang);
其中参数id, name, lang为输出,pos为第几个音轨,从1开始。
■ 设置音频延迟
void player_audio_set_delay (player_t *player, int value, int absolute);
其中value为延迟时间,负数指音频较视频向前value毫秒,正数向后100毫秒,absolute一般取0。推荐value步进100
■ 选择音轨
void player_audio_select (player_t *player, int audio_id);
■ 上一个音轨,下一个音轨
void player_audio_prev (player_t *player);
void player_audio_next (player_t *player);
■ 静音
获取静音状态
player_mute_t player_audio_mute_get (player_t *player);
设置静音状态
void player_audio_mute_set (player_t *player, player_mute_t value);
value取值:PLAYER_MUTE_ON或PLAYER_MUTE_OFF
■ 获取音量
int player_audio_volume_get (player_t *player);
■ 设置音量
void player_audio_volume_set (player_t *player, int value);
字幕控制
■ 获取字幕文件个数
uint32_t mrl_get_metadata_subtitle_nb (player_t *player, mrl_t *mrl);
■ 获取字幕文件metadata
int mrl_get_metadata_subtitle (player_t *player, mrl_t *mrl, int pos,
uint32_t *id, char **name, char **lang);
其中参数id, name, lang为输出,pos为第几个字幕,从1开始。
■ 设置字幕延迟
void player_subtitle_set_delay (player_t *player, int value);
■ 设置字幕对齐格式
void player_subtitle_set_alignment (player_t *player,
player_sub_alignment_t a)
typedef enum player_sub_alignment {
PLAYER_SUB_ALIGNMENT_TOP,
PLAYER_SUB_ALIGNMENT_CENTER,
PLAYER_SUB_ALIGNMENT_BOTTOM,
} player_sub_alignment_t;
■ 设置字幕位置
void player_subtitle_set_position (player_t *player, int value);
■ 设置字幕是否可见
void player_subtitle_set_visibility (player_t *player, int value);
■ 设置字幕大小
void player_subtitle_scale (player_t *player, int value, int absolute);
■ 选择字幕
void player_subtitle_select (player_t *player, int sub_id);
■ 选择上一个、下一个字幕
void player_subtitle_prev (player_t *player);
void player_subtitle_next (player_t *player);
其他相关控制
■ 截图
void mrl_video_snapshot (player_t *player, mrl_t *mrl,
int pos, mrl_snapshot_t t, const char *dst);
其中参数4,选择抓图格式,参数5,保存路径
typedef enum mrl_snapshot {
MRL_SNAPSHOT_JPG,
MRL_SNAPSHOT_PNG,
MRL_SNAPSHOT_PPM,
} mrl_snapshot_t;
■ 设置播放速度
void player_playback_speed (player_t *player, float value);
默认播放速度为1,范围在0.1-100之间,推荐步进0.1
■ 获取指定mrl的视频编码
char * mrl_get_video_codec (player_t *player, mrl_t *mrl);
■ mplayer原始OSD是否显示
void player_osd_state (player_t *player, int value);
libplayer的回调函数,事件处理
int (*event_cb) (player_event_t e, void *data);函数由用户来具体实现,当libplayer感知到相应事件的时候,即开始执行回调函数,
由类型player_event_t可以看到,libplayer可以感知7种事件,用户可以在处理这些事件来再UI上进行相应的显示。
typedef enum player_event {
PLAYER_EVENT_UNKNOWN,
PLAYER_EVENT_PLAYBACK_START,
PLAYER_EVENT_PLAYBACK_STOP,
PLAYER_EVENT_PLAYBACK_FINISHED,
PLAYER_EVENT_PLAYLIST_FINISHED,
PLAYER_EVENT_PLAYBACK_PAUSE,
PLAYER_EVENT_PLAYBACK_UNPAUSE,
} player_event_t;
原创,转载请注明http://www.cnblogs.com/yeying/archive/2010/12/16/1907626.html
浙公网安备 33010602011771号