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