如何从具有H264硬件编码器的网络摄像头访问H264流?

时间:2014-08-01 18:54:36

标签: encoding directshow video-capture h.264

我正在使用DirectShow开发视频捕捉应用程序,我想利用某些网络摄像头上的H264硬件编码器。

特别是我正在研究两款相机:Creative Connect HD VF0750和Logitech C920,它们都声称具有H264硬件编码器。

使用GraphEdit,到目前为止我的结果好坏参半。 Logitech C920相机在DirectShow WDM Capture过滤器上将H264流作为Pin进行曝光,但仅在Windows 7上进行。在Windows 8上尝试相同,仅显示MJPEG和未压缩YUV流的输出引脚。

另一方面,Creative Connect HD VF0750相机似乎根本不露出H264引脚 - 即使在Windows 7中也是如此。

然而,他们都声称H264编码器,他们声称Skype可以利用硬件编码器。

所以问题是 - 用什么接口或API来从这些摄像头获取硬件编码的H264流?由于它们是由不同的制造商提供的,因此它们使用一些常见的API而不仅仅是一些模糊的Skype定制界面。

我使用这样的代码来枚举每个代码的所有引脚和媒体类型/子类型:

IBaseFilterPtr f = getBaseFilterFromEnum();    // code omitted for brevity

IEnumPinsPtr pEnum;
f->EnumPins(&pEnum);
IPinPtr pin;
while (pEnum->Next(1, &pin, NULL) == S_OK)
{
    PIN_INFO PinInformation;
    pin->QueryPinInfo(&PinInformation);                 

    IKsPropertySetPtr pKsPropertySet = pin;
    if(pKsPropertySet)
    {
        GUID Category;
        DWORD nCategorySize;                

        if(SUCCEEDED(pKsPropertySet->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, &Category, sizeof Category, &nCategorySize)))
        {
            // checks category type here

            IAMStreamConfigPtr pAmStreamConfig = pin;
            if(pAmStreamConfig)
            {
                int fmts, sccsz;
                pAmStreamConfig->GetNumberOfCapabilities(&fmts, &sccsz);
                BYTE* scc = new BYTE[sccsz];            

                for (int i = 0; i < fmts; i++)
                {
                    AM_MEDIA_TYPE* mt;
                    pAmStreamConfig->GetStreamCaps(i, &mt, scc);
                    if (mt)
                    {
                        if (mt->pbFormat)
                        {
                            // query here based on mt->formattype

                            //  and based on mt->subtype
                            if(mt->subtype == MEDIASUBTYPE_H264)
                            {
                                // has H264
                            }else if(mt->subtype == MEDIASUBTYPE_RGB24)
                            {
                                // has RGB
                            }else if(mt->subtype == MEDIASUBTYPE_YUY2)
                            {
                                // has YUY2
                            }else if(mt->subtype == MEDIASUBTYPE_MJPG)
                            {
                                // has MJPEG
                            }else
                            {
                                // has some other sub-type
                                //   not getting this on either of my cams
                            }
                            // free mem here
                        }
                        // more free mem here
                    }
                }
                delete[] scc;
            }else{                  
                // Error Getting Formats - this happens for the Video Terminal Pins
            }
        }           
    }
}

这是我在Windows 7上为两台摄像机获得的输出:

Live! Cam Connect HD VF0750
   Capture (CAPTURE):  
       18 Formats: RGB; YUY2; MJPEG; (VIDEO_INFO; )
   Video Camera Terminal (UNKNOWN):  
       Error Getting Formats
   Still (STILL):  
       3 Formats: RGB; (VIDEO_INFO; )
HD Pro Webcam C920
   Capture (CAPTURE):  
       106 Formats: H264; YUY2; MJPEG; (VIDEO_INFO; VIDEO_INFO2; )
   Video Camera Terminal (UNKNOWN):
       Error Getting Formats

在Windows 8上,输出不同。它们都没有提出H264子类型(尽管两者都声称支持H264硬件编码流)。

至少在Win7中,罗技相机按预期提供H264引脚。

1 个答案:

答案 0 :(得分:2)

随着时间的推移,我收到了一些用户提交的有关Logitech HD Pro Webcam C920相机在不同系统中的视频捕捉功能的提交。数据为here。硬件H.264视频的可用性需要特定的(最近的?)版本的驱动程序,并且操作系统版本的行为是不同的。虽然在Windows 7中,H264介质类型通常采用捕获引脚,但在较新的操作系统中,还有一个单独的附加Capture引脚,具有H264介质类型。显然,假设捕获H.264的应用程序意识到这种新布局并正确连接引脚/捕获。

这同样适用于Logitech Webcam C930e相机(Windows 7 - no H.264 at all,Windows 8.1 - H.264 on second capture pin)。

辅助捕获引脚上的数据具有标准MEDIASUBTYPE_H264格式:

enter image description here