Ключевой намек здесь в том, что 856/480 = 1,78, что примерно равно 16/9 = 1,77, обычному соотношению сторон для широкоэкранного видео. Нет ничего необычного в том, чтобы иметь видео с разрешением пикселей, которое имеет соотношение 1: 1,33 или 1: 1,5 (например, 640x480 или 720x480), но которое предназначено для отображения с более широким соотношением сторон 1: 1,77 (например, 856x480). Это называется анаморфным широкоформатным экраном. Таким образом, 720 x 480, вероятно, является правильным разрешением видео, но не правильным размером экрана.
При отображении анаморфного широкоэкранного изображения в окне видеопроигрыватели обычно просто сохраняют ту же высоту и растягивают ширину, чтобы получить правильное соотношение сторон экрана. В полноэкранном режиме и ширина, и высота могут быть растянуты, но не в одинаковом коэффициенте, чтобы соотношение сторон экрана было правильным, а видео точно соответствовало разрешению экрана.
Чтобы получить размер дисплея (который, кажется, вам нужен), нам нужно соотношение сторон. К счастью, тот же API свойств метаданных, который вы используете для получения ширины и высоты кадра, также имеет свойства соотношения сторон, а именно System.Video.HorizontalAspectRatio и System.Video.VerticalAspectRatio. Хотя это недокументировано, похоже, что это относится к соотношению сторон пикселя, а не к соотношению сторон изображения. Для анаморфного видео вам нужны следующие строки:
int videoWidth = (int)shellFile.Properties.System.Video.FrameWidth.Value;
int videoHeight = (int)shellFile.Properties.System.Video.FrameHeight.Value;
int horizontalAspect = (int)shellFile.Properties.System.Video.HorizontalAspectRatio.Value;
int verticalAspect = (int)shellFile.Properties.System.Video.VerticalAspectRatio.Value;
int displayWidth = videoWidth * horizontalAspect / verticalAspect;
int displayHeight = videoHeight;
В вашем случае я бы ожидал, что horizontalAspect = 53 и verticalAspect = 45 (или другие значения, дающие аналогичное соотношение).
Разрешение дисплея можно округлить до целого числа, кратного 16 или 8 пикселей, поэтому вам также может потребоваться сделать что-то вроде этого:
int roundingMultiple = 8;
int displayWidth = videoWidth * horizontalAspect / verticalAspect;
displayWidth = ((displayWidth - 1) / roundingMultiple + 1) * roundingMultiple;
Это не относится к файлам mkv; любой анаморфный видеофайл в любом формате контейнера должен обрабатываться одинаково.
РЕДАКТИРОВАТЬ: изменен приведенный выше код, чтобы отразить тот факт, что horizontalAspect / verticalAspect, по-видимому, имеет соотношение сторон pixel.
person
Alex I
schedule
25.11.2012