使用CaptureElement/MediaCapture时如何切换网络摄像头?我正在尝试提供一个选项,用于在使用CaptureElement/MediaCapture显示预览的网络摄像头之间切换。不幸的是,我尝试了调用序列的多种组合,但预览只显示了我使用的第一个设备。这就是我一直在努力做的事情:XAML:C#:MediaCapturemediaCapture;DeviceInformationCollection设备;int当前设备=0;privateasyncvoidLayoutRoot_Tapped(objectsender,Windows.UI.Xaml.Input.TappedEventArgse){if(devices!=null){currentDevice=(currentDevice+1)%devices.Count;初始化网络摄像头();}}privateasyncvoidInitializeWebCam(){if(devices==null){devices=awaitDeviceInformation.FindAllAsync(DeviceClass.VideoCapture);ListDeviceDetails();}if(mediaCapture!=null){awaitmediaCapture.StopPreviewAsync();这个.captureElement.Source=null;}mediaCapture=newMediaCapture();等待mediaCapture.InitializeAsync(newMediaCaptureInitializationSettings{VideoDeviceId=devices[currentDevice].Id});this.captureElement.Source=mediaCapture;等待mediaCapture.StartPreviewAsync();}privatevoidListDeviceDetails(){inti=0;foreach(vardeviceindevices){Debug.WriteLine("*Device[{0}]",i++);Debug.WriteLine("EnclosureLocation.InDock:"+device.EnclosureLocation.InDock);Debug.WriteLine("EnclosureLocation.InLid:"+device.EnclosureLocation.InLid);Debug.WriteLine("EnclosureLocation.Panel:"+device.EnclosureLocation.Panel);调试.WriteLine("Id:"+device.Id);Debug.WriteLine("IsDefault:"+device.IsDefault);Debug.WriteLine("IsEnabled:"+device.IsEnabled);Debug.WriteLine("名称:"+device.Name);Debug.WriteLine("IsDefault:"+device.IsDefault);foreach(varpropertyindevice.Properties){Debug.WriteLine(property.Key+":"+property.Value);}}}看向上它偶尔会切换到第二个摄像头(不到10%的时间)然后当我回到第一个时它有时会在应用程序挂起后全黑我尝试切换摄像头一次或两次(它停止响应输入,它停留在App.Run(),虽然相机预览不断刷新)。其他时候-它的工作方式是它显示第一台设备的预览,但不适用于另一台设备,当我去回到第一次-它再次正常工作。错误?似乎在任何地方都没有Dispose或Uninitialize方法。这些是我看到的属性(它是三星的Build2011平板电脑):*Device[0]EnclosureLocation.InDock:FalseEnclosureLocation.InLid:FalseEnclosureLocation.Panel:FrontId:\?USB#VID_2232&PID_1021&MI_00#7&2469C269&0&0000#{e532377-f976-4f5b-9b55-b94699c46e44}GLOBALIsDefault:FalseIsEnabled:TrueName:WebCamSC-20FHM11347NIsDefault:FalseSystem.ItemNameDisplay:WebCamSC-20FHM11347NSystem.Devices.DeviceInstanceId:USBVID_2232&PID_1021&MI_007&2469C269&0&0000System.Devices.Icon:C:WindowsSystem32DDORes.dll,-2068System.Devices.InterfaceEnabled:TrueSystem.Devices.IsDefault:False*Device[1]EnclosureLocation.InDock:FalseEnclosureLocation.InLid:FalseEnclosureLocation.Panel:返回ID:\?USB#VID_2232&PID_1022&MI_00#27&2902{&7&2902{-f976-4f5b-9b55-b94699c46e44}GLOBALIsDefault:FalseIsEnabled:True名称:WebCamSC-30H2L11449NIsDefault:FalseSystem.ItemNameDisplay:WebCamSC-30H2L11449NSystem.Devices.DeviceInstanceId:USBVID_2232&PID_1022&MI_007&27072759&0&0000System.Devices.Icon:C:WindowsSystem32DDORes.dll,-2068System.Devices.InterfaceEnabled:TrueSystem.Devices.IsDefault:False我没有平板电脑,我对Metro的体验也很少。.具有大量异步编程经验的您需要注意的一件事是异步程序不匹配状态。你本身没有竞争条件,但你必须考虑重入。在这种情况下,重入可能会导致单线程“竞争条件”。如果我是对的,避免事件重入的一个简单方法是使用布尔“重入保护”变量(我在下面称之为switchingMedia)。试试这个:MediaCapturemediaCapture;DeviceInformationCollection设备;int当前设备=0;boolswitchingMedia=false;privateasyncvoidLayoutRoot_Tapped(objectsender,Windows.UI.Xaml.Input.TappedEventArgse){if(devices!=null){InitializeWebCam();}}privateasyncvoidInitializeWebCam(){if(switchingMedia)return;切换媒体=真;如果(设备==null){设备=等待DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);ListDeviceDetails();}else{currentDevice=(currentDevice+1)%devices.Count;}if(mediaCapture!=null){awaitmediaCapture.StopPreviewAsync();这个.captureElement.Source=null;}mediaCapture=newMediaCapture();等待mediaCapture.InitializeAsync(newMediaCaptureInitializationSettings{VideoDeviceId=devices[currentDevice].Id});this.captureElement.Source=mediaCapture;等待mediaCapture.StartPreviewAsync();切换媒体=假;我还建议使用返回Task而不是void的异步方法(除非它们是事件,当然是处理程序)。这使它们可组合。例如,如果InitializeWebCam返回一个任务,那么您可以将重入保护代码放在事件处理程序中:switchingMedia){currentDevice=(currentDevice+1)%devices.Count;切换媒体=真;等待InitializeWebCam();切换媒体=假;通过将所有异步方法定义为默认返回Task,您有更多的可组合性选项。获得所有设备的列表后,尝试如下操作varrearCamera=devices.FirstOrDefault(item=>item.EnclosureLocation!=null&&item.EnclosureLocation.Panel==Windows.Devices.Enumeration.Panel.Back);我认为问题一定是开发者预览版。我在ConsumerPreview中的3个网络摄像头之间切换没有问题。以上是C#学习教程:使用CaptureElement/MediaCapture时如何切换网络摄像头?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
