MediaCapture を使った基本的な写真、ビデオ、およびオーディオのキャプチャBasic photo, video, and audio capture with MediaCapture

この記事では、MediaCapture クラスを使用して写真やビデオをキャプチャする最も簡単な方法を示します。This article shows the simplest way to capture photos and video using the MediaCapture class. MediaCapture クラスは、キャプチャ パイプラインに対する低レベルの制御を提供し、高度なキャプチャ シナリオを実現する、堅牢な一連の API を公開しますが、この記事では基本的なメディア キャプチャをアプリにすばやく簡単に追加できるようにすることを目的としています。The MediaCapture class exposes a robust set of APIs that provide low-level control over the capture pipeline and enable advanced capture scenarios, but this article is intended to help you add basic media capture to your app quickly and easily. MediaCapture が提供する機能について詳しくは、「カメラ」をご覧ください。To learn about more of the features that MediaCapture provides, see Camera.

写真やビデオをキャプチャするだけで、他のメディア キャプチャ機能を追加しない場合や、独自のカメラ UI を作成する必要がない場合は、CameraCaptureUI クラスを使用することができます。このクラスによって、単に Windows の組み込みカメラ アプリを起動し、キャプチャされた写真やビデオのファイルを受信することができます。If you simply want to capture a photo or video and don't intend to add any additional media capture features, or if you don't want to create your own camera UI, you may want to use the CameraCaptureUI class, which allows you to simply launch the Windows built-in camera app and receive the photo or video file that was captured. 詳しくは、「Windows の組み込みカメラ UI を使った写真とビデオのキャプチャ」をご覧ください。For more information, see Capture photos and video with Windows built-in camera UI

この記事のコードは、カメラのスターター キットのサンプルを基にしています。The code in this article was adapted from the Camera starter kit sample. このサンプルをダウンロードし、該当するコンテキストで使用されているコードを確認することも、サンプルを独自のアプリの開始点として使用することもできます。You can download the sample to see the code used in context or to use the sample as a starting point for your own app.

アプリ マニフェストに機能宣言を追加するAdd capability declarations to the app manifest

アプリからデバイスのカメラにアクセスするには、アプリでデバイス機能 (webcammicrophone) の使用を宣言する必要があります。In order for your app to access a device's camera, you must declare that your app uses the webcam and microphone device capabilities. キャプチャした写真とビデオをユーザーの画像ライブラリまたはビデオ ライブラリに保存する場合は、picturesLibrary 機能と videosLibrary 機能も宣言する必要があります。If you want to save captured photos and videos to the users's Pictures or Videos library, you must also declare the picturesLibrary and videosLibrary capability.

アプリケーション マニフェストに機能を追加するにはTo add capabilities to the app manifest

  1. Microsoft Visual Studio のソリューション エクスプローラーで、package.appxmanifest 項目をダブルクリックしてアプリケーション マニフェストのデザイナーを開きます。In Microsoft Visual Studio, in Solution Explorer, open the designer for the application manifest by double-clicking the package.appxmanifest item.
  2. [機能] タブをクリックします。Select the Capabilities tab.
  3. [Web カメラ] のボックスと [マイク] のボックスをオンにします。Check the box for Webcam and the box for Microphone.
  4. 画像ライブラリとビデオ ライブラリにアクセスするには、[画像ライブラリ] のボックスと [ビデオ ライブラリ] のボックスをオンにします。For access to the Pictures and Videos library check the boxes for Pictures Library and the box for Videos Library.

MediaCapture オブジェクトを初期化するInitialize the MediaCapture object

この記事で説明されているすべてのキャプチャ メソッドでは、最初の手順として、コンストラクターを呼び出した後、InitializeAsync を呼び出すことによって、MediaCapture オブジェクトを初期化する必要があります。All of the capture methods described in this article require the first step of initializing the MediaCapture object by calling the constructor and then calling InitializeAsync. MediaCapture オブジェクトはアプリで複数の場所からアクセスされるため、このオブジェクトを保持するためのクラス変数を宣言します。Since the MediaCapture object will be accessed from multiple places in your app, declare a class variable to hold the object. キャプチャ操作に失敗した場合に通知されるように、MediaCapture オブジェクトの Failed イベントのハンドラーを実装します。Implement a handler for the MediaCapture object's Failed event to be notified if a capture operation fails.

MediaCapture mediaCapture;
bool isPreviewing;
mediaCapture = new MediaCapture();
await mediaCapture.InitializeAsync();
mediaCapture.Failed += MediaCapture_Failed;

カメラ プレビューの設定Set up the camera preview

MediaCapture を使用して写真、ビデオ、オーディオをキャプチャする場合、カメラのプレビューを表示しないこともできますが、通常は、ユーザーがキャプチャされる内容を確認できるようにプレビュー ストリームを表示する必要があります。It's possible to capture photos, videos, and audio using MediaCapture without showing the camera preview, but typically you want to show the preview stream so that the user can see what's being captured. また、オート フォーカス、自動露出、オート ホワイト バランスなど、MediaCapture の一部の機能を有効にするには、プレビュー ストリームが実行されている必要があります。Also, a few MediaCapture features require the preview stream to be running before they can be enbled, including auto focus, auto exposure, and auto white balance. カメラ プレビューを設定する方法については、「カメラ プレビューの表示」をご覧ください。To see how to set up the camera preview, see Display the camera preview.

SoftwareBitmap への写真のキャプチャCapture a photo to a SoftwareBitmap

SoftwareBitmap クラスは、複数の機能間で共通の画像表現を提供するために、Windows 10 で導入されました。The SoftwareBitmap class was introduced in Windows 10 to provide a common representation of images across multiple features. 写真をキャプチャした後、ファイルにキャプチャするのではなく、XAML で表示するなど、キャプチャしたイメージをアプリですぐに使用する場合は、SoftwareBitmap にキャプチャする必要があります。If you want to capture a photo and then immediately use the captured image in your app, such as displaying it in XAML, instead of capturing to a file, then you should capture to a SoftwareBitmap. 後で画像をディスクに保存するオプションもあります。You still have the option of saving the image to disk later.

MediaCapture オブジェクトを初期化した後、LowLagPhotoCapture クラスを使用して、写真を SoftwareBitmap にキャプチャできます。After initializing the MediaCapture object, you can capture a photo to a SoftwareBitmap using the LowLagPhotoCapture class. このクラスのインスタンスを取得するには、PrepareLowLagPhotoCaptureAsync を呼び出して、必要な画像形式を指定する ImageEncodingPropertiesオブジェクトを渡します。Get an instance of this class by calling PrepareLowLagPhotoCaptureAsync, passing in an ImageEncodingProperties object specifying the image format you want. CreateUncompressed 圧縮されていないエンコーディングの指定したピクセル形式を作成します。CreateUncompressed creates an uncompressed encoding with the specified pixel format. 写真をキャプチャするには、CaptureAsync を呼び出します。これは、CapturedPhoto オブジェクトを返します。Capture a photo by calling CaptureAsync, which returns a CapturedPhoto object. SoftwareBitmap を取得するには、Frame プロパティにアクセスし、次に SoftwareBitmap プロパティにアクセスします。Get a SoftwareBitmap by accessing the Frame property and then the SoftwareBitmap property.

必要に応じて、CaptureAsync を繰り返し呼び出して、複数の写真をキャプチャできます。If you want, you can capture multiple photos by repeatedly calling CaptureAsync. キャプチャが完了したら、FinishAsync を呼び出して LowLagPhotoCapture セッションをシャットダウンし、関連するリソースを解放します。When you are done capturing, call FinishAsync to shut down the LowLagPhotoCapture session and free up the associated resources. FinishAsync を呼び出した後、再び写真のキャプチャを開始するには、もう一度 PrepareLowLagPhotoCaptureAsync を呼び出して、キャプチャ セッションを再初期化してから、CaptureAsync を呼び出す必要があります。After calling FinishAsync, to begin capturing photos again you will need to call PrepareLowLagPhotoCaptureAsync again to reinitialize the capture session before calling CaptureAsync.

// Prepare and capture photo
var lowLagCapture = await mediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));

var capturedPhoto = await lowLagCapture.CaptureAsync();
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;

await lowLagCapture.FinishAsync();            

Windows バージョン 1803 以降では、CaptureAsync から返された CapturedFrame クラスの BitmapProperties プロパティにアクセスして、キャプチャした写真に関するメタデータを取得できます。Starting with Windows, version 1803, you can access the BitmapProperties property of the CapturedFrame class returned from CaptureAsync to retrieve metadata about the captured photo. このデータを BitmapEncoder に渡すと、メタデータをファイルに保存できます。You can pass this data into a BitmapEncoder to save the metadata to a file. 以前は、圧縮されていない画像形式について、このデータにアクセスできませんでした。Previously, there was no way to access this data for uncompressed image formats. ControlValues プロパティにアクセスすると、キャプチャした写真の露出やホワイト バランスなどのコントロールの値を記述した CapturedFrameControlValues オブジェクトも取得できます。You can also access the ControlValues property to retrieve a CapturedFrameControlValues object that describes the control values, such as exposure and white balance, for the captured frame.

BitmapEncoder の使い方および SoftwareBitmap オブジェクトの操作 (XAML ページに表示する方法など) について詳しくは、「ビットマップ画像の作成、編集、保存」をご覧ください。For information about using BitmapEncoder and about working with the SoftwareBitmap object, including how to display one in a XAML page, see Create, edit, and save bitmap images.

キャプチャ デバイス コントロールの値の設定について詳しくは、「写真とビデオのキャプチャのためのキャプチャ デバイス コントロール」をご覧ください。For more information on setting capture device control values, see Capture device controls for photo and video.

Windows 10 バージョン 1803 以降では、MediaCapture によって返された CapturedFrameBitmapProperties プロパティにアクセスして、圧縮されていない形式でキャプチャした写真に関する EXIF 情報などのメタデータを取得できます。Starting with Windows 10, version 1803, you can get the metadata, such as EXIF information, for photos captured in uncompressed format by accessing the BitmapProperties property of the CapturedFrame returned by MediaCapture. 以前のリリースでは、このデータにアクセスできるのは、圧縮ファイル形式にキャプチャされた写真のヘッダーでのみでした。In previous releases this data was only accessible in the header of photos captured to a compressed file format. このデータを BitmapEncoder に渡すと、画像ファイルを手動で書き込むことができます。You can provide this data to a BitmapEncoder when manually writing an image file. ビットマップのエンコードについて詳しくは、「ビットマップ画像の作成、編集、保存」をご覧ください。For more information on encoding bitmaps, see Create, edit, and save bitmap images. ControlValues プロパティにアクセスすると、画像をキャプチャしたときに使用された露出やフラッシュ設定などのフレーム コントロールの値にもアクセスできます。You can also access the frame control values, such as exposure and flash settings, used when the image was captured by accessing the ControlValues property. 詳しくは、「写真とビデオのキャプチャのためのキャプチャ デバイス コントロール」をご覧ください。For more information, see Capture device controls for photo and video capture.

ファイルへの写真のキャプチャCapture a photo to a file

一般的な写真アプリでは、キャプチャした写真をディスクやクラウド ストレージに保存し、写真の向きなどのメタデータをファイルに追加する必要があります。A typical photography app will save a captured photo to disk or to cloud storage and will need to add metadata, such as photo orientation, to the file. 次の例では、ファイルに写真をキャプチャする方法を示します。The following example shows you how to capture an photo to a file. 後で画像ファイルから SoftwareBitmap を作成するオプションもあります。You still have the option of creating a SoftwareBitmap from the image file later.

この例で示されている方法では、写真をインメモリ ストリームにキャプチャし、写真をストリームからディスク上のファイルにコード変換します。The technique shown in this example captures the photo to an in-memory stream and then transcode the photo from the stream to a file on disk. この例では、GetLibraryAsync を使ってユーザーのピクチャ ライブラリを取得し、次に SaveFolder プロパティを使って既定の保存フォルダーを取得します。This example uses GetLibraryAsync to get the user's pictures library and then the SaveFolder property to get a reference default save folder. このフォルダーにアクセスするには、必ずピクチャ ライブラリ機能をアプリ マニフェストに追加してください。Remember to add the Pictures Library capability to your app manifest to access this folder. CreateFileAsync 新たに作成 StorageFile 写真を保存します。CreateFileAsync creates a new StorageFile to which the photo will be saved.

InMemoryRandomAccessStream を作成し、CapturePhotoToStreamAsync を呼び出して、ストリームと、使用する画像形式を指定する ImageEncodingProperties オブジェクトを渡して、写真をストリームにキャプチャします。Create an InMemoryRandomAccessStream and then call CapturePhotoToStreamAsync to capture a photo to the stream, passing in the stream and an ImageEncodingProperties object specifying the image format that should be used. 自分でオブジェクトを初期化することによって、カスタム エンコード プロパティを作成することもできますが、このクラスには、ImageEncodingProperties.CreateJpeg など、一般的なエンコード形式用の静的メソッドが用意されています。You can create custom encoding properties by initializing the object yourself, but the class provides static methods, like ImageEncodingProperties.CreateJpeg for common encoding formats. 次に、OpenAsync を呼び出すことにより、出力ファイルへのファイル ストリームを作成します。Next, create a file stream to the output file by calling OpenAsync. BitmapDecoder を作成して、インメモリ ストリームから画像をデコードします。次に、BitmapEncoder を作成して、CreateForTranscodingAsync を呼び出すことによって画像をファイルにエンコードします。Create a BitmapDecoder to decode the image from the in memory stream and then create a BitmapEncoder to encode the image to file by calling CreateForTranscodingAsync.

必要に応じて、BitmapPropertySet オブジェクトを作成し、イメージ エンコーダーで SetPropertiesAsync を呼び出して、画像ファイルに写真に関するメタデータを含めることができます。You can optionally create a BitmapPropertySet object and then call SetPropertiesAsync on the image encoder to include metadata about the photo in the image file. エンコード プロパティについて詳しくは、「画像のメタデータ」をご覧ください。For more information about encoding properties, see Image metadata. デバイスの向きを正しく処理することは、ほとんどの写真アプリに不可欠です。Handling device orientation properly is essential for most photography apps. 詳しくは、「MediaCapture を使ってデバイスの向きを処理する」をご覧ください。For more information, see Handle device orientation with MediaCapture.

最後に、エンコーダー オブジェクトで FlushAsync を呼び出して、写真をインメモリ ストリームからファイルにコード変換します。Finally, call FlushAsync on the encoder object to transcode the photo from the in-memory stream to the file.

var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
StorageFile file = await myPictures.SaveFolder.CreateFileAsync("photo.jpg", CreationCollisionOption.GenerateUniqueName);

using (var captureStream = new InMemoryRandomAccessStream())
{
    await mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), captureStream);

    using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        var decoder = await BitmapDecoder.CreateAsync(captureStream);
        var encoder = await BitmapEncoder.CreateForTranscodingAsync(fileStream, decoder);

        var properties = new BitmapPropertySet {
            { "System.Photo.Orientation", new BitmapTypedValue(PhotoOrientation.Normal, PropertyType.UInt16) }
        };
        await encoder.BitmapProperties.SetPropertiesAsync(properties);

        await encoder.FlushAsync();
    }
}

ファイルとフォルダーの操作について詳しくは、「ファイル、フォルダー、およびライブラリ」をご覧ください。For more information about working with files and folders, see Files, folders, and libraries.

ビデオをキャプチャするCapture a video

アプリにビデオ キャプチャ機能をすばやく追加するには、LowLagMediaRecording クラスを使用します。Quickly add video capture to your app by using the LowLagMediaRecording class. 最初に、オブジェクト用のクラス変数を宣言します。First, declare a class variable to for the object.

LowLagMediaRecording _mediaRecording;

次に、ビデオの保存先となる StorageFile オブジェクトを作成します。Next, create a StorageFile object to which the video will be saved. この例に示すように、ユーザーのビデオ ライブラリに保存するには、ビデオ ライブラリ 機能をアプリ マニフェストに追加する必要があることに注意してください。Note that to save to the user's video library, as shown in this example, you must add the Videos Library capability to your app manifest. PrepareLowLagRecordToStorageFileAsync を呼び出して、ストレージ ファイルと、ビデオのエンコードを指定する MediaEncodingProfile オブジェクトを渡すことにより、メディアの記録を初期化します。Call PrepareLowLagRecordToStorageFileAsync to initialize the media recording, passing in the storage file and a MediaEncodingProfile object specifying the encoding for the video. このクラスには、CreateMp4 など、一般的なエンコード プロファイルを作成するための静的メソッドが用意されています。The class provides static methods, like CreateMp4, for creating common video encoding profiles.

最後に、StartAsync を呼び出してビデオのキャプチャを開始します。Finally, call StartAsync to begin capturing video.

var myVideos = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Videos);
StorageFile file = await myVideos.SaveFolder.CreateFileAsync("video.mp4", CreationCollisionOption.GenerateUniqueName);
_mediaRecording = await mediaCapture.PrepareLowLagRecordToStorageFileAsync(
        MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), file);
await _mediaRecording.StartAsync();

ビデオの録画を停止するには、StopAsync を呼び出します。To stop recording video, call StopAsync.

await _mediaRecording.StopAsync();

StartAsyncStopAsync の呼び出しを続行して、他のビデオをキャプチャすることもできます。You can continue to call StartAsync and StopAsync to capture additional videos. ビデオのキャプチャが完了したら、FinishAsync を呼び出して、キャプチャ セッションを破棄し、関連付けられているリソースをクリーンアップします。When you are done capturing videos, call FinishAsync to dispose of the capture session and clean up associated resources. この呼び出しの後は、再び PrepareLowLagRecordToStorageFileAsync を呼び出してキャプチャ セッションを再初期化してから、StartAsync を呼び出す必要があります。After this call, you must call PrepareLowLagRecordToStorageFileAsync again to reinitialize the capture session before calling StartAsync.

await _mediaRecording.FinishAsync();

ビデオをキャプチャするときに、MediaCapture オブジェクトの RecordLimitationExceeded イベントのハンドラーを登録する必要があります。このイベントは、1 つの録画の上限 (現在は 3 時間) を超える場合に、オペレーティング システムによって生成されます。When capturing video, you should register a handler for the RecordLimitationExceeded event of the MediaCapture object, which will be raised by the operating system if you surpass the limit for a single recording, currently three hours. このイベントのハンドラーで、StopAsync を呼び出して録画を完了する必要があります。In the handler for the event, you should finalize your recording by calling StopAsync.

mediaCapture.RecordLimitationExceeded += MediaCapture_RecordLimitationExceeded;
private async void MediaCapture_RecordLimitationExceeded(MediaCapture sender)
{
    await _mediaRecording.StopAsync();
    System.Diagnostics.Debug.WriteLine("Record limitation exceeded.");
}

キャプチャしたビデオ ファイルの再生と編集Play and edit captured video files

ビデオをファイルにキャプチャした後は、アプリの UI の中でファイルを読み込んで再生できます。Once you have captured a video to a file, you may want to load the file and play it back within your app's UI. この操作には、MediaPlayerElement XAML コントロールと、それに関連付けられている MediaPlayer を使用します。You can do this using the MediaPlayerElement XAML control and an associated MediaPlayer. XAML ページでメディアを再生する方法について詳しくは、「MediaPlayer を使ったオーディオとビデオの再生」をご覧ください。For information on playing media in a XAML page, see Play audio and video with MediaPlayer.

CreateFromFileAsync を呼び出すと、ビデオ ファイルから MediaClip オブジェクトを作成することもできます。You can also create a MediaClip object from a video file by calling CreateFromFileAsync. MediaComposition は、**MediaClip** オブジェクトのシーケンスの配置、ビデオの長さのトリミング、レイヤーの作成、BGM の追加、ビデオ効果の適用などの基本的なビデオ編集機能を備えています。A MediaComposition provides basic video editing functionality like arranging the sequence of MediaClip objects, trimming video length, creating layers, adding background music, and applying video effects. メディア コンポジションの操作について詳しくは、「メディア コンポジションと編集」をご覧ください。For more information on working with media compositions, see Media compositions and editing.

ビデオ録画の一時停止と再開Pause and resume video recording

PauseAsyncResumeAsync を呼び出すことによって、ビデオの録画を一時停止し、別の出力ファイルを作成せずに録画を再開することができますYou can pause a video recording and then resume recording without creating a separate output file by calling PauseAsync and then calling ResumeAsync.

await _mediaRecording.PauseAsync(Windows.Media.Devices.MediaCapturePauseBehavior.ReleaseHardwareResources);
await _mediaRecording.ResumeAsync();

Windows 10 バージョン 1607 以降では、ビデオの録画を一時停止し、録画を一時停止する前にキャプチャされた最後のフレームを受信できます。Starting with Windows 10, version 1607, you can pause a video recording and receive the last frame captured before the recording was paused. このフレームをカメラ プレビューにオーバーレイすることにより、ユーザーは、録画を再開する前に、一時停止したフレームとカメラの位置合わせをすることができます。You can then overlay this frame on the camera preview to allow the user to align the camera with the paused frame before resuming recording. PauseWithResultAsync を呼び出すと、MediaCapturePauseResult オブジェクトが返されます。Calling PauseWithResultAsync returns a MediaCapturePauseResult object. LastFrame プロパティは、最後のフレームを表す VideoFrame オブジェクトです。The LastFrame property is a VideoFrame object representing the last frame. XAML でこのフレームを表示するには、ビデオ フレームの SoftwareBitmap 表現を取得します。To display the frame in XAML, get the SoftwareBitmap representation of the video frame. 現時点では、BGRA8 形式、プリマルチプライ済みまたは空のアルファ チャネルの画像のみがサポートされているため、適切な形式を取得するには、必要に応じて、Convert を呼び出します。Currently, only images in BGRA8 format with premultiplied or empty alpha channel are supported, so call Convert if necessary to get the correct format. 新しい SoftwareBitmapSource オブジェクトを作成し、SetBitmapAsync を呼び出して初期化します。Create a new SoftwareBitmapSource object and call SetBitmapAsync to initialize it. 最後に、XAML の Image コントロールの Source プロパティを設定して画像を表示します。Finally, set the Source property of a XAML Image control to display the image. この方法が機能するには、画像が CaptureElement コントロールと整列されており、不透明度の値が 1 未満である必要があります。For this trick to work, your image must be aligned with the CaptureElement control and should have an opacity value less than one. UI は UI スレッドでのみ変更できるため、RunAsync 内でこの呼び出しを行ってください。Don't forget that you can only modify the UI on the UI thread, so make this call inside RunAsync.

PauseWithResultAsync は、録画された合計時間を追跡する必要がある場合に、前のセグメントで録画されたビデオの持続時間も返します。PauseWithResultAsync also returns the duration of the video that was recorded in the preceeding segment in case you need to track how much total time has been recorded.

MediaCapturePauseResult result = 
    await _mediaRecording.PauseWithResultAsync(Windows.Media.Devices.MediaCapturePauseBehavior.RetainHardwareResources);

var pausedFrame = result.LastFrame.SoftwareBitmap;
if(pausedFrame.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || pausedFrame.BitmapAlphaMode != BitmapAlphaMode.Ignore)
{
    pausedFrame = SoftwareBitmap.Convert(pausedFrame, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore);
}

var source = new SoftwareBitmapSource();
await source.SetBitmapAsync(pausedFrame);

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    PauseImage.Source = source;
    PauseImage.Visibility = Visibility.Visible;
});

_totalRecordedTime += result.RecordDuration;

録画を再開するときは、画像のソースを null に設定し、非表示にすることができます。When you resume recording, you can set the source of the image to null and hide it.

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    PauseImage.Source = null;
    PauseImage.Visibility = Visibility.Collapsed;
});

await _mediaRecording.ResumeAsync();

StopWithResultAsync を呼び出すことによってビデオを停止したときに、結果のフレームを取得することもできます。Note that you can also get a result frame when you stop the video by calling StopWithResultAsync.

オーディオのキャプチャCapture audio

前に示したビデオのキャプチャと同じ手法を用いて、アプリにオーディオ キャプチャ機能を簡単に追加することができます。You can quickly add audio capture to your app by using the same technique shown above for capturing video. 次の例では、アプリケーション データ フォルダーに StorageFile を作成します。The example below creates a StorageFile in the application data folder. PrepareLowLagRecordToStorageFileAsync を呼び出して、ファイルと、MediaEncodingProfile を渡すことによって、キャプチャ セッションを初期化します。この例では、MediaEncodingProfile は静的メソッド CreateMp3 によって生成されます。Call PrepareLowLagRecordToStorageFileAsync to initialize the capture session, passing in the file and a MediaEncodingProfile which is generated in this example by the CreateMp3 static method. 録音を開始するには、StartAsync を呼び出します。To begin recording, call StartAsync.

mediaCapture.RecordLimitationExceeded += MediaCapture_RecordLimitationExceeded;

var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFile file = await localFolder.CreateFileAsync("audio.mp3", CreationCollisionOption.GenerateUniqueName);
_mediaRecording = await mediaCapture.PrepareLowLagRecordToStorageFileAsync(
        MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High), file);
await _mediaRecording.StartAsync();

StopAsync を呼び出して、オーディオの録音を停止します。Call StopAsync to stop the audio recording.

StartAsyncStopAsync を複数回呼び出して、複数のオーディオ ファイルを録音します。You can call StartAsync and StopAsync multiple times to record several audio files. オーディオのキャプチャが完了したら、FinishAsync を呼び出して、キャプチャ セッションを破棄し、関連付けられているリソースをクリーンアップします。When you are done capturing audio, call FinishAsync to dispose of the capture session and clean up associated resources. この呼び出しの後は、再び PrepareLowLagRecordToStorageFileAsync を呼び出してキャプチャ セッションを再初期化してから、StartAsync を呼び出す必要があります。After this call, you must call PrepareLowLagRecordToStorageFileAsync again to reinitialize the capture session before calling StartAsync.

await _mediaRecording.FinishAsync();

システムによるオーディオ レベルの変更を検出して対応するDetect and respond to audio level changes by the system

Windows 10、バージョン 1803 以降では、アプリのオーディオ キャプチャやオーディオ レンダリング ストリームのオーディオ レベルが、システムによって低下した場合やミュートされた場合に、アプリがそれを検出できます。Starting with Windows 10, version 1803, your app can detect when the system lowers or mutes the audio level of your app's audio capture and audio render streams. たとえば、アプリがバックグラウンドに移動すると、アプリのストリームがシステムによってミュートされることがあります。For example, the system may mute your app's streams when it goes into the background. AudioStateMonitor クラスを使用すると、オーディオ ストリームの音量がシステムによって変更されたときに、イベントを受け取るように登録できます。The AudioStateMonitor class allows you to register to receive an event when the system modifies the volume of an audio stream. オーディオ キャプチャ ストリーム監視用の AudioStateMonitor のインスタンスを取得するには、CreateForCaptureMonitoring を呼び出します。Get an instance of AudioStateMonitor for monitoring audio capture streams by calling CreateForCaptureMonitoring. オーディオ レンダリング ストリーム監視用のインスタンスを取得するには、CreateForRenderMonitoring を呼び出します。Get an instance for monitoring audio render streams by calling CreateForRenderMonitoring. 対応するストリーム カテゴリのオーディオがシステムによって変更されたときに通知を受け取るには、各モニターの SoundLevelChanged イベントのハンドラーを登録します。Register a handler for the SoundLevelChanged event of each monitor to be notified when the audio for the corresponding stream category is changed by the system.

// Namespaces for monitoring audio state
using Windows.Media;
using Windows.Media.Audio;
AudioStateMonitor captureAudioStateMonitor;
AudioStateMonitor renderAudioStateMonitor;
captureAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoring();
captureAudioStateMonitor.SoundLevelChanged += CaptureAudioStateMonitor_SoundLevelChanged; ;

renderAudioStateMonitor = AudioStateMonitor.CreateForRenderMonitoring();
renderAudioStateMonitor.SoundLevelChanged += RenderAudioStateMonitor_SoundLevelChanged; ;

キャプチャ ストリームの SoundLevelChanged ハンドラーで、AudioStateMonitor センダーの SoundLevelプロパティを確認すると、新しいサウンド レベルを判定できます。In the SoundLevelChanged handler for the capture stream, you can check the SoundLevel property of the AudioStateMonitor sender to determine the new sound level. キャプチャー ストリームは、システムによって下げないで (つまり "ダッキング" しないで) ください。Note that a capture stream should never be lowered, or "ducked", by the system. ミュートとフル音量の間の切り替えのみを行うことができます。It should only ever be muted or switched back to full volume. オーディオ ストリームがミュートになっている場合は、実行中のキャプチャを停止できます。If the audio stream is muted, you can stop a capture in progress. オーディオ ストリームがフル音量に戻った場合は、もう一度キャプチャを開始できます。If the audio stream is restored to full volume, you can start capturing again. 次の例では、複数のブール型のクラス変数を使用して、オーディオが現在キャプチャ中か、それともオーディオ状態の変更のためにキャプチャが停止しているかを追跡しています。The following example uses some boolean class variables to track whether the app is currently capturing audio and if the capture was stopped due to the audio state change. これらの変数を使用すると、オーディオ キャプチャをプログラムによって停止または開始する適切な時期を判断できます。These variables are used to determine when it's appropriate to programmatically stop or start audio capture.

bool isCapturingAudio = false;
bool capturingStoppedForAudioState = false;
private void CaptureAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    switch (sender.SoundLevel)
    {
        case SoundLevel.Full:
            if(capturingStoppedForAudioState)
            {
                StartAudioCapture();
                capturingStoppedForAudioState = false;
            }  
            break;
        case SoundLevel.Muted:
            if(isCapturingAudio)
            {
                StopAudioCapture();
                capturingStoppedForAudioState = true;
            }
            break;
        case SoundLevel.Low:
            // This should never happen for capture
            Debug.WriteLine("Unexpected audio state.");
            break;
    }
}

次のコード例では、オーディオ レンダリング用の SoundLevelChanged ハンドラーの実装を示しています。The following code example illustrates an implementation of the SoundLevelChanged handler for audio rendering. アプリのシナリオや、再生しているコンテンツの種類に応じて、サウンド レベルがダッキングされている間、オーディオ再生を一時停止します。Depending on your app scenario, and the type of content you are playing, you may want to pause audio playback when the sound level is ducked. メディア再生のサウンド レベルの変更を処理する方法について詳しくは、「MediaPlayer を使ったオーディオとビデオの再生」をご覧ください。For more information on handling sound level changes for media playback, see Play audio and video with MediaPlayer.

private void RenderAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    if ((sender.SoundLevel == SoundLevel.Full) ||
  (sender.SoundLevel == SoundLevel.Low && !isPodcast))
    {
        mediaPlayer.Play();
    }
    else if ((sender.SoundLevel == SoundLevel.Muted) ||
         (sender.SoundLevel == SoundLevel.Low && isPodcast))
    {
        // Pause playback if we’re muted or if we’re playing a podcast and are ducked
        mediaPlayer.Pause();
    }
}