AM_MEDIA_TYPE

本文介绍了DirectShow中AM_MEDIA_TYPE结构的定义与使用方法。详细解释了各成员变量的作用,并通过示例展示了如何检查媒体类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

媒体类型是通过AM_MEDIA_TYPE 结构定义的,看看原始定义吧
typedef struct _MediaType 
{
	GUID majortype;
	GUID subtype;
	BOOL bFixedSizeSamples;
	BOOL bTemporalCompression;
	ULONG lSampleSize;
	GUID formattype;
	IUnknown *pUnk;
	ULONG cbFormat;
	[size_is(cbFormat)] BYTE *pbFormat;
} AM_MEDIA_TYPE;


Major type:是一个GUID,用来定义数据的主类型,包括,音频,视频,unparsed 字节流,MIDI数据,等等,具体可以参考msdn。

GUID Description
MEDIATYPE_AnalogAudio

Analog audio.

MEDIATYPE_AnalogVideo

Analog video.

MEDIATYPE_Audio

Audio. See Audio Subtypes.

MEDIATYPE_AUXLine21Data

Line 21 data. Used by closed captions. See Line 21 Media Types.

MEDIATYPE_File

File. (Obsolete)

MEDIATYPE_Interleaved

Interleaved audio and video. Used for Digital Video (DV).

MEDIATYPE_LMRT

Obsolete. Do not use.

MEDIATYPE_Midi

MIDI format.

MEDIATYPE_MPEG2_PES

MPEG-2 PES packets. See MPEG-2 Media Types.

MEDIATYPE_MPEG2_SECTIONS

MPEG-2 section data. See MPEG-2 Media Types.

MEDIATYPE_ScriptCommand

Data is a script command, used by closed captions.

MEDIATYPE_Stream

Byte stream with no time stamps. See Stream Subtypes.

MEDIATYPE_Text

Text.

MEDIATYPE_Timecode

Timecode data. Note: DirectShow does not provide any filters that support this media type.

MEDIATYPE_URL_STREAM

Obsolete. Do not use.

MEDIATYPE_VBI

Vertical blanking interval (VBI) data (for television). Same as KSDATAFORMAT_TYPE_VBI.

MEDIATYPE_Video

Video. See Video Subtypes.




Subtype:子类型,也是一个GUID,用来进一步的细化数据格式,例如,在视频主类型中,还包括RGB-24, RGB-32, UYVY 等等一些子类型,在音频主类型中还包括PCM audio, MPEG-1payload 等类型,子类型提供了比主类型更详细的信息,但是并没有定义所有的格式,例如,视频的子类型并没有定义图像大小,桢率。这些由下面的字段定义。


bFixedSizeSamples 当这个值为TRUE 时,表示sample 大小固定。


bTemporalCompression 当这个值为TRUE 时,表示sample 采用了临时压缩格式,表明不是所有的桢都是关键桢,如果为FALSE,表明所有的都是关键桢。


lSampleSize 表示sample 的大小。对于压缩的数据,这个值可能为零。


Formattype 一个GUID 值, 用来表明内存块的格式。包括如下: FORMAT_None ,FORMAT_DvInfo,FORMAT_MPEGVideo,FORMAT_MPEG2Video,FORMAT_VideoInfo,FORMAT_VideoInfo2,FORMAT_WaveFormatEx,GUID_NULL


pUnk 该参数没有用到


cbFormat 内存块的大小


pbFormat 指向内存块的指针,


下面我们看一段代码,看看filter 如何检测媒体类型的。
HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
	if (pmt == NULL) return E_POINTER;
	// Check the major type. We're looking for video.
	if (pmt->majortype != MEDIATYPE_Video)
	{
		return VFW_E_INVALIDMEDIATYPE;
	}
	// Check the subtype. We're looking for 24-bit RGB.
	if (pmt->subtype != MEDIASUBTYPE_RGB24)
	{
		return VFW_E_INVALIDMEDIATYPE;
	}
	// Check the format type and the size of the format block.
	if ((pmt->formattype == FORMAT_VideoInfo) &&(pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&(pmt->pbFormat != NULL))
	{
		// Now it's safe to coerce the format block pointer to the
		// correct structure, as defined by the formattype GUID.
		VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
		// Examine pVIH (not shown). If it looks OK, return S_OK.
		return S_OK;
	}
	return VFW_E_INVALIDMEDIATYPE;
}


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值