• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

夜鹰flying

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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

posted on 2010-12-16 10:18  夜鹰flying  阅读(1356)  评论(3)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3