Установка нулевого исключения источника CaptureElement - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь провести простой тест, чтобы узнать, как настроить и использовать несколько 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?

Большое спасибо!

...