网页flash视频抓取器(这是如何做到的呢?缩放了页面大小怎么办? )
优采云 发布时间: 2021-11-19 08:01网页flash视频抓取器(这是如何做到的呢?缩放了页面大小怎么办?
)
很多浏览器都有这个功能。当您将鼠标移至网络视频时,您可以在顶部看到一个弹出独立播放器的按钮。当您单击该按钮时,视频将弹出并在新窗口中播放。此时视频窗口的大小可以自由调整,不再受页面限制。
这是怎么做的?
首先想到的就是浏览器缩放页面的大小,只是为了显示视频窗口的大小。Firefox 似乎有一个魔镜功能,可以在网页演示中截取网页的任何部分。要做到这一点,浏览器的外框程序必须自己编写(国产浏览器是这样)。如果浏览器不是自己的,可以通过BHO来实现吗?
另一个想法是提取页面上与视频相关的HTML代码,并在新的页面框架中显示。但是在这种情况下,您必须非常熟悉页面代码的结构,并且必须遵循更改。另外,当新的视频窗口弹出时,播放进度无法保持,必须从头开始播放。
其实有一个简单的方法,就是把页面上的Flash控件重新激活到另一个窗口。因为我们知道Flash实际上是一个运行在IE容器中的ActiveX控件。如果我们新建一个Ole Container,我们就可以将Flash控件激活到新的Container中。这样Flash控件就可以在保持状态的同时在不同的容器之间切换,在页面和弹窗之间自由切换。
因此,要在(IE)页面中弹出Flash视频,需要以下步骤:
1. 通过Web Browser控件或BHO,页面加载后获取页面的DOM模型,找到Embed节点对象,即可找到Flash空间。
2. 创建一个Ole容器,比如ATL的CAxWindow
3. 激活 Flash 控件到新的 Ole 容器
代码片段(基于 ATL):
//pFlashDisp为Flash控件对象,通过分析页面DOM获得
//保存IE容器,用于恢复
CComQIPtr spFlashOleObj = pFlashDisp;
spFlashOleObj->GetClientSite(&m_spIESite);
//必选先关闭,才能转移到新的窗口上
spFlashOleObj->DoVerb(OLEIVERB_HIDE, NULL, m_spIESite, 0, NULL, NULL);
spFlashOleObj->Close(OLECLOSE_NOSAVE);
//创建新的Ole容器(ATL的CAxWindow类)
CRect clientRect;
GetClientRect(&clientRect);
m_HostWin.Create(m_hWnd, &clientRect, NULL, WS_CHILD);
CComPtr spHost;
m_HostWin.QueryHost(&spHost);
//使得Flash可以查询到IE提供的IServiceProvider,比如可以打开新的网页
CComQIPtr spObjWithSite;
m_HostWin.QueryHost(IID_IObjectWithSite, (void**)&spObjWithSite);
spObjWithSite->SetSite(pOuterSite);
//激活到新容器, m_hWnd为m_HostWin的父窗口
spHost->AttachControl(spFlashOleObj, m_hWnd);