Skip to content
This repository has been archived by the owner on Jun 5, 2024. It is now read-only.
Jackarain edited this page Apr 21, 2012 · 7 revisions

#AVPlayer 之avcore模块 ##avcore模块介绍 avcore事实上它只是一个对外的c++类接口, 目前基于windows实现. 在avcore中, avplayer是一个对外的接口, 因降低依赖关系, 采用pimpl方式实现, 其实现是由player_impl完成的. 也就是说, 在avcore中是由player_impl实现, 由avplayer导出c++接口.

##avplayer类 avplayer是一个向外部导出接口的类, 其接口如下:

// 打开媒体类型.
#define MEDIA_TYPE_FILE	0
#define MEDIA_TYPE_BT	1
#define MEDIA_TYPE_HTTP 2
#define MEDIA_TYPE_RTSP 3

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可以是MEDIA_TYPE_FILE,
	// 也可以是MEDIA_TYPE_BT, 注意, 这个函数只打开文件, 但并不播放.
	// 重新打开文件前, 必须关闭之前的媒体文件, 否则可能产生内存泄漏!
	// 另外, 在播放前, avplayer必须拥有一个窗口.
	BOOL open(LPCTSTR movie, int media_type);

	// 播放索引为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 sec);

	// 设置声音音量大小.
	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;
};

由上可以看出使用方法是:

  1. 通过create_window来创建一个窗口或通过subclasswindow附加到一个已有的窗口上.
  2. 通过open函数来打开要播放的视频, 并指定视频源的类型(由上面几个宏指定).
  3. 调用play函数开始播放(注意index是为BT中多视频播放而设置的, 单个文件播放默认为0即可).
  4. 可以调用pause或resume来暂时切换, 以及全屏切换.

注意, 内部实现了在播放窗口上点击鼠标左键按窗口宽进行seek, 鼠标右键暂停, F2全屏切换.

##player_impl实现类

player_impl实现了avplayer所有接口, 实现代码在player_impl.cpp中, 下面简单介绍下一些主要的函数实现.

  1. open函数主要的功能主要完成判断播放的媒体类型, 根据文件类型创建相应的媒体源(media_source), 然后调用initialize初始化播放器. 并在初始化播放器之后, 初始化音频和视频的渲染器(分别是调用init_audio和init_video, 以及configure函数完成), 这个函数基本上完成了装配一个avplay播放器的过程, 其它的函数基本上辅助性的了.

  2. 在player_impl.cpp中你可能会看到一个win_data的结构, 也许你第一眼会很疑惑它是用来干嘛的, 现在说下: 这个结构是用于create_window函数创建窗口时, Hook窗口过程使之回调到成员函数win_wnd_proc中. 这个原理是以前从MFC那里学来的, 通过在创建窗口前创建一个HCBT_CREATEWND钩子, 之后的创建窗口调用CreateWindowEx时还在未回调窗口过程之前, 就进入HCBT_CREATEWND所设定的钩子, 从而提前获得HWND, 当窗口创建完成之后, 所有消息都可以通过win_wnd_proc来完成回调, 更具体的见代码或理解MFC框架原理(注意这里也可以使用WTL的Thunk技术来实现, 本人比较懒, 采用了更简单的方式).

  3. subclasswindow用于附加一个不同由player_impl创建的窗口, 这个其实就是类似MPlayer中的指定窗口渲染.

  4. win_wnd_proc窗口消息处理函数, WM_CREATE消息启动了一个ID_PLAYER_TIMER定时器, 用于100毫秒后检测视频的宽高, 然后按这个宽高设置窗口大小, 另外还有一些简单的消息处理, 最值的注意的是如果在ddraw的overlay模式渲染的话, 因为设置了colorkey是RGB(0, 0, 1),所以每次WM_PAINT消息过来时, 必须使用这个颜色的画刷之类去填充窗口背景.

以上基本上就是avcore的全部内容了, 还是相当简单的.

Clone this wiki locally