Проблема с изменением соотношения сторон / уровня масштабирования при использовании MediaCapture? - PullRequest
0 голосов
/ 28 июня 2018

Я использую MediaCapture вместе с CapturePreview для создания потока предварительного просмотра на планшете Surface Pro. Я делаю фотографии периодически с таймером, используя

CapturePhotoToStreamAsync()

Когда бы ни была сделана фотография, поток предварительного просмотра слегка уменьшается, как будто он меняет разрешение или соотношение сторон или что-то подобное.

Я обнаружил эту проблему , которая звучит точно так же, но я не могу решить ее независимо от установленных разрешений.

Это бит кода, который я должен получить Bitmap объектов из потока:

using (var randomAccessStream = new InMemoryRandomAccessStream())
{
    await mediaCap.CapturePhotoToStreamAsync(imageProps, randomAccessStream);

    randomAccessStream.Seek(0);
    using (var ioStream = randomAccessStream.AsStream())
    {
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.BeginInit();
        bitmapImage.StreamSource = ioStream;
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.EndInit();
        bitmapImage.Freeze();
    }
}

imageProps устанавливается на 1280x720, то же разрешение, что и у объекта предварительного просмотра. Это не было бы большой проблемой, если бы это происходило только время от времени, но мне нужно часто захватывать кадры (несколько раз в секунду), и это выглядит очень неприятно.

Edit:

Следует отметить, что проблема возникает только на упомянутом планшете Surface Pro (2736x1824 @ 200%), но не возникает на экране 1920x1080.

1 Ответ

0 голосов
/ 02 июля 2018

Решением, которое я в итоге нашел, было это изменение:

От:

await _mediaCaptureObject.InitializeAsync(new MediaCaptureInitializationSettings
{
    VideoDeviceId = deviceList?.FirstOrDefault(x => x.Name.Contains("Camera Name"))?.Id,
    StreamingCaptureMode = StreamingCaptureMode.Video
});

Кому:

await _mediaCaptureObject.InitializeAsync(new MediaCaptureInitializationSettings
{
    VideoDeviceId = deviceList?.FirstOrDefault(x => x.Name.Contains("Camera Name"))?.Id,
    StreamingCaptureMode = StreamingCaptureMode.Video,
    PhotoCaptureSource = PhotoCaptureSource.VideoPreview
});

Это на самом деле не объясняет проблему, с которой я столкнулся, поскольку я устанавливал ImageEncodingProperties в то же разрешение, что и поток, при захвате фотографии. В любом случае, по умолчанию PhotoCaptureSource это Auto, который должен был использовать режим Photo вместо VideoPreview. Как только я изменил это, проблема перестала появляться.

...