AVPlayer 之avcore模块
2019獨角獸企業重金招聘Python工程師標準>>>
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// 渲染模式. #define RENDER_DDRAW 0 #define RENDER_D3D 1 #define RENDER_OGL 2class 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; };
由上可以看出使用方法是:
注意, 內部實現了在播放窗口上點擊鼠標左鍵按窗口寬進行seek, 鼠標右鍵暫停, F2全屏切換.
player_impl實現類
player_impl實現了avplayer所有接口, 實現代碼在player_impl.cpp中, 下面簡單介紹下一些主要的函數實現.
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技術來實現, 本人比較懶, 采用了更簡單的方式).
subclasswindow用于附加一個不同由player_impl創建的窗口, 這個其實就是類似MPlayer中的指定窗口渲染.
win_wnd_proc窗口消息處理函數, WM_CREATE消息啟動了一個ID_PLAYER_TIMER定時器, 用于100毫秒后檢測視頻的寬高, 然后按這個寬高設置窗口大小, 另外還有一些簡單的消息處理, 最值的注意的是如果在ddraw的overlay模式渲染的話, 因為設置了colorkey是RGB(0, 0, 1),所以每次WM_PAINT消息過來時, 必須使用這個顏色的畫刷之類去填充窗口背景.
以上基本上就是avcore的全部內容了, 還是相當簡單的.
https://github.com/Jackarain/avplayer/wiki/avcore
轉載于:https://my.oschina.net/jackwgm/blog/54408
總結
以上是生活随笔為你收集整理的AVPlayer 之avcore模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js cmd
- 下一篇: Greasemonkey——打造自己的互