Размер черных полос на видео?

Я разрабатываю видеопроигрыватель WPF C# с MediaElement.
Некоторые видео содержат черные полосы вверху и внизу. Я хочу изменить размер изображения, например, до 120 %, чтобы при воспроизведении этих видео не отображались черные полосы.
Теперь вопрос в том, как измерить размер черных полос. Если, например, видео имеет высоту 800 пикселей, я хочу измерить высоту черных полос. Если 50 пикселей черного цвета вверху и 50 пикселей внизу, я посчитаю, что мне нужно изменить размер изображения, т.е. до 112%.
Думаю, я мог бы сделать скриншот видео, а затем проанализировать это изображение, чтобы узнать, сколько черных пикселей находится сверху и снизу (не знаю, насколько это сложно). Но я думаю и надеюсь, что есть более простой способ сделать это. Любые идеи?


person Edgar    schedule 01.03.2015    source источник
comment
Вы уверены, что эти черные полосы и есть видеоконтент? Мне кажется, что речь идет о соотношении сторон и автоматической подгонке видеоконтента в контейнер MediaElement. Вы пытались воспроизвести эти видео с помощью стандартных медиаплееров, например. грамм. Windows Media, VLC или MPC?   -  person dymanoid    schedule 01.03.2015
comment
@dymanoid: я уверен, что это видео. Я понимаю ваш комментарий, и в некоторых случаях, очевидно, какая-то часть экрана не заполнена видео из-за соотношения сторон. Но есть видео с черными полосами.   -  person Edgar    schedule 01.03.2015
comment
Что ж, это будет тяжелая работа. Прежде всего, вам нужно найти не черный кадр в видео, и это может быть 1-й или 100-й кадр. Это непросто, используя только MediaElement WPF. Вы можете захватывать кадры один за другим, используя, например. RenderTargetBitmap, но это займет много времени, я полагаю. И пользователь сначала увидит немасштабированное видео во время поиска. Возможно, вам следует рассмотреть DirectShow или Media Foundation для этой задачи.   -  person dymanoid    schedule 01.03.2015


Ответы (1)


Это начало моего ответа: я только что написал быстрое и грязное решение со снимком экрана.
Я использовал RenderTargetBitmap для создания снимка экрана с высотой видео, но шириной всего в 1 пиксель. Затем я использовал метод BitmapSource.CopyPixels для извлечения отдельных пикселей, а затем перебирал пиксели сверху вниз. Это работает, и для меня это работает достаточно быстро (‹30 мс для всей процедуры).
Я опубликую полный код, когда это будет сделано.
Мне все еще интересно, есть ли более простой способ сделать это. Мой собственный ответ - всего лишь один ответ, но я рад принять что-то лучшее в качестве «ответа».

person Edgar    schedule 01.03.2015