我有一个用 C++Builder 11.1.5 编写的应用程序,我正在尝试从 2 个网络摄像头捕获实时视频。
有一个优秀的教程,它描述了如何使用 1 个网络摄像头在以下 URL 上执行此操作,我已经完美地工作了:Video Capturing.
按照那个例子,我在窗体的
OnCreate
事件上使用下面的代码,它存储了计算机上所有可用的视频捕获设备的信息:
NumbAvailableCameras = 0;
DeviceList = TCaptureDeviceManager::Current->GetDevicesByMediaType(TMediaType::Video);
for (i = 0; i < DeviceList->Count; i++) {
UniqueID = DeviceList->Items[i]->UniqueID;
UniqueDescription = DeviceList->Items[i]->Description;
UniqueName = DeviceList->Items[i]->Name;
ComboBox1->Items->Add(DeviceList->Items[i]->Name);
AvailableCameraIndices[NumbAvailableCameras] = i;
AvailableCameraNames[NumbAvailableCameras] = DeviceList->Items[i]->Name;
AvailableCameraDescriptions[NumbAvailableCameras] = UniqueDescription;
AvailableCameraIdentifiers[NumbAvailableCameras] = UniqueID;
CameraIndex[i] = i;
NumbAvailableCameras++;
}
然后,有一个按钮,它的
OnClick
事件允许启动捕获:
CAM1VideoCamera = dynamic_cast<TVideoCaptureDevice*>
(TCaptureDeviceManager::Current->GetDevicesByName(ComboBox1->Selected->Text));
现在,我有 2 个名称相同的网络摄像头,因此
GetDevicesByName()
例程不起作用,因为它会选择它找到的具有所选名称的第一个摄像头。
作为替代方案,我尝试了以下代码,但它为捕获设备返回
NULL
:
CAM1VideoCamera = dynamic_cast<TVideoCaptureDevice*>
(TCaptureDeviceManager::Current->Devices[CameraIndex[0]]);
关于如何正确执行此操作的任何想法?
我有 2 个名称相同的网络摄像头,因此 GetDevicesByName 例程无法正常工作,因为它会选择使用所选名称找到的first 摄像头
实际上,它返回具有所选名称(错误?)的last设备。
我觉得奇怪的是,该方法被命名为plural但它只返回一个single设备。
我现在已经向Embarcadero报告了这些问题:
RSP-41707:TCaptureDeviceManager.GetDevicesByName() 问题
我尝试了以下代码,但它为 CaptureDevice 返回 NULL
那是因为你用错了索引。您检索的只是视频设备的
TCaptureDeviceList
,但是在访问主TCaptureDeviceList
列表时,您正在使用与该TCaptureDeviceManager::Devices[]
相关的索引。因此,如果视频设备前面的 Devices[]
列表中存在任何音频设备,那么您的 CameraIndex[]
索引将无法正确匹配。
要做你正在尝试的事情,你将不得不忘记使用
GetDevicesByMediaType()
而是直接迭代 Devices[]
列表,例如:
NumbAvailableCameras = 0;
int DeviceCount = TCaptureDeviceManager::Current->Count;
for (int DeviceIndex = 0; DeviceIndex < DeviceCount; ++DeviceIndex) {
TCaptureDevice *Device = TCaptureDeviceManager::Current->Devices[DeviceIndex];
if (Device->MediaType != TMediaType::Video) continue;
UniqueID = Device->UniqueID;
UniqueDescription = Device->Description;
UniqueName = Device->Name;
ComboBox1->Items->Add(UniqueName);
AvailableCameraIndices[NumbAvailableCameras] = NumbAvailableCameras; // should this be DeviceIndex instead?
AvailableCameraNames[NumbAvailableCameras] = UniqueName;
AvailableCameraDescriptions[NumbAvailableCameras] = UniqueDescription;
AvailableCameraIdentifiers[NumbAvailableCameras] = UniqueID;
CameraIndex[NumbAvailableCameras] = DeviceIndex; // <-- absolute index, not relative index!
++NumbAvailableCameras;
}
现在访问
TCaptureDeviceManager::Current->Devices[CameraIndex[...]]
应该按预期工作。
不过,看起来
AvailableCameraIndices[]
和CameraIndex[]
可能在做同样的工作,所以你可以考虑去掉其中一个。