DirectShow - About Media Types

39 篇文章 0 订阅
6 篇文章 0 订阅

因为DirectShow是组件式的,它需要在filter graph各个filter之间统一数据格式。比如,播放AVI文件,数据传入graph就是视频流,它们被转换为视频和音频流。视频流由压缩的视频帧组成,解压后,视频帧就转换为没有压缩的位图;音频也是类似的一个过程。


 Media Types:DirectShow如何来表示格式

 Media Types 是一种通用和扩展的方式来描述数字视频格式。当两个filter连接时,得现在媒体类型上达成协议。Media Types 就是一种视频类型协议数据从上层filter到下层filter,直到物理输出设备。如果两个filter没有在media type上达成一致,它们连接不上。


某些程序不用考虑媒体类型的问题,比如,文件播放的情况,DirectShow 掌握了所有的细节。另外一些情况可能就需要考虑了。


Media Types 用结构 AM_MEDIA_TYPE 来定义。这个结构描述如下:


1、Major type :Majo type 定义了数据的最上层格式。

2、Subtype :subtypes是另一种GUID用来描述格式。比如,对于视频,它们的subtypes就分为RGB-24,RGB-32,UYVY等等,对于音频,分为PCM,MPEG-1等。虽然subtypes描述的比Major type详细,但是也没有包罗万象,比如对于视频帧率,或者图像大小,就是由format block来描述。

3、Format block:format block用来描述一段数据更详细的格式信息。format block被单独于AM_MEDIA_TYPE结构分配。AM_MEDIA_TYPE中pbFormat 成员就是Format block的一个指针。


当format block被填充满的时候,major type和subtype里面的信息就显得多余了,不过通过它们我们可以在不需要完整的format block的情况下方便的访问到一些信息,比,你可以在不需要知道其结构VIDEOINFOHEADER中所有的信息情况下去指定一个 24-bit RGB格式,比如图片的大小和帧率。


filter需要用下面的code来检查medio type

example:

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;
}

AM_MEDIA_TYPE结构还包含了一些其他域,用来提供额外的信息,不过filters不需要用到它们,这里也就不介绍了。


微软原文:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd373394(v=vs.85).aspx



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值