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

Encoding 如何从具有H264硬件编码器的网络摄像头访问H264流?,encoding,directshow,video-capture,h.264,Encoding,Directshow,Video Capture,H.264,我正在使用DirectShow开发一个视频捕获应用程序,我想利用一些网络摄像机上的H264硬件编码器 我特别关注两款相机:Creative Connect HD VF0750和Logitech C920,它们都声称拥有H264硬件编码器 使用GraphEdit,到目前为止,我的结果好坏参半。Logitech C920摄像头在DirectShow WDM捕获过滤器上将H264流作为Pin公开,但仅在Windows 7上公开。在Windows 8上尝试相同操作时,仅显示MJPEG和未压缩YUV流的输

我正在使用DirectShow开发一个视频捕获应用程序,我想利用一些网络摄像机上的H264硬件编码器

我特别关注两款相机:Creative Connect HD VF0750和Logitech C920,它们都声称拥有H264硬件编码器

使用GraphEdit,到目前为止,我的结果好坏参半。Logitech C920摄像头在DirectShow WDM捕获过滤器上将H264流作为Pin公开,但仅在Windows 7上公开。在Windows 8上尝试相同操作时,仅显示MJPEG和未压缩YUV流的输出管脚

另一方面,Creative Connect HD VF0750摄像头似乎根本不会暴露H264引脚,即使在Windows 7中也是如此

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

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

我使用了这样的代码来枚举每个端口的所有管脚和介质类型/子类型:

IBaseFilterPtr f=getBaseFilterFromEnum();//为简洁起见省略了代码
IEnumPinsPtr pEnum;
f->EnumPins和pEnum;
IPinPtr引脚;
while(pEnum->Next(1,&pin,NULL)==S_OK)
{
PIN_信息PIN信息;
pin->QueryPinInfo(&PinInformation);
IKsPropertySetPtr PKSPPropertySet=引脚;
if(pKsPropertySet)
{
GUID类别;
德沃德·恩卡利;
if(成功(pksprropertySet->Get(AMPROPSETID\u Pin、AMPROPERTY\u Pin\u CATEGORY、NULL、0、&CATEGORY、类别大小、&nCategorySize)))
{
//在此处检查类别类型
IAMStreamConfigPtr pAmStreamConfig=引脚;
if(pAmStreamConfig)
{
int fmts,sccsz;
pAmStreamConfig->GetNumberOfCapabilities(&fmts,&sccsz);
字节*scc=新字节[sccsz];
对于(int i=0;iGetStreamCaps(i和mt、scc);
中频(mt)
{
如果(mt->PBF格式)
{
//根据mt->formattype在此处查询
//基于mt->subtype
如果(mt->subtype==MEDIASUBTYPE_H264)
{
//有H264吗
}else if(mt->subtype==MEDIASUBTYPE_RGB24)
{
//有RGB吗
}else if(mt->subtype==MEDIASUBTYPE\u YUY2)
{
//有YUY2吗
}else if(mt->subtype==MEDIASUBTYPE_MJPG)
{
//有MJPEG吗
}否则
{
//有其他子类型
//我的摄像机都没拍到
}
//这里有免费会员
}
//更多免费mem在这里
}
}
删除[]scc;
}否则{
//获取格式时出错-视频终端引脚会发生这种情况
}
}           
}
}
这是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中,Logitech摄像头提供了预期的H264 pin。

随着时间的推移,我收到了一些用户提交的关于Logitech HD Pro网络摄像头C920摄像头在不同系统中的视频捕获功能的意见。数据是。硬件H.264视频的可用性需要特定(最新?)版本的驱动程序,并且不同操作系统版本的行为不同。虽然在Windows 7中,H264媒体类型可以通过通常的方式在捕获pin上获得,但在较新的操作系统中,有一个单独的附加捕获pin和H264媒体类型。显然,捕获H.264的应用程序被假定知道这种新布局,并适当地连接引脚/捕获

这同样适用于Logitech网络摄像头C930e摄像头(Windows 7-、Windows 8.1-)

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


基本上你做得对,你可能感兴趣的另一个格式发现选项是使用
IPin::EnumMediaTypes
枚举媒体类型-你可能会在那里看到H.264。另外,仅供参考,这是一种使用
IAMStreamConfig
枚举媒体类型的快速方法(你已经这样做了)。@RomanR。谢谢你的来电。你知道为什么Winodws 8上的同一个摄像头不提供H264媒体类型吗?我能想到的唯一一件事是,不同版本的Windows(或者不同版本/版本的驱动程序)中的摄像头表现不同。另一个问题是Skype真的能利用H.264硬件编码吗?如果是的话,也许可以检查一下它的过滤图,看看它到底是如何做到的。amn@it是问题hi-Roman中的代码片段-谢谢你的回答。我想知道你是否有时间聊天,因为我可能有一些信息来补充你在我的Windows 7 x86-64上的工作。使用graph Studio Next x86-64从C920媒体源构建图形为我提供了一个专用的H.264捕获引脚。这与您的陈述相矛盾“…在Windows 7 H264中,媒体类型可以通过通常的方式在捕获pin上获得”。我只是想提一下。@amn:这取决于司机