がりらぼ

WindowsRuntimeの応援ブログ

MediaCaptureで動画を撮るには

MediaCapture

カメラで動画をとるだけならCameraCaptureUIを使うと楽に動画を撮ることができます。

しかし、CameraCaptureUIは既存のUIを使用するので自分でキャプチャ部分を定義できません。

 

自由度が高く、独自のUIを使って写真を撮りたいならMediaCaptureを使います。

 

まずはデバイス列挙をしてどのカメラを使うかを選択します。

DeviceClass.VideoCaptureを指定することでカメラデバイスだけを列挙することができます。

DeviceClass.AudioCaptureを指定することでオーディオデバイスだけを列挙することができます。

今回は0番目のカメラ、0番目のマイクを使用します。

DeviceInformationCollection videoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
DeviceInformation cameraId=videoDevices.ElementAt(0);
DeviceInformationCollection audioDevices =await DeviceInformation.FindAllAsync(DeviceClass.AudioCapture);
DeviceInformation audioId = audioDevices.ElementAt(0);

そしてMediaCaptureInitializationSettingでVideoDeviceIdとAudioDeviceIdを指定します。

var setting = new MediaCaptureInitializationSettings();
setting.VideoDeviceId = cameraId.Id;
setting.AudioDeviceId = audioId.Id;

await mediaCapture.InitializeAsync(setting);

 

現在カメラで写している画面をPreviewするためにcaptureElementコントロールをXAMLに配置し、

そのSourceにmediaCaptureのインスタンスを渡します。

<CaptureElement x:Name="captureElement" />

 

captureElement.Source = mediaCapture;

WindowsPhoneの場合、Preview画面が270度回転してしまっているので270度回転させておきます。

#if WINDOWS_PHONE_APP
            mediaCapture.SetPreviewRotation(VideoRotation.Clockwise270Degrees);
#endif

 

ここまでで初期化は完了です。

 

StartPreviewAsyncでカメラの画面をプレビューします。

await mediaCapture.StartPreviewAsync();

 

StartRecodToStorageFileAsyncで録画した動画をStorageFileとして保存します。

引数にMediaEncodingProfileを指定することでエンコードを指定できます。今回はmp4で作成します。

また、保存先として今回はカメラロールを指定します。

StorageFolder cameraRollFolder = KnownFolders.CameraRoll;
StorageFile file = await cameraRollFolder.CreateFileAsync("hoge.mp4", CreationCollisionOption.ReplaceExisting);
await mediaCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD1080p),file);

これで、録画が開始されます。

 

録画を終了する場合、StopRecordAsyncを使えば録画を終了できます。

await mediaCapture.StopRecordAsync();

 

StopPreviewAsyncでプレビューを終了し、DisposeメソッドでMediaCaptureのリソースを正しく破棄します。

await mediaCapture.StopPreviewAsync();
mediaCapture.Dispose();

 

サスペンド時に正しく終了処理をしましょう。

App.Current.Suspending += async(s, e) =&gt;
{
    var deferral = e.SuspendingOperation.GetDeferral();
    
    await mediaCapture.StopPreviewAsync();
    mediaCapture.Dispose();
    // TODO: アプリケーションの状態を保存してバックグラウンドの動作があれば停止します
    deferral.Complete();
   
};

 

実行する場合、マニフェストファイルの機能タブにWebカメラとマイクのチェックが要ります。

今回はビデオの保存先をカメラロールにしているので画像ライブラリにもチェックをいれます。

22

MediaCaptureで動画を撮るには | garicchi.com