AVPlayer 之avcore模塊


avcore模塊介紹

avcore事實上它只是一個對外的c++類接口, 目前基於windows實現. 在avcore中, avplayer是一個對外的接口, 因下降依賴關係, 採用pimpl方式實現, 其實現是由player_impl完成的. 也就是說, 在avcore中是由player_impl實現, 由avplayer導出c++接口.c++

avplayer類

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

  1. 經過create_window來建立一個窗口或經過subclasswindow附加到一個已有的窗口上.
  2. 經過open函數來打開要播放的視頻, 並指定視頻源的類型(由上面幾個宏指定).
  3. 調用play函數開始播放(注意index是爲BT中多視頻播放而設置的, 單個文件播放默認爲0便可).
  4. 能夠調用pause或resume來暫時切換, 以及全屏切換.

注意, 內部實現了在播放窗口上點擊鼠標左鍵按窗口寬進行seek, 鼠標右鍵暫停, F2全屏切換.windows

player_impl實現類

player_impl實現了avplayer全部接口, 實現代碼在player_impl.cpp中, 下面簡單介紹下一些主要的函數實現.markdown

  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技術來實現, 本人比較懶, 採用了更簡單的方式).ide

  3. subclasswindow用於附加一個不一樣由player_impl建立的窗口, 這個其實就是相似MPlayer中的指定窗口渲染.函數

  4. win_wnd_proc窗口消息處理函數, WM_CREATE消息啓動了一個ID_PLAYER_TIMER定時器, 用於100毫秒後檢測視頻的寬高, 而後按這個寬高設置窗口大小, 另外還有一些簡單的消息處理, 最值的注意的是若是在ddraw的overlay模式渲染的話, 由於設置了colorkey是RGB(0, 0, 1),因此每次WM_PAINT消息過來時, 必須使用這個顏色的畫刷之類去填充窗口背景.spa

以上基本上就是avcore的所有內容了, 仍是至關簡單的.code

https://github.com/Jackarain/avplayer/wiki/avcore

相關文章
相關標籤/搜索