⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mediaclasses.h

📁 《Visual C++视频/音频开发实用工程案例精选》一书的源代码
💻 H
字号:
/**************************************************************************************
 *                                                                                    *
 *                                                                                    *
 **************************************************************************************/

#ifndef _MEDIA_CLASSES_H
#define _MEDIA_CLASSES_H

#include <windows.h>

/*
 * 基本类型 
 */

#include "MediaBuffer.h"
#include "Error.h"

/* 
 * 媒体类型
 */

typedef enum {

		MEDIA_TYPE_INPUT,
		MEDIA_TYPE_DECAPS,
		MEDIA_TYPE_VIDEO_DECODER,
		MEDIA_TYPE_AUDIO_DECODER,
		MEDIA_TYPE_VIDEO_BUFFER,
		MEDIA_TYPE_VIDEO_RENDERER,
		MEDIA_TYPE_AUDIO_RENDERER,
		MEDIA_TYPE_SUBTITLER,

} media_type_t;

/*  
 *性能类型
 */

#define MEDIA_CAPS_CAN_CONFIGURE 0x00000001
#define MEDIA_CAPS_BUFFERIZE     0x00000002

/*
 * 输入媒体类型
 */

/*
 * 文件格式
 */

typedef enum {

		INPUT_OPEN_ASCII,	
		INPUT_OPEN_BINARY

} media_input_mode_t;

/* 
 * 搜索
 */

typedef enum {

		INPUT_SEEK_SET,
		INPUT_SEEK_CUR,
		INPUT_SEEK_END

} media_input_seek_t;

/* 
 * 视频格式
 */

typedef enum {
	
		VIDEO_MODE_NONE,
		VIDEO_MODE_RGB8,
		VIDEO_MODE_RGB16,
		VIDEO_MODE_RGB24,
		VIDEO_MODE_RGB32,
		VIDEO_MODE_YUV9,
		VIDEO_MODE_YUV12,
		VIDEO_MODE_YUY2,
		VIDEO_MODE_UYVY,

} media_video_mode_t;

/*
 * 用于描述播放器的不同媒体节点,缓冲器,流的虚拟类
 */

class MediaItem {

private:

	media_type_t  type;
	char         *name;


public:

	/*
	 * 获取基本信息的方法
	 */

	virtual media_type_t  GetType() = 0;
	virtual char         *GetName() = 0;

	/*
	 * 连接媒体项
	 */

	virtual MP_RESULT     Connect(MediaItem *item) = 0;
	virtual MP_RESULT     ReleaseConnections()     = 0;

	/*
	 * 获得CAPS和配置项的方法
	 */

	virtual DWORD         GetCaps()                                 = 0;
	virtual MP_RESULT     Configure(HINSTANCE hInstance, HWND hwnd) = 0;
};

/*
 * MediaItemInput:
 * ---------------
 *  ——输入媒体项
 * 
 *
 */

class MediaItemInput : public MediaItem {

public:

	virtual MP_RESULT    Open(char *url, media_input_mode_t mode)  = 0;

	virtual long         GetSize()                                 = 0;
	virtual long         GetBufferSize()                           = 0;
	virtual long         GetBufferPosition()                       = 0;
	virtual long         GetBufferingSize()                        = 0;

	virtual unsigned int Read(MediaBuffer *mb, unsigned int size)  = 0;
	virtual unsigned int Seek(int size, media_input_seek_t method) = 0;
	virtual unsigned int GetLine(MediaBuffer *mb)                  = 0;
	
	virtual BOOL         EndOfFile()                               = 0;
	virtual MP_RESULT    Close()                                   = 0;
};

/*
 * MediaItemDecaps:
 * ----------------
 *
 *  ——Decaps流
 *
 */

class MediaItemDecaps : public MediaItem {

public:

	virtual unsigned int      GetNumberOfVideoStreams()                                                 = 0;
	virtual unsigned int      GetNumberOfAudioStreams()                                                 = 0;

	virtual unsigned int      GetVideoWidth(unsigned int StreamId)                                      = 0;
	virtual unsigned int      GetVideoHeight(unsigned int StreamId)                                     = 0;
	virtual double            GetVideoFrameRate(unsigned int StreamId)                                  = 0;
	virtual char             *GetVideoCompression(unsigned int StreamId)                                = 0;
	virtual BITMAPINFOHEADER *GetVideoHeader(unsigned int StreamId)                                     = 0;

	virtual unsigned long     GetCurrentVideoFrame(unsigned int StreamId)                               = 0;
	virtual unsigned long     GetTotalVideoFrames(unsigned int StreamId)                                = 0;
	virtual unsigned long     GetTotalVideoTime(unsigned int StreamId)                                  = 0;
	
	virtual unsigned int      GetAudioBits(unsigned int StreamId)                                       = 0;
	virtual unsigned int      GetAudioChannels(unsigned int StreamId)                                   = 0;
	virtual unsigned int      GetAudioFrequency(unsigned int StreamId)                                  = 0;
	virtual WAVEFORMATEX     *GetAudioFormat(unsigned int StreamId)                                     = 0;

	virtual unsigned int      GetNextVideoFrameSize(unsigned int StreamId)                              = 0;
	virtual unsigned int      ReadVideoFrame(unsigned int StreamId, MediaBuffer *mb)                    = 0;

	virtual unsigned int      ReadAudioData(unsigned int StreamId, char *buffer, unsigned int bytes)    = 0;
	virtual MP_RESULT         UpdateForSize()                                                           = 0;

	virtual MP_RESULT		  SeekAudio(unsigned int StreamId, long bytes)                              = 0;
	virtual MP_RESULT         SeekVideo(unsigned int StreamId, long frame)                              = 0;
	virtual MP_RESULT         ReSeekAudio(unsigned int StreamId)                                        = 0;

	virtual MP_RESULT         Seek(unsigned int videoStreamId, unsigned int audioStreamId, int percent) = 0;
	virtual MP_RESULT         Rewind(unsigned int videoStreamId, unsigned int audioStreamId)            = 0;

	virtual MP_RESULT         SeekNextKeyFrame(unsigned int StreamId)                                   = 0;
	virtual MP_RESULT         SeekPreviousKeyFrame(unsigned int StreamId)                               = 0;
};

/*
 * MediaItemVideoDecoder:
 * --------------------
 *
 *  ——从流中解码视频
 *
 *
 */

class MediaItemVideoDecoder : public MediaItem {

public:

	virtual unsigned int       GetFrameSize()                        = 0;

	virtual media_video_mode_t GetVideoMode()                        = 0;
	virtual BOOL               GetInvertFlag()                       = 0;
	virtual MP_RESULT          SetVideoMode(media_video_mode_t mode) = 0;

	virtual MP_RESULT          SetQuality(DWORD quality)             = 0;
	virtual DWORD              GetQuality()                          = 0;

	virtual MP_RESULT          Decompress(MediaBuffer *mb_out, unsigned int stride)       = 0;
	virtual MP_RESULT          Drop(MediaBuffer *mb_out, unsigned int stride)             = 0;
};

/*
 * MediaItemVideoBuffer:
 * --------------------
 *
 *  ——缓冲解码的图像
 *
 */

class MediaItemVideoBuffer : public MediaItem {

public:

	virtual MP_RESULT    StartBuffering(unsigned int stride) = 0;
	virtual MP_RESULT    StopBuffering()  = 0;

	virtual MediaBuffer *GetOneFrame()    = 0;
	virtual MediaBuffer *GetLastFrame()   = 0;
	virtual MP_RESULT    DropOneFrame()   = 0;
};

/*
 * MediaItemVideoRenderer:
 * ----------------------- 
 *
 *  ——补偿在屏幕上的视频
 *
 */

class MediaItemVideoRenderer : public MediaItem {

public:

	virtual MP_RESULT Init(HWND hwnd, unsigned int width, unsigned int height)                                = 0;
	virtual MP_RESULT InitFullscreen(HWND hwnd, unsigned int width, unsigned int height)                      = 0;

	virtual media_video_mode_t GetVideoMode()                                                                 = 0;
	virtual RECT              *GetFullscreenRects()                                                           = 0; 
  
	virtual MP_RESULT Draw(MediaBuffer *buffer, RECT *rect, int frameNumber, int invertFlag)                  = 0;
	virtual MP_RESULT DrawFullscreen(MediaBuffer *buffer, int frameNumber, int invertFlag, int desktopMode)   = 0;

	virtual MP_RESULT Stop()                                                                                  = 0;

	virtual MP_RESULT Close()                                                                                 = 0;
};

/*
 * 
 * 
 * 字幕变换的类型
 */

typedef struct _subtitles_t {

	char *subtitlesText[4];
	DWORD nbSubtitles;

} subtitles_t;

/* 
 * MediaItemSubtitler
 * ------------------
 *
 *  ——读字幕
 *
 */

class MediaItemSubtitler : public MediaItem {

public:

	virtual MP_RESULT    Open(char *lpFilename)                  = 0;
	virtual subtitles_t *GetSubtitles(DWORD frameNumber)         = 0;
	virtual MP_RESULT    Close()                                 = 0;
};

/*
 * MediaItemAudioDecoder:
 * ----------------------
 *
 *  ——将音频解码到缓冲器
 *
 */
 
class MediaItemAudioDecoder : public MediaItem {

public:

	virtual WAVEFORMATEX *GetAudioFormat()                                   = 0;
	virtual MP_RESULT     EmptyAudioBuffer()                                 = 0;

	virtual unsigned int  Decompress(void *buffer, unsigned int size) = 0;

};

/*
 * MediaItemAudioRenderer:
 * -----------------------
 *
 *  ——补偿系统声卡音频(Renderer audio to system soundcard)
 *
 */

/* 
 * 音频回调
 */

typedef unsigned int (*MediaAudioCallback)(void *lpData, void *buffer, unsigned int size);


class MediaItemAudioRenderer : public MediaItem {

public:

	virtual MP_RESULT     Open(HWND hwnd, WAVEFORMATEX *inFormat)                = 0;

	virtual MP_RESULT     SetCallback(void *lpData, MediaAudioCallback callback) = 0;
	virtual MP_RESULT     SetVolume(unsigned int volume)                         = 0;

	virtual unsigned long GetAudioTime()                                         = 0;
	virtual MP_RESULT     Bufferize()                                            = 0;

	virtual MP_RESULT     Start()                                                = 0;
	virtual MP_RESULT     Pause()                                                = 0;
	virtual MP_RESULT     Stop()                                                 = 0;

	virtual MP_RESULT     Close()                                                = 0;
};


#endif 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -