2014-12-30 4 views
0

Я разрабатываю приложение для Windows Phone 8.1, которое использует класс MediaCapture для записи видео. Я хочу предоставить пользователю свободу записывать видео в портрете или в ландшафтном режиме, просто поворачивая устройство. Обратите внимание, что мое приложение имеет фиксированную портретную ориентацию. Из-за фиксированной ориентации я использую событие OrientationChanged класса SimpleOrientationSensor.Как записать видео в портретной ориентации?

Теперь я заметил, что файл portait, записанный в приложении камеры по умолчанию, и в моем приложении имеет некоторые отличия. Вы можете видеть разницу в приведенных ниже изображениях. Все видеоролики находятся в разрешении 720p. Изображения игрока имеют ориентацию портретной блокировки. Код также приведен ниже. Может ли кто-нибудь объяснить мне, что случилось с моим кодом для записи портретного видео? Благодаря!

enter image description here enter image description here

MediaCaptureInitializationSettings set; 
MediaCapture _camCapture; 
VideoRotation videoRotation = VideoRotation.None; 
bool _isRecording = false; 

// Camera resource disposal is handled properly 
private async Task InitializeCamera() 
{ 
    try 
    { 
     if (set == null) 
     { 
      set = new MediaCaptureInitializationSettings(); 

      DeviceInformation deviceID = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)) 
             .FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back); 

      if (deviceID != null) 
      { 
       set.VideoDeviceId = deviceID.Id; 
      } 
     } 

     _camCapture = new MediaCapture(); 
     await _camCapture.InitializeAsync(set); 
     VideoView.Source = _camCapture; //VideoView is CaptureElement object in XAML 
     _camCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees); 
     await _camCapture.StartPreviewAsync(); 
    } 
    catch (Exception ex) 
    { 
    } 
} 

private async void OrientationChanged(object sender, SimpleOrientationSensorOrientationChangedEventArgs e) 
{ 
    try 
    { 
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      DetectCurrentOrintation(e.Orientation); 
     }); 
    } 
    catch (Exception ex) 
    { 
    } 
} 

private void DetectCurrentOrintation(SimpleOrientation orientation) 
{ 
    try 
    { 
     switch (orientation) 
     { 
      case SimpleOrientation.NotRotated: 
       videoRotation = VideoRotation.Clockwise90Degrees; 
       break; 
      case SimpleOrientation.Rotated90DegreesCounterclockwise: 
       videoRotation = VideoRotation.None; 
       break; 
      case SimpleOrientation.Rotated180DegreesCounterclockwise: 
       videoRotation = VideoRotation.Clockwise270Degrees; 
       break; 
      case SimpleOrientation.Rotated270DegreesCounterclockwise: 
       videoRotation = VideoRotation.Clockwise180Degrees; 
       break; 
      default: 
       break; 
     } 
    } 
    catch (Exception ex) 
    { 
    } 
} 

private async void btnRecordVideo_Click(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     if (!_isRecording) 
     { 
      var _videoRecording = await MyFolderInLocalFolder.CreateFileAsync("testRecord.mp4", CreationCollisionOption.GenerateUniqueName); 
      MediaEncodingProfile mEncode = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto); 

      _isRecording = true; 

      //Two videos are with SetRecordRotation(value) and 
      //for two other I commeted out the line. 
      _camCapture.SetRecordRotation(videoRotation); 
      await _camCapture.StartRecordToStorageFileAsync(mEncode, _videoRecording); 
     } 
     else 
     { 
      await _camCapture.StopRecordAsync(); 
      _isRecording = false; 
     } 
    } 
    catch (Exception ex) 
    { 
    } 
} 
+0

Вопрос полностью обновлен с основным вопросом. – Xyroid

ответ

0

Существует образец на странице GitHub Microsoft, которая имеет отношение, хотя они ориентированы на Windows, 10. Тем не менее, интерфейсы должны работать на 8/8.1.

UniversalCameraSample: Этот видеозапись захватывает видео и поддерживает портретные и ландшафтные ориентации. Вот соответствующая часть:

// Create storage file in Pictures Library 
var videoFile = await KnownFolders.PicturesLibrary.CreateFileAsync("SimpleVideo.mp4", CreationCollisionOption.GenerateUniqueName); 

var encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto); 

// Calculate rotation angle, taking mirroring into account if necessary 
var rotationAngle = 360 - ConvertDeviceOrientationToDegrees(GetCameraOrientation()); 
encodingProfile.Video.Properties.Add(RotationKey, PropertyValue.CreateInt32(rotationAngle)); 

await _mediaCapture.StartRecordToStorageFileAsync(encodingProfile, videoFile); 

поближе взглянуть на образец, чтобы увидеть, как получить ориентацию камеры в первую очередь (вызов к нему делается в сниппета я отправил). Обычно вы не хотите вызывать SetRecordRotation (или SetPreviewRotation), потому что они имеют преимущественное влияние только на добавление метаданных вращения.

Просмотрите camera session из недавнего // сборника/конференции, который включает в себя небольшое пошаговое руководство по некоторым образцам камеры и дает вам больше контекста вокруг образца.

Смежные вопросы