/// <summary> /// Records an MP4 video to a StorageFile and adds rotation metadata to it /// </summary> /// <returns></returns> private async Task StartRecordingAsync() { try { // Create storage file for the capture var videoFile = await _captureFolder.CreateFileAsync("SimpleVideo.mp4", CreationCollisionOption.GenerateUniqueName); var encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto); // Calculate rotation angle, taking mirroring into account if necessary var rotationAngle = CameraRotationHelper.ConvertSimpleOrientationToClockwiseDegrees(_rotationHelper.GetCameraCaptureOrientation()); encodingProfile.Video.Properties.Add(RotationKey, PropertyValue.CreateInt32(rotationAngle)); Debug.WriteLine("Starting recording to " + videoFile.Path); await _mediaCapture.StartRecordToStorageFileAsync(encodingProfile, videoFile); _isRecording = true; Debug.WriteLine("Started recording!"); } catch (Exception ex) { // File I/O errors are reported as exceptions Debug.WriteLine("Exception when starting video recording: " + ex.ToString()); } }
/// <summary> /// Uses the current device orientation in space and page orientation on the screen to calculate the rotation /// transformation to apply to the controls /// </summary> private void UpdateButtonOrientation() { // Rotate the buttons in the UI to match the rotation of the device var angle = CameraRotationHelper.ConvertSimpleOrientationToClockwiseDegrees(_rotationHelper.GetUIOrientation()); var transform = new RotateTransform { Angle = angle }; // The RenderTransform is safe to use (i.e. it won't cause layout issues) in this case, because these buttons have a 1:1 aspect ratio PhotoButton.RenderTransform = transform; VideoButton.RenderTransform = transform; }
/// <summary> /// Gets the current orientation of the UI in relation to the device (when AutoRotationPreferences cannot be honored) and applies a corrective rotation to the preview /// </summary> private async Task SetPreviewRotationAsync() { // Only need to update the orientation if the camera is mounted on the device if (_externalCamera) { return; } // Add rotation metadata to the preview stream to make sure the aspect ratio / dimensions match when rendering and getting preview frames var rotation = _rotationHelper.GetCameraPreviewOrientation(); var props = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview); props.Properties.Add(RotationKey, CameraRotationHelper.ConvertSimpleOrientationToClockwiseDegrees(rotation)); await _mediaCapture.SetEncodingPropertiesAsync(MediaStreamType.VideoPreview, props, null); }