Я пытаюсь провести простой тест, чтобы узнать, как настроить и использовать несколько USB-видеоустройств одновременно в проекте Universal Windows (позже для использования на Raspberry Pi с ядром IoT для Windows 10). Я хочу, чтобы пользовательский интерфейс отображал предварительный просмотр выбранной камеры. Я успешно последовал примеру предварительного просмотра на сайте MediaCapture ЗДЕСЬ
У меня есть класс TakePicture, который позже будет использоваться для других целей, но в настоящее время используется для поиска и инициализации видеоустройств, подключенных к системе, следующим образом
public static class TakePicture
{
private static List<CaptureElement> _captureElements;
private static List<MediaCapture> _mediaCaptures;
public static DeviceInformationCollection devices;
private static int currentDevice = 0;
public static async Task InitializeDevice()
{
if (currentDevice >= _captureElements.Count)
{
_mediaCaptures.Add(new MediaCapture());
var captureElement = new CaptureElement{Stretch = Stretch.UniformToFill};
_captureElements.Add(captureElement);
await _mediaCaptures[currentDevice].InitializeAsync(
new MediaCaptureInitializationSettings
{
VideoDeviceId = devices[currentDevice].Id,
StreamingCaptureMode = StreamingCaptureMode.Video
});
_captureElements[currentDevice].Source = _mediaCaptures[currentDevice];
}
}
public static void IncrimentDevice()
{
currentDevice = (currentDevice + 1) % devices.Count;
}
public static async Task<MediaCapture> getPreviewElement()
{
CaptureElement element = new CaptureElement();
await FindDevices();
await InitializeDevice();
return _mediaCaptures[currentDevice];
}
public static async Task FindDevices()
{
if (devices == null)
{
devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
_captureElements = new List<CaptureElement>();
_mediaCaptures = new List<MediaCapture>();
}
}
}
Я хочу вернуть объект MedaCapture, относящийся к камере, и использовать его для установки источника CaptureElement в графическом интерфейсе следующим образом:
private async Task StartPreviewAsync()
{
MediaCapture capture = await TakePicture.getPreviewElement();
await capture.StartPreviewAsync();
PreviewImage.Source = capture;
PreviewImage.Visibility = Visibility.Visible;
}
PreviewImage - это ссылка на элемент захвата в пользовательском интерфейсе:
<CaptureElement Name="PreviewImage" Stretch="Uniform" HorizontalAlignment="Center" Height="649" Margin="0,84,0,0" VerticalAlignment="Top" Width="1147"/>
НО каждый раз, когда я пытаюсь установить источник для элемента MediaCapture, я получаю исключение нулевой ссылки. Я проверил в отладчике, что этот объект не является нулевым и имеет идентификатор подключенного устройства, в дополнение к этому, когда я запускаю
await capture.StartPreviewAsync();
зеленый свет под камерой загорается на камере. Если я пытаюсь повторно инициализировать объект MediaCapture, возвращаемый GetPreviewElement, он выдает исключение, что устройство уже инициализировано.
Правильно ли я настраиваю несколько устройств? Является ли передача копии инициализированного MediaCapture допустимым способом установки источника CaptureElement?
Большое спасибо!