MediaElement
我正在尝试在 UWP 应用程序中播放内置的网络摄像头提要。它适用于少数用户,但大多数用户都没有播放提要,我不知道可能是什么问题。
网络摄像头无法播放时的一些观察结果:
- 代码执行没有任何异常
- 显示请求用户访问相机权限的对话框
- 指示网络摄像头正在使用的 LED 指示灯在执行后立即亮起,但没有馈送。
- Skype 和相机应用程序运行良好。
- 该应用程序一直按预期工作,直到一周前。同时发生的一些可能产生影响的事情是
- 安装卡巴斯基
- 一堆windows更新
- 卸载VS2017专业版和VS2019社区版,安装VS2019专业版
可能需要一些额外信息来缩小原因。
- 在应用程序的包清单中启用了网络摄像头
- 应用目标版本:18362
- 应用最低版本:18362
- 视窗操作系统版本:18362
对此的任何帮助将不胜感激。提前非常感谢!
这是用于播放 VideoStreamer 是MediaElement
.
private async Task PlayLiveVideo()
{
var allGroups = await MediaFrameSourceGroup.FindAllAsync();
var eligibleGroups = allGroups.Select(g => new
{
Group = g,
// For each source kind, find the source which offers that kind of media frame,
// or null if there is no such source.
SourceInfos = new MediaFrameSourceInfo[]
{
g.SourceInfos.FirstOrDefault(info => info.DeviceInformation?.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front
&& info.SourceKind == MediaFrameSourceKind.Color),
g.SourceInfos.FirstOrDefault(info => info.DeviceInformation?.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
&& info.SourceKind == MediaFrameSourceKind.Color)
}
}).Where(g => g.SourceInfos.Any(info => info != null)).ToList();
if (eligibleGroups.Count == 0)
{
System.Diagnostics.Debug.WriteLine("No source group with front and back-facing camera found.");
return;
}
var selectedGroupIndex = 0; // Select the first eligible group
MediaFrameSourceGroup selectedGroup = eligibleGroups[selectedGroupIndex].Group;
MediaFrameSourceInfo frontSourceInfo = selectedGroup.SourceInfos[0];
MediaCapture mediaCapture = new MediaCapture();
MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings()
{
SourceGroup = selectedGroup,
SharingMode = MediaCaptureSharingMode.ExclusiveControl,
MemoryPreference = MediaCaptureMemoryPreference.Cpu,
StreamingCaptureMode = StreamingCaptureMode.Video,
};
try
{
await mediaCapture.InitializeAsync(settings);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("MediaCapture initialization failed: " + ex.Message);
return;
}
var frameMediaSource1 = MediaSource.CreateFromMediaFrameSource(mediaCapture.FrameSources[frontSourceInfo.Id]);
VideoStreamer.SetPlaybackSource(frameMediaSource1);
VideoStreamer.Play();
}