Захват видео-кадра из окна

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:если покурить принципы работы оверлея
Общие принципы, что я "выкурил" в своё время, я изложил здесь вкратце...
Ты знаешь, где подробнее "покурить" ещё?
d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

To Lavr
погоди, может быть тебе взять OpenCV и на пайтоне простое приложение сваять из четырех строк? Что то типа такого - http://robocraft.ru/blog/computervision/275.html
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

2_d_wanderer

Пример убеждает, можно и попробовать. Но не будет ли это та же "пушка по
воробьям"?
Взять целую библиотеку компьютерного зрения с открытым исходным кодом,
которая может даже осуществить анализ движения и отслеживание объектов,
для того, чтобы ухватить один кадр?

Из результатов гугления, когда мне нужен был захват, я пришел к выводу,
что проблема почему-то не имеет простого решения. Грабберов несжатого
видео
- пруд-пруди. Но везде предупреждение - несжатого!
Если я правильно понимаю - видимый мной кадр уже разжали и он в какой-то
памяти лежит. Надо его оттуда только взять...
User avatar
Shaos
Admin
Posts: 24088
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Ещё раз - mplayer всё декодит СОФТВЕРНО, т.е. мимо аппаратных разжимателей...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:mplayer всё декодит СОФТВЕРНО, т.е. мимо аппаратных разжимателей
А у меня и нет АППАРАТНЫХ РАЗЖИМАТЕЛЕЙ. Только софтверные кодеки.
Но вот вчера решил посмотреть статистику, какие видео-файлы может
популярный Media Player Classic сохранять в image через меню "файл" -
"save image"
, как jdigreze упоминал.
Так даже статистики не получилось.
HardWareMan прав. "Егор чего-то-там-много-буков-и-типо-код 0х80000000",
где последнее число иногда отличается
стал встречаться очень часто.
Я не отслеживал тенденцию и АПИ для работы с видео изучал весьма давно,
но тогда с захватом было попроще - даже вопрос топика в то время не возник.
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Lavr, не упорствуй, попробуй mplayer, штука очень многофункциональная. Если уж оно не пройдёт, тогда да, дело сурьёзное.
Сам не люблю mplayer только из-за длинных наборов ключей... газовых, разводных, накидных, да с трещёткой...
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Занятная статейка, с прикольным советом:
И последний совет - о том как записать видео с экрана вместе с изображением проигрываемого в данный момент фильма. Как уже говорилось, большинство программ-видеопроигрывателей пытаются выводить изображение на оверлейную поверхность, поэтому оно не захватывается при создании скриншотов. Однако, если видеопроигрывателю не удается создать оверлей, он, как правило, начинает выводить изображение на первичную графическую поверхность. Оверлейная поверхность создается видеокартой, а большинство современных видеокарт способны создавать только одну оверлейную поверхность. Иными словами, если начать просматривать в видеопроигрывателе какой либо фильм, а затем открыть (параллельно) нужный фильм в другом проигрывателе (после этого первый проигрыватель можно закрыть), то, скорее всего, при записи видео с экрана при помощи нашего приложения, будет захватываться и изображение этого фильма.
Подтверждаю факт того, что если открыть вторую копию КМР плеера (или даже открыть КМР после запуска смотрелки от ТВ Тюнера), он начинает ругаться, что оверлей занят и предлагает показывать в обычный экран. При этом немного подпрыгивает загрузка проца (битблиттинг видимо).
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

jdigreze wrote:Lavr, не упорствуй, попробуй mplayer
Упаси господь - не упорствую, ибо это неположительная привычка... :lol:
И за все советы благодарен. Просто в рамках форума software
хотел попробовать сделать свою отдельную маленькую утилиту...

2_HardWareMan
Спасибо - попробую.

Интернет жмотский стал. И тупой. Раньше как-то легче было нагуглить
что-то подходящее за образец...
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Похоже накопал искомое... Интернет он как Юкон - сегодня нет... а завтра - есть...
Скриншот видеоплеера без «черных» дыр
http://habrahabr.ru/blogs/programming/111339/
User avatar
Shaos
Admin
Posts: 24088
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:Интернет жмотский стал. И тупой. Раньше как-то легче было нагуглить
что-то подходящее за образец...
Это не интернет, это гугл тухнет потихоньку - другие поисковики более адекватные результаты дают...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:это гугл тухнет потихоньку
Странно - так разросся заматерел и - тухнет ужо?

PS. Раньше я ващето Яндексил, Альтавистил и чютка Рамблер припрягал... :wink:
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Попробовал всё, что советовали и что сам накопал. Результат следующий:
Лучше всего работает способ по совету от HardWareMan-а.
...если видеопроигрывателю не удается создать оверлей, он, как правило, начинает выводить изображение на первичную графическую поверхность. Оверлейная поверхность создается видеокартой, а большинство современных видеокарт способны создавать только одну оверлейную поверхность. Иными словами, если начать просматривать в видеопроигрывателе какой либо фильм, а затем открыть (параллельно) нужный фильм в другом проигрывателе (после этого первый проигрыватель можно закрыть), то, скорее всего, при записи видео с экрана при помощи нашего приложения, будет захватываться и изображение этого фильма.
Не могу сказать сколько у меня оверлейных поверхностей, но работает чётко.
Можно запустить в начале даже самописный плеер с любым .АВИ, после чего из
второго плеера с фильмом захват окна кадра производится любым граббером
и в том числе "принтскрином" (иногда, правда, со 2-го пинка).
Media Player Classic и HyperSnap 6 похоже используют несколько другие методы.
Последний, похоже, лезет к оверлейной поверхности как описано вот в этой ссылке:
Скриншот видеоплеера без «черных» дыр
http://habrahabr.ru/blogs/programming/111339/
Media Player Classic к оверлею лезть не умеет, но и картинку создаёт, отличную
от других методов.

И вот тут самое неприятное. Ни один из способов не захватывает кадр с качеством
самого кадра.


По захвату картинка идёт пятнами равной цветности. И проигрыватель после захвата
до следующего ключевого кадра показывает изображение с пятнами.
Видимо, здесь правильное замечание по ссылке: не так страшен черт, как его малютка.
http://habrahabr.ru/blogs/programming/111339/
А малютка вот в чем: избавиться от черта-оверлея можно, но вот преобразование
цветовых моделей, видимо, тоже имеет свои трудности.

Фирменные грабберы видео-контента, которые хвалят в сети, показывают видео в свой
экран и его же сохраняют, видимо с целью избежать проблем конвертации.
Решил затестить довольно популярный бесплатный Image Grabber II.
Но он многократно убедил меня, что звуковой девайс у меня кем-то занят, а
посему показывать и захватывать кадры он мне в упор не будет. :D

http://nnm-club.ru/forum/viewtopic.php?t=105774
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

На сайте http://www.codeproject.com разбирают пример,
Trick: How to Capture Video Screen Shots
http://www.codeproject.com/KB/audio-vid ... dscrn.aspx

Image

пример работает, но изображение в захваченном файле тоже "пятнистое".
Может у меня с видео-картой что-либо не так? - Попробуйте пример, у кого
есть возможность (там есть исходники и скомпилированный файл):

http://www.codeproject.com/KB/audio-vid ... n_demo.zip
Зеркало:
http://www.nedopc.org/nedopc/upload/capvidscrn.zip
Why it works?

My guess is that the hogging video, being the first video being played, gets priority to the hardware. Subsequent videos played have to use software rendering, which enables Windows GDI to capture a copy of the frame being played.

Do I need the CHogVideo class?

No. CHogVideo is just for demonstration. You could have just started playing a video file and paused it (say with Media Player). Open a second Media Player to play the intended video screen to capture.

When it will work?

The trick will work for if the video resource is hogged first. It will work for video players that utilize DirectX approach for playing the video (this includes Windows Media Player) regardless of the source (from file, Webcast stream, TV-input).

What about Full Screen mode?

Yes, it will also capture videos in full screen mode.