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를 만들지 않으려는 경우 Windows 기본 제공 카메라 앱을 시작 하 고 캡처된 사진 또는 비디오 파일을 받을 수 있는 CameraCaptureUI 클래스를 사용 하는 것이 좋습니다.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

앱이 장치 카메라에 액세스 하려면 앱에서 웹캠마이크 장치 기능을 사용 하도록 선언 해야 합니다.In order for your app to access a device's camera, you must declare that your app uses the webcam and microphone device capabilities. 캡처한 사진과 비디오를 사용자의 사진 또는 비디오 라이브러리에 저장 하려면 picturesLibraryvideosLibrary 기능도 선언 해야 합니다.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. 웹캠 확인란과 마이크 상자를 선택합니다.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 기능을 통해 미리 보기 스트림이 자동 포커스, 자동 노출, 자동으로 밸런스를 포함 하 여 enbled 수 있도록 해야 합니다.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.

에 사진을 캡처합니다.Capture a photo to a SoftwareBitmap

\Bitmap 클래스는 여러 기능에서 이미지의 일반적인 표현을 제공 하기 위해 Windows 10에서 도입 되었습니다.The SoftwareBitmap class was introduced in Windows 10 to provide a common representation of images across multiple features. 사진을 캡처한 후 응용 프로그램에서 캡처한 이미지를 사용 하는 경우 (예: 파일을 캡처하는 대신 XAML로 표시 하는 경우), 파일을 캡처하는 대신에 캡처한 이미지를 사용 해야 합니다.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 개체를 초기화 한 후에는 Lowlagphoto capture 클래스 를 사용 하MediaCapture 에 대 한 사진을 캡처할 수 있습니다.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. CapturedPhoto 개체를 반환 하는 CaptureAsync을 호출 하 여 사진을 캡처합니다.Capture a photo by calling CaptureAsync, which returns a CapturedPhoto object. Frame 속성 및 \bitmap 속성에 액세스 하 여에 지 속성 비트맵 을 가져옵니다.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. 캡처를 완료 한 후에는 마침 비동기 를 호출 하 여 Lowlag사진 캡처 세션을 종료 하 고 연결 된 리소스를 해제 합니다.When you are done capturing, call FinishAsync to shut down the LowLagPhotoCapture session and free up the associated resources. Enter async를 호출 하 고 사진을 다시 캡처하기 시작 하는 경우 CaptureAsync를 호출 하기 전에 PrepareLowLagPhotoCaptureAsync 를 다시 호출 하 여 캡처 세션을 다시 초기화 해야 합니다.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 사용 및 XAML 페이지에 개체를 표시 하는 방법을 비롯 하 여 \bitmap 개체 작업에 대 한 자세한 내용은 비트맵 이미지 만들기, 편집 및 저장을 참조 하세요.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. 나중에 이미지 파일에서 계속 해 서이 비트맵 을 만들 수도 있습니다.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 와 같은 정적 메서드를 제공 합니다.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에서 을 만들어 메모리 내 스트림에서 이미지를 디코딩하고 CreateForTranscodingAsync를 호출 하 여 이미지를 파일로 인코딩하는 BitmapEncoder 를 만듭니다.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. 비디오 캡처를 완료 한 후에는 마침 비동기 를 호출 하 여 캡처 세션을 삭제 하 고 연결 된 리소스를 정리 합니다.When you are done capturing videos, call FinishAsync to dispose of the capture session and clean up associated resources. 이 호출 후에는 StartAsync를 호출 하기 전에 PrepareLowLagRecordToStorageFileAsync 를 다시 호출 하 여 캡처 세션을 다시 초기화 해야 합니다.After this call, you must call PrepareLowLagRecordToStorageFileAsync again to reinitialize the capture session before calling StartAsync.

await _mediaRecording.FinishAsync();

비디오를 캡처할 때 MediaCapture 개체의 recordlimit ationlimit 이벤트에 대 한 처리기를 등록 해야 합니다 .이 이벤트는 단일 기록 (현재 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. Mediacompositionmediac립 개체의 시퀀스를 정렬 하 고, 비디오 길이를 조정 하 고, 계층을 만들고, 배경 음악을 추가 하 고, 비디오 효과를 적용 하는 등 기본적인 비디오 편집 기능을 제공 합니다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

PauseAsync 를 호출 하 고 ResumeAsync를 호출 하 여 별도의 출력 파일을 만들지 않고 비디오 기록을 일시 중지 한 후 기록을 다시 시작할 수 있습니다.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에서 프레임을 표시 하려면 비디오 프레임의 해당 비트맵 표현을 가져옵니다.To display the frame in XAML, get the SoftwareBitmap representation of the video frame. 현재는 미리 곱하기 또는 빈 알파 채널이 있는 BGRA8 형식의 이미지만 지원 되므로 필요한 경우 올바른 형식을 얻기 위해 호출을 호출 합니다.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 이미지 컨트롤의 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 를 호출 하 여 캡처 세션을 초기화 하 고,이 예제에서 생성 된 파일 및 MediaEncodingProfileCreateMp3 정적 메서드로 전달 합니다.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.

await _mediaRecording.StopAsync();

StartAsyncstopasync 를 여러 번 호출 하 여 여러 오디오 파일을 기록할 수 있습니다.You can call StartAsync and StopAsync multiple times to record several audio files. 오디오 캡처를 완료 한 후에는 마침 비동기 를 호출 하 여 캡처 세션을 삭제 하 고 연결 된 리소스를 정리 합니다.When you are done capturing audio, call FinishAsync to dispose of the capture session and clean up associated resources. 이 호출 후에는 StartAsync를 호출 하기 전에 PrepareLowLagRecordToStorageFileAsync 를 다시 호출 하 여 캡처 세션을 다시 초기화 해야 합니다.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부터 앱은 시스템에서 앱의 오디오 캡처 및 오디오 렌더링 스트림의 오디오 수준을 mutes 수 있는 시기를 감지할 수 있습니다.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. CreateForCaptureMonitoring를 호출 하 여 오디오 캡처 스트림을 모니터링 하기 위한 AudioStateMonitor 인스턴스를 가져옵니다.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. 캡처 스트림은 시스템에서 "ducked"로 낮추지 말아야 합니다.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. 앱 시나리오와 재생 중인 콘텐츠 형식에 따라 소리 수준이 ducked 때 오디오 재생을 일시 중지 하는 것이 좋습니다.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();
    }
}