日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

AVPlayer 之avcore模块

發(fā)布時間:2025/3/21 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AVPlayer 之avcore模块 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>


avcore模塊介紹

avcore事實上它只是一個對外的c++類接口, 目前基于windows實現(xiàn). 在avcore中, avplayer是一個對外的接口, 因降低依賴關(guān)系, 采用pimpl方式實現(xiàn), 其實現(xiàn)是由player_impl完成的. 也就是說, 在avcore中是由player_impl實現(xiàn), 由avplayer導(dǎo)出c++接口.

avplayer類

avplayer是一個向外部導(dǎo)出接口的類, 其接口如下:

// 打開媒體類型. #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:// 包含實現(xiàn)類HWND create_window(LPCTSTR player_name);// 銷毀窗口, 只能撤銷是由create_window創(chuàng)建的窗口.BOOL destory_window();// 子類化一個存在的窗口, in_process參數(shù)表示窗口是否在同一進程中.BOOL subclasswindow(HWND hwnd, BOOL in_process = TRUE);public:// 打開一個媒體文件// movie 文件名.// media_type 表示打開的媒體類型.// render_type 表示播放渲染模式, 默認(rèn)是ddraw渲染.// 注意, 這個函數(shù)只打開文件, 但并不播放, 重新打開文件前, 必// 須關(guān)閉之前的媒體文件, 否則可能產(chǎn)生內(nèi)存泄漏! 另外, 在播放// 前, avplayer必須擁有一個窗口.BOOL open(const char *movie, int media_type, int render_type = RENDER_DDRAW);// 播放索引為index的文件, index表示在播放列表中的// 位置計數(shù), 從0開始計算, index主要用于播放多文件的bt// 文件, 單個文件播放可以使用直接默認(rèn)為0而不需要填寫// 參數(shù).BOOL play(int index = 0);// 暫停播放.BOOL pause();// 繼續(xù)播放.BOOL resume();// 停止播放.BOOL stop();// 關(guān)閉媒體, 如果打開的是一個bt文件, 那么// 在這個bt文件中的所有視頻文件將被關(guān)閉.BOOL close();// seek到某個時間播放, 單位是視頻時長的百分比.void seek_to(double fact);// 設(shè)置聲音音量大小.void volume(double vol);// 全屏切換.BOOL full_screen(BOOL fullscreen);// 返回當(dāng)前播放時間.double curr_play_time();// 當(dāng)前播放視頻的時長, 單位秒.double duration();// 當(dāng)前播放視頻的高, 單位像素.int video_width();// 當(dāng)前播放視頻的寬, 單位像素.int video_height();// 返回當(dāng)前播放列表中的媒體文件數(shù).int media_count();// 返回播放列表index位置的媒體文件名.// 參數(shù)name應(yīng)該在外部分配內(nèi)存, 通過size參數(shù)傳入分配的// 內(nèi)存大小. 成功返回0, 返回-1表示失敗, 返回大于0表示// name分配的內(nèi)存不夠, 返回值為index對應(yīng)的文件名長度.int query_media_name(int index, char *name, int size);// 返回當(dāng)前窗口句柄.HWND get_wnd();private:player_impl *m_impl; };

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

  • 通過create_window來創(chuàng)建一個窗口或通過subclasswindow附加到一個已有的窗口上.
  • 通過open函數(shù)來打開要播放的視頻, 并指定視頻源的類型(由上面幾個宏指定).
  • 調(diào)用play函數(shù)開始播放(注意index是為BT中多視頻播放而設(shè)置的, 單個文件播放默認(rèn)為0即可).
  • 可以調(diào)用pause或resume來暫時切換, 以及全屏切換.
  • 注意, 內(nèi)部實現(xiàn)了在播放窗口上點擊鼠標(biāo)左鍵按窗口寬進行seek, 鼠標(biāo)右鍵暫停, F2全屏切換.

    player_impl實現(xiàn)類

    player_impl實現(xiàn)了avplayer所有接口, 實現(xiàn)代碼在player_impl.cpp中, 下面簡單介紹下一些主要的函數(shù)實現(xiàn).

  • open函數(shù)主要的功能主要完成判斷播放的媒體類型, 根據(jù)文件類型創(chuàng)建相應(yīng)的媒體源(media_source), 然后調(diào)用initialize初始化播放器. 并在初始化播放器之后, 初始化音頻和視頻的渲染器(分別是調(diào)用init_audio和init_video, 以及configure函數(shù)完成), 這個函數(shù)基本上完成了裝配一個avplay播放器的過程, 其它的函數(shù)基本上輔助性的了.

  • 在player_impl.cpp中你可能會看到一個win_data的結(jié)構(gòu), 也許你第一眼會很疑惑它是用來干嘛的, 現(xiàn)在說下: 這個結(jié)構(gòu)是用于create_window函數(shù)創(chuàng)建窗口時, Hook窗口過程使之回調(diào)到成員函數(shù)win_wnd_proc中. 這個原理是以前從MFC那里學(xué)來的, 通過在創(chuàng)建窗口前創(chuàng)建一個HCBT_CREATEWND鉤子, 之后的創(chuàng)建窗口調(diào)用CreateWindowEx時還在未回調(diào)窗口過程之前, 就進入HCBT_CREATEWND所設(shè)定的鉤子, 從而提前獲得HWND, 當(dāng)窗口創(chuàng)建完成之后, 所有消息都可以通過win_wnd_proc來完成回調(diào), 更具體的見代碼或理解MFC框架原理(注意這里也可以使用WTL的Thunk技術(shù)來實現(xiàn), 本人比較懶, 采用了更簡單的方式).

  • subclasswindow用于附加一個不同由player_impl創(chuàng)建的窗口, 這個其實就是類似MPlayer中的指定窗口渲染.

  • win_wnd_proc窗口消息處理函數(shù), WM_CREATE消息啟動了一個ID_PLAYER_TIMER定時器, 用于100毫秒后檢測視頻的寬高, 然后按這個寬高設(shè)置窗口大小, 另外還有一些簡單的消息處理, 最值的注意的是如果在ddraw的overlay模式渲染的話, 因為設(shè)置了colorkey是RGB(0, 0, 1),所以每次WM_PAINT消息過來時, 必須使用這個顏色的畫刷之類去填充窗口背景.

  • 以上基本上就是avcore的全部內(nèi)容了, 還是相當(dāng)簡單的.

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

    轉(zhuǎn)載于:https://my.oschina.net/jackwgm/blog/54408

    總結(jié)

    以上是生活随笔為你收集整理的AVPlayer 之avcore模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。