как изменить размер видео в соответствии с пользовательским размером в 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]: http://i.stack.imgur.com/5dnIi.png результат можно увидеть больше области.


person alexis    schedule 10.12.2015    source источник
comment
Я отредактировал грамматику и форматирование абзаца, чтобы пост было легче читать и понимать.   -  person paisanco    schedule 12.12.2015


Ответы (1)


Существует документация, которая должна охватывать то, что вы пытаетесь сделать:

  1. CameraStarterKit
  2. CameraResolution
  3. Установить свойства кодирования мультимедиа

В первом примере показано базовое приложение камеры с простым способом его инициализации и записи видео.

Второй научит вас, как выбрать, в каком разрешении вы хотите снимать видео. Размер CaptureElement не связан с размером кадров предварительного просмотра, поскольку он может выполнять масштабирование за вас.

Если вы хотите изменить разрешение видео, документация по третьей ссылке должна объяснить большинство вещей, которые вам нужно знать.

Используя VideoEncodingQuality.Qvga, вы настраиваете конвейер для транскодирования. Это означает, что устройство камеры будет снимать видео с разрешением по умолчанию, а затем Windows изменит его размер, чтобы он соответствовал размерам QVGA. Это может привести к потере качества, поэтому обычно рекомендуется вместо этого использовать VideoEncodingQuality.Auto и использовать SetMediaStreamPropertiesAsync для выбора разрешения захвата видео в источнике, при условии, что камера поддерживает желаемые размеры.

Наконец, в этой последней ссылке на документацию также упоминается важный аспект:

На некоторых устройствах один и тот же аппаратный контакт используется как для предварительного просмотра, так и для захвата потоков. На этих устройствах установка свойств кодирования одного из них также приведет к установке другого. На устройствах, использующих разные аппаратные выводы для захвата и предварительного просмотра, свойства можно задавать для каждого потока независимо. Используйте следующий код, чтобы определить, являются ли потоки предварительного просмотра и захвата независимыми. Вы должны настроить свой пользовательский интерфейс, чтобы включать или отключать настройку потоков независимо друг от друга на основе результатов этого теста.

person Mike    schedule 10.12.2015
comment
привет, я рад получить ваш ответ. Я видел образец. Вопрос не в разрешении, а в изменении размера. Я хочу получить результат - половина экрана, но результат камеры - полный экран. Скорее всего, команда кадрирования ffmpeg. Есть ли какой-нибудь апи для этого? Спасибо! - person alexis; 11.12.2015