Qt實戰--視頻引擎接口類HVideoPlayer

HVideoPlayer

接口功能

  • 設置媒體源HMedia
  • 開始start、停止stop、暫停pause、繼續resume
  • 視頻幀HFrame的push、pop

定義代碼

#ifndef HVIDEOPLAYER_H
#define HVIDEOPLAYER_H

#include "hmedia.h"
#include "hframe.h"

class HVideoPlayer
{
public:
    HVideoPlayer(){}
    virtual ~HVideoPlayer() {}

    virtual int start() = 0;
    virtual int stop() = 0;
    virtual int pause() = 0;
    virtual int resume() = 0;

    void set_media(HMedia& media){
        this->media = media;
    }

    FrameStats get_frame_stats(){
        return frame_buf.frame_stats;
    }

    FrameInfo get_frame_info(){
        return frame_buf.frame_info;
    }

    void set_frame_cache(int cache){
        frame_buf.setCache(cache);
    }

    int push_frame(HFrame* pFrame){
        return frame_buf.push(pFrame);
    }

    int pop_frame(HFrame* pFrame){
        return frame_buf.pop(pFrame);
    }

protected:
    HMedia      media;
    HFrameBuf   frame_buf;
};

#endif // HVIDEOPLAYER_H

HMedia

#ifndef HMEDIA_H
#define HMEDIA_H

#include <string>

enum MEDIA_TYPE{
    MEDIA_TYPE_FILE = 0,
    MEDIA_TYPE_NETWORK,
    MEDIA_TYPE_CAPTURE,

    MEDIA_TYPE_NONE
};

#define DEFAULT_MEDIA_TYPE  MEDIA_TYPE_CAPTURE

typedef struct media_s{
    MEDIA_TYPE  type;
    int         index; // for camera index
    std::string src;
    std::string descr;

    media_s(){
        type = DEFAULT_MEDIA_TYPE;
        index = 0;
    }
}HMedia;

#endif // HMEDIA_H

HFrame

typedef struct hframe_s{
    hbuf_t buf;
    int w;
    int h;
    int type;
    int bpp;
    uint64 ts;
    void* userdata;
}HFrame;

HFrameBuf

class HFrameBuf : public HRingBuf{
public:
    enum CacheFullPolicy{
        SQUEEZE,
        DISCARD,       
    }policy;
    
    HFrameBuf() : HRingBuf() {
        cache_num = DEFAULT_FRAME_CACHENUM;
        policy = SQUEEZE;
    }

    void setCache(int num) {cache_num = num;}
    void setPolicy(CacheFullPolicy policy) {this->policy = policy;}

    int push(HFrame* pFrame);
    int pop(HFrame* pFrame);

    int         cache_num;
    FrameStats  frame_stats;
    FrameInfo   frame_info;
    std::deque<HFrame> frames;
};

HFrameBuf幀緩存類繼承自環形緩存類HRingBuf,由緩存的幀數決定環形緩存區的大小;
push接口從環形緩存區分配內存,從HFrame拷貝數據,並記錄在雙端隊列std::deque<HFrame> frames;中;
pop接口從雙端隊列std::deque<HFrame> frames;中取出一幀,拷貝數據至HFrame;

HBuf、HRingBuf

關於緩存類HBuf和環形緩存類HRingBuf的定義實現請自行研究Github源碼,
你將體會到C內存管理的靈活和高效之處。

交互圖

我們用graphviz簡單畫下HVideoPlayer視頻播放引擎類和HVideoWidget視頻播放控件類的交互過程:

HVideoPlayer

下一節我們給出基於OpenCV中VideoCapture類實現的播放引擎實現類HVideoCapture

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章