Получение кадра предварительного просмотра
В этом разделе показано, как получить один кадр предварительного просмотра из потока предварительного просмотра мультимедиа.
Примечание.
В этой статье рассматриваются основные понятия и код, описанные в разделе "Базовый" фото, видео и аудиозапись с помощью MediaCapture, в котором описаны шаги по реализации базового фото и видеозахвата. Рекомендуется ознакомиться с основным шаблоном захвата мультимедиа в этой статье, прежде чем перейти к более сложным сценариям захвата. В коде этой статьи предполагается, что приложение уже имеет экземпляр MediaCapture, который был правильно инициализирован, и что у вас есть CaptureElement с активным потоком предварительного просмотра видео.
Помимо пространств имен, необходимых для базового захвата мультимедиа, для записи кадра предварительного просмотра требуется следующее пространство имен.
using Windows.Media;
При запросе кадра предварительного просмотра можно указать формат, в котором вы хотите получить кадр, создав объект VideoFrame с нужным форматом. В этом примере создается видеокадр, который является тем же разрешением, что и поток предварительного просмотра, вызвав VideoDeviceController.GetMediaStreamProperties и указав MediaStreamType.VideoPreview, чтобы запросить свойства для потока предварительной версии. Для создания нового видеокадров используется ширина и высота потока предварительного просмотра.
// Get information about the preview
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
// Create a video frame in the desired format for the preview frame
VideoFrame videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);
Если объект MediaCapture инициализирован и у вас есть активный поток предварительной версии, вызовите GetPreviewFrameAsync, чтобы получить поток предварительной версии. Передайте видеокадр, созданный на последнем шаге, чтобы указать формат возвращаемого кадра.
VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);
Получите представление программы SoftwareBitmap для предварительного просмотра кадра путем доступа к свойству SoftwareBitmap объекта VideoFrame. Сведения о сохранении, загрузке и изменении растровых карт программного обеспечения см. в разделе "Образы".
SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;
Вы также можете получить представление кадра предварительного просмотра iDirect3DSurface , если вы хотите использовать изображение с API Direct3D.
var previewSurface = previewFrame.Direct3DSurface;
Внимание
Свойство SoftwareBitmap или свойство Direct3DSurface возвращаемого Кадра видео может иметь значение NULL в зависимости от способа вызова GetPreviewFrameAsync, а также в зависимости от устройства, на котором работает ваше приложение.
- При вызове перегрузки GetPreviewFrameAsync, которая принимает аргумент VideoFrame, возвращаемый кадр VideoFrame будет иметь ненулевое свойство SoftwareBitmap, а свойство Direct3DSurface будет иметь значение NULL.
- Если вызвать перегрузку GetPreviewFrameAsync, которая не имеет аргументов на устройстве, использующего поверхность Direct3D для представления кадра внутренне, свойство Direct3DSurface будет не null, а свойство SoftwareBitmap будет null.
- Если вызвать перегрузку GetPreviewFrameAsync, которая не имеет аргументов на устройстве, которое не использует поверхность Direct3D для представления кадра внутри себя, свойство SoftwareBitmap будет не null, а свойство Direct3DSurface будет null.
Приложение всегда должно проверять значение NULL, прежде чем пытаться работать с объектами, возвращаемыми свойствами SoftwareBitmap или Direct3DSurface .
Когда вы закончите использовать кадр предварительного просмотра, обязательно вызовите метод Close (проецируемый в Dispose в C#), чтобы освободить ресурсы, используемые кадром. Или используйте шаблон using , который автоматически удаляет объект.
previewFrame.Dispose();
previewFrame = null;
См. также