Програмно скриншот медиа плеера
Возникла задача следующего рода. Необходимо написать exe или dll файл, в котором содержалась бы функция, позволяющая сохранять скриншот проигрывающегося в wmplayer'е видео в файл(bmp например). Возникла идея попытаться перехватить функцию, которая копирует изображение из backbuffera, но это несколько сложновато-то кажется для такой задачи т.к. плеер таких функций явно не импортирует.. Буду благодарен за любой полезный совет.
Наверное, можно зделать так - 1.найти хендл окна отображения видео, по-моему, сложного тут нету. 2.зделать принтскрин этого окна. 3. сохранить в bmp файл.
Цитата: iridum
Наверное, можно зделать так - 1.найти хендл окна отображения видео, по-моему, сложного тут нету. 2.зделать принтскрин этого окна. 3. сохранить в bmp файл.
4. вставить это в пеинт и наблюдать в пеинте ваше кино (движущуюся картинку). ;)
Насколько я помню, многие плееры используют оверлеи, которые принтскрином не схватываются...
KPI Student, задача была зделать именно bmp, читай внимательнее и очень сомневаюсь что невозможно будет получить рисунок на этого окна
KPI Student правильно сказал, что видео там проигрываетмся через оверлей, и при попытке скопировать битмап из HDC окна - ты картинки не получишь. Нет её там.
Сам то попробуй принтскрин сделать окна проигрывателя.
http://subscribe.ru/blog/comp.soft.prog.qandacpp/post/20060629110540#inf1
Небольшое пояснение (возможно, кому то это будет интересно). Дело в том, что современные видеокарты поддерживают создание так называемых оверлейных поверхностей (overlay surfaces). Оверлей - это аппаратные поверхность, не связанная с первичной графической поверхностью (primary surface) - ее данные находятся в области видеопамяти, отличной от области, занимаемой первичной графической поверхностью. Для оверлея задаются размеры, положение на экране и цветовой ключ (некоторое значение цвета пикселя). Если оверлей/оверлеи существуют, то при формировании изображения на мониторе, в области, в которой находится оверлей, видеокарта анализирует значение цвета пикселей первичной графической поверхности и, если оно равно значению цветового ключа оверлея, данные для вывода на монитор берутся не с первичной, а с оверлейной поверхности.
У оверлеев есть множество применений. Например, они традиционно используются различными приложениями-видеопроигрывателями. Преимущество использования оверлеев в данном случае заключается в отсутствии необходимости обновления изображения текущего кадра (например, при перекрытии окна видеопроигрывателя другим окном). Изображение просто выводится на оверлей, оверлей позиционируется в соответствии с положением окна проигрывателя, а окно проигрывателя заливается однородным редко используемым цветом (например, RGB(16, 0, 16)), значение которого задано в качестве цветового ключа оверлея.
Таким образом, при снятии скриншота рабочего стола, на котором запущен видео проигрыватель, выводящий изображение на оверлей, результирующий растр будет содержать изображение окна проигрывателя с однородно закрашенной областью вывода анимации (проигрываемого в данный момент кадра на скриншоте не будет).
Цитата:
Небольшое пояснение (возможно, кому то это будет интересно). Дело в том, что современные видеокарты поддерживают создание так называемых оверлейных поверхностей (overlay surfaces). Оверлей - это аппаратные поверхность, не связанная с первичной графической поверхностью (primary surface) - ее данные находятся в области видеопамяти, отличной от области, занимаемой первичной графической поверхностью. Для оверлея задаются размеры, положение на экране и цветовой ключ (некоторое значение цвета пикселя). Если оверлей/оверлеи существуют, то при формировании изображения на мониторе, в области, в которой находится оверлей, видеокарта анализирует значение цвета пикселей первичной графической поверхности и, если оно равно значению цветового ключа оверлея, данные для вывода на монитор берутся не с первичной, а с оверлейной поверхности.
У оверлеев есть множество применений. Например, они традиционно используются различными приложениями-видеопроигрывателями. Преимущество использования оверлеев в данном случае заключается в отсутствии необходимости обновления изображения текущего кадра (например, при перекрытии окна видеопроигрывателя другим окном). Изображение просто выводится на оверлей, оверлей позиционируется в соответствии с положением окна проигрывателя, а окно проигрывателя заливается однородным редко используемым цветом (например, RGB(16, 0, 16)), значение которого задано в качестве цветового ключа оверлея.
Таким образом, при снятии скриншота рабочего стола, на котором запущен видео проигрыватель, выводящий изображение на оверлей, результирующий растр будет содержать изображение окна проигрывателя с однородно закрашенной областью вывода анимации (проигрываемого в данный момент кадра на скриншоте не будет).
вотблин
Цитата: aks
Сам то попробуй принтскрин сделать окна проигрывателя.
Зависит от рендерера. Если кин через DirectX показывается то вполне PrintScreen работает.
Есстественно зависит. Можно вобще видео рукамидекодировать и покадрово на окне рисовать. =)
В крайнем случае потрошим MPC,там есть аж в меню такой пункт–сделать скриншот
1)Отключить хардвар акселерацию
2)снять скриншот стандартно(BitBlt)
3)Включить хардвар акселерацию
:-)
http://www.menasoft.com/blog/?p=30
Цитата: Alexandoros
Есть тупой способ:
1)Отключить хардвар акселерацию
2)снять скриншот стандартно(BitBlt)
3)Включить хардвар акселерацию
1)Отключить хардвар акселерацию
2)снять скриншот стандартно(BitBlt)
3)Включить хардвар акселерацию
Интересно было бы посмотреть на систему, как ее плющить-то будет. :rolleyes:
Предоставим свободу выбора автору.Пусть пробует все указанные варианты,включая и мой,а потом покажет результаты
Цитата: hardcase
Интересно было бы посмотреть на систему, как ее плющить-то будет. :rolleyes:
Ну кстати не супер сильно. У Camtasia Studio это один из режимов работы, мол
"а можно я вам акселерацию отключу, а...
у вас и картинка после этого плавненькая будет" :)