LibVLCSharp如何获取可用摄像头列表及默认分辨率
LibVLCSharp获取摄像头列表及默认分辨率解决方案
修复MediaList为空的问题
你创建MediaDiscoverer实例后没有启动设备发现流程,所以MediaList始终为空,需要主动调用Start()方法并等待发现完成后再读取设备列表。
完整获取摄像头列表实现代码
using LibVLCSharp.Shared; using System.Linq; // 初始化LibVLC(注意要先调用Core.Initialize()加载原生库) Core.Initialize(); using var libVlc = new LibVLC(); // 获取设备类的媒体发现器 var deviceDiscoverers = libVlc.MediaDiscoverers(MediaDiscovererCategory.Devices); var videoCaptureDiscoverer = deviceDiscoverers.FirstOrDefault(d => d.LongName == "Video capture"); if (videoCaptureDiscoverer != null) { using var mediaDiscoverer = new MediaDiscoverer(libVlc, videoCaptureDiscoverer.Name); // 启动设备发现 mediaDiscoverer.Start(); // 等待发现完成,也可以监听MediaDiscoverer的MediaListAdded事件做异步处理 await Task.Delay(300); // 遍历所有摄像头设备 foreach (var cameraMedia in mediaDiscoverer.MediaList) { // 摄像头设备地址,例如v4l2:///dev/video0 var cameraUrl = cameraMedia.Mrl; var cameraName = cameraMedia.Name; Console.WriteLine($"找到摄像头:{cameraName},地址:{cameraUrl}"); } }
查询摄像头默认/支持的分辨率
拿到摄像头的Media实例后,通过解析媒体轨道信息即可获取分辨率参数:
// 以上面获取的cameraMedia为例 // 解析媒体信息,设置超时时间1秒 var parseResult = await cameraMedia.ParseAsync(MediaParseOptions.ParseLocal, 1000); if (parseResult == MediaParsedStatus.Success) { // 取视频轨道信息 var videoTracks = cameraMedia.Tracks.OfType<VideoTrack>().ToList(); if (videoTracks.Any()) { // 默认分辨率一般为第一个轨道的参数 var defaultWidth = videoTracks.First().Width; var defaultHeight = videoTracks.First().Height; Console.WriteLine($"默认分辨率:{defaultWidth}*{defaultHeight}"); // 遍历所有支持的分辨率 foreach (var track in videoTracks) { Console.WriteLine($"支持分辨率:{track.Width}*{track.Height}"); } } }
注意事项
- Linux平台设备前缀为
v4l2://,Windows平台为dshow://,macOS平台为avfoundation://,代码无需修改可自动适配 - 如果等待300ms仍拿不到设备,可以适当延长等待时间,或者监听
MediaDiscoverer.MediaListAdded事件做异步响应,避免阻塞主线程
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

