プレビュー フレームの取得

このトピックでは、メディア キャプチャのプレビュー ストリームから単一のプレビュー フレームを取得する方法について説明します。

注意

この記事の内容は、写真やビデオの基本的なキャプチャ機能を実装するための手順を紹介した「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 表現は、VideoFrame オブジェクトの SoftwareBitmap プロパティにアクセスして取得します。 ソフトウェア ビットマップの保存、読み込み、変更については、「イメージング」をご覧ください。

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Direct3D API で画像を扱う場合は、プレビュー フレームの IDirect3DSurface 表現を取得することもできます。

var previewSurface = previewFrame.Direct3DSurface;

重要

GetPreviewFrameAsync の呼び出し方法と、アプリが実行されているデバイスによっては、返される VideoFrameSoftwareBitmap プロパティまたは Direct3DSurface プロパティのどちらかが null になることがあります。

  • VideoFrame 引数を受け入れる GetPreviewFrameAsync のオーバーロードを呼び出した場合、返される VideoFrameSoftwareBitmap は null 以外になり、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;