미리 보기 프레임 가져오기

이 항목에서는 미디어 캡처 미리 보기 스트림에서 단일 미리 보기 프레임을 가져오는 방법을 보여줍니다.

참고 항목

이 문서는 기본 사진 및 비디오 캡처 구현 단계를 설명하는 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);

VideoFrame 개체의 SoftwareBitmap 속성에 액세스하여 미리 보기 프레임의 SoftwareBitmap 표현을 가져옵니다. 소프트웨어 비트맵 저장, 로드 및 수정에 대한 자세한 내용은 이미징을 참조하세요.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Direct3D API와 함께 이미지를 사용하려는 경우 미리 보기 프레임의 IDirect3DSurface 표현을 가져올 수도 있습니다.

var previewSurface = previewFrame.Direct3DSurface;

Important

반환된 VideoFrameSoftwareBitmap 속성 또는 Direct3DSurface 속성은 GetPreviewFrameAsync를 호출하는 방법과 앱이 실행 중인 디바이스에 따라 null일 수 있습니다.

  • VideoFrame 인수를 수락하는 GetPreviewFrameAsync의 오버로드를 호출하는 경우 반환된 VideoFrame에는 null이 아닌 SoftwareBitmap이 있고 Direct3DSurface 속성은 null이 됩니다.
  • Direct3D 표면을 사용하여 프레임을 내부적으로 나타내는 디바이스에 인수가 없는 GetPreviewFrameAsync의 오버로드를 호출하는 경우 Direct3DSurface 속성은 null이 아니고 SoftwareBitmap 속성은 null이 됩니다.
  • Direct3D 표면을 사용하지 않고 프레임을 내부적으로 나타내는 디바이스에 인수가 없는 GetPreviewFrameAsync의 오버로드를 호출하는 경우 SoftwareBitmap 속성은 null이 아니고 Direct3DSurface 속성은 null이 됩니다.

SoftwareBitmap 또는 Direct3DSurface 속성에서 반환된 개체에서 작동하기 전에 앱은 항상 null 값에 대해 검사 합니다.

미리 보기 프레임 사용을 마쳤으면 해당 Close 메서드(C#에서 Dispose로 프로젝트됨)를 호출하여 프레임에서 사용하는 리소스를 해제해야 합니다. 또는 개체를 자동으로 삭제하는 using 패턴을 사용합니다.

previewFrame.Dispose();
previewFrame = null;