Как изменить размер видео в соответствии с пользовательским размером в WinRT
У меня есть вопрос о том, как контролировать размер видео MediaCapture. В записи MediaCapture размер видео по умолчанию соответствует размеру экрана.
Например, когда я установил ширину CaptureElement на 480, а высоту CaptureElement на 320, я вижу, что предварительный просмотр области видео составляет 480*320. Но когда я записываю его в файл и останавливаюсь, размер видео в файле соответствует размеру экрана (область просмотра 768*1280). Как я могу получить размер видео в файле, равный 320*240?
Основной код:
DeviceInformation cameraDevice = await FindDeviceInfo(panel);
if (cameraDevice == null)
{
return;
}
var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };
_encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Qvga);
if (_encodingProfile.Video != null)
{
_encodingProfile.Video.PixelAspectRatio.Numerator = 4;
_encodingProfile.Video.PixelAspectRatio.Denominator = 3;
}
var isInitialized = false;
try
{
_mediaCapture.VideoDeviceController.PrimaryUse = CaptureUse.Video;
await _mediaCapture.InitializeAsync(mediaInitSettings);
isInitialized = true;
var formatSelector = new Func<VideoEncodingProperties, bool>(ep => ep.Height * ep.Width == 640 * 480 && string.Equals(ep.Subtype, "nv12", StringComparison.OrdinalIgnoreCase));
var recordFormat = _mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoRecord).OfType<VideoEncodingProperties>().FirstOrDefault(formatSelector);
var previewFormat = _mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview).OfType<VideoEncodingProperties>().FirstOrDefault(formatSelector);
if (previewFormat != null)
await
_mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoPreview,
previewFormat);
if (recordFormat != null)
await
_mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoRecord,
recordFormat);
}
catch (Exception ex)
{
Debug.WriteLine("Exception when initializing MediaCapture with {0}: {1}", cameraDevice.Id, ex.ToString());
}
Я пытался использовать MediaComposition, но нет информации о методе Resize, который помог бы мне решить проблему. Как я могу решить это?
Ссылка на изображение предпросмотра есть [1]
1 ответ
Есть документация, которая должна охватывать то, что вы пытаетесь сделать:
Первый пример покажет вам базовое приложение для камеры с простым способом его инициализации и записи видео.
Второй научит вас, как выбирать, в каком разрешении вы хотите снимать видео. Размер CaptureElement не связан с размером кадров предварительного просмотра, поскольку он может выполнять масштабирование для вас.
Если вы хотите изменить разрешение видео, документация по третьей ссылке должна объяснить большинство вещей, которые вам нужно знать.
Используя VideoEncodingQuality.Qvga, вы настраиваете конвейер для транскодирования. Это означает, что устройство камеры будет захватывать видео с разрешением по умолчанию, а Windows изменяет его размер в соответствии с размерами QVGA. Это может привести к потере качества, поэтому обычно рекомендуется использовать VideoEncodingQuality.Auto и использовать SetMediaStreamPropertiesAsync
выбрать разрешение захвата видео у источника, если камера поддерживает желаемые размеры.
Наконец, эта последняя ссылка на документацию также упоминает важный аспект:
На некоторых устройствах один и тот же аппаратный вывод используется как для предварительного просмотра, так и для захвата потоков. На этих устройствах установка свойств кодирования одного также установит другое. На устройствах, которые используют различные аппаратные выводы для захвата и предварительного просмотра, свойства могут быть установлены для каждого потока независимо. Используйте следующий код, чтобы определить, являются ли потоки предварительного просмотра и захвата независимыми. Вам следует настроить свой пользовательский интерфейс, чтобы включить или отключить настройку потоков независимо от результатов этого теста.