我正在使用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引脚。
答案 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
格式: