プレビュー フレームの取得Get a preview frame

このトピックでは、メディア キャプチャのプレビュー ストリームから単一のプレビュー フレームを取得する方法について説明します。This topic shows you how to get a single preview frame from the media capture preview stream.

注意

この記事の内容は、写真やビデオの基本的なキャプチャ機能を実装するための手順を紹介した「MediaCapture を使った基本的な写真、ビデオ、およびオーディオのキャプチャ」で取り上げた概念やコードに基づいています。This article builds on concepts and code discussed in Basic photo, video, and audio capture with MediaCapture, which describes the steps for implementing basic photo and video capture. そちらの記事で基本的なメディア キャプチャのパターンを把握してから、高度なキャプチャ シナリオに進むことをお勧めします。We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. この記事で紹介しているコードは、MediaCapture のインスタンスが既に作成され適切に初期化されていることと、アクティブなビデオ プレビュー ストリームを含んだ CaptureElement が存在することを前提としています。The code in this article assumes that your app already has an instance of MediaCapture that has been properly initialized, and that you have a CaptureElement with an active video preview stream.

プレビュー フレームをキャプチャするためには、基本的なメディア キャプチャに必要な名前空間に加え、次の名前空間が必要となります。In addition to the namespaces required for basic media capture, capturing a preview frame requires the following namespace.

using Windows.Media;

プレビュー フレームを要求するとき、フレームの受信に使う形式を指定するには、必要な形式を指定して VideoFrame オブジェクトを作成します。When you request a preview frame, you can specify the format in which you would like to receive the frame by creating a VideoFrame object with the format you desire. この例では、VideoDeviceController.GetMediaStreamProperties の呼び出しで MediaStreamType.VideoPreview を指定し、プレビュー ストリームのプロパティを要求することで、プレビュー ストリームと同じ解像度でビデオ フレームを作成します。This example creates a video frame that is the same resolution as the preview stream by calling VideoDeviceController.GetMediaStreamProperties and specifying MediaStreamType.VideoPreview to request the properties for the preview stream. プレビュー ストリームの幅と高さを使って新しいビデオ フレームを作成しています。The width and height of the preview stream is used to create the new video frame.

// 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 を呼び出してプレビュー ストリームを取得します。If your MediaCapture object is initialized and you have an active preview stream, call GetPreviewFrameAsync to get a preview stream. 引数には、最後のステップで作成したビデオ フレームを渡し、取得するフレームの形式を指定します。Pass in the video frame created in the last step to specify the format of the returned frame.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

プレビュー フレームの SoftwareBitmap 表現は、VideoFrame オブジェクトの SoftwareBitmap プロパティにアクセスして取得します。Get a SoftwareBitmap representation of the preview frame by accessing the SoftwareBitmap property of the VideoFrame object. ソフトウェア ビットマップの保存、読み込み、変更については、「イメージング」をご覧ください。For information about saving, loading, and modifying software bitmaps, see Imaging.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Direct3D API で画像を扱う場合は、プレビュー フレームの IDirect3DSurface 表現を取得することもできます。You can also get a IDirect3DSurface representation of the preview frame if you want to use the image with Direct3D APIs.

var previewSurface = previewFrame.Direct3DSurface;

重要

GetPreviewFrameAsync の呼び出し方法と、アプリが実行されているデバイスによっては、返される VideoFrameSoftwareBitmap プロパティまたは Direct3DSurface プロパティのどちらかが null になることがあります。Either the SoftwareBitmap property or the Direct3DSurface property of the returned VideoFrame may be null depending on how you call GetPreviewFrameAsync and also depending on the device on which your app is running.

  • VideoFrame 引数を受け入れる GetPreviewFrameAsync のオーバーロードを呼び出した場合、返される VideoFrameSoftwareBitmap は null 以外になり、Direct3DSurface プロパティは null になります。If you call the overload of GetPreviewFrameAsync that accepts a VideoFrame argument, the returned VideoFrame will have a non-null SoftwareBitmap and the Direct3DSurface property will be null.
  • Direct3D サーフェスを使ってフレームを内部で表すデバイスで引数のない GetPreviewFrameAsync のオーバーロードを呼び出した場合、Direct3DSurface プロパティは null 以外になり、SoftwareBitmap プロパティは null になります。If you call the overload of GetPreviewFrameAsync that has no arguments on a device that uses a Direct3D surface to represent the frame internally, the Direct3DSurface property will be non-null and the SoftwareBitmap property will be null.
  • Direct3D サーフェスを使ってフレームを内部で表すデバイスで引数のない GetPreviewFrameAsync のオーバーロードを呼び出した場合、SoftwareBitmap プロパティは null 以外になり、Direct3DSurface プロパティは null になります。If you call the overload of GetPreviewFrameAsync that has no arguments on a device that does not use a Direct3D surface to represent the frame internally, the SoftwareBitmap property will be non-null and the Direct3DSurface property will be null.

アプリは、SoftwareBitmap プロパティまたは Direct3DSurface プロパティによって返されるオブジェクトで動作を試みる前に、必ず null 値をチェックする必要があります。Your app should always check for a null value before trying to operate on the objects returned by the SoftwareBitmap or Direct3DSurface properties.

プレビュー フレームが不要になったら必ず、その Close メソッド (C# 内で Dispose に投影される) を呼び出して、フレームによって使われているリソースを解放してください。When you are done using the preview frame, be sure to call its Close method (projected to Dispose in C#) to free the resources used by the frame. または、using パターンを使ってもかまいません。その場合は、オブジェクトが自動的に破棄されます。Or, use the using pattern, which automatically disposes of the object.

previewFrame.Dispose();
previewFrame = null;