c plus plus中怎么做才能截取到暴风影音里面播放的视频

liuwei2500 2010-12-01 03:26:27
自己写了一个截屏的程序,当文件在暴风影音里面播放的时候,画面截取不到。

...全文
1005 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-12-03
  • 打赏
  • 举报
回复
试试
//GDI与DX截屏API操作
LPDIRECTDRAW lpDD = NULL;
LPDIRECTDRAWSURFACE lpDDSPrime = NULL;
LPDIRECTDRAWSURFACE lpDDSBack = NULL;
LPDIRECTDRAWSURFACE lpDDSGdi = NULL;
LPDIRECTDRAWSURFACE lpSurf = NULL;

DDSURFACEDESC DDSdesc;
BOOL m_b24=TRUE;
//rfbServerInitMsg m_scrinfo;
RECT m_bmrect;

struct _BMInfo {
BITMAPINFO bmi ;
BOOL truecolour;
RGBQUAD cmap[256] ;
} m_bminfo; // 用来保存位图信息的结构

int DX_Init() {// DirectX初始化。返回当前表面获取一张屏幕位图的存储空间大小
HRESULT hr;

// 初始化directX
hr = DirectDrawCreate(0, &lpDD, 0);
if (FAILED(hr)) return FALSE;

hr = lpDD->SetCooperativeLevel(NULL, DDSCL_NORMAL);
if (FAILED(hr)) return FALSE;

ZeroMemory(&DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize = sizeof(DDSdesc);
DDSdesc.dwFlags = DDSD_CAPS;
DDSdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hr = lpDD->CreateSurface(&DDSdesc, &lpDDSPrime, 0);
if (FAILED(hr)) return FALSE;

hr = lpDD->GetGDISurface(&lpDDSGdi);
if (FAILED(hr)) return FALSE;

ZeroMemory(&DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize = sizeof(DDSdesc);
DDSdesc.dwFlags = DDSD_ALL;
hr = lpDDSPrime->GetSurfaceDesc(&DDSdesc);
if (FAILED(hr)) return FALSE;

// 初始化位图信息
if ((DDSdesc.dwFlags & DDSD_WIDTH) && (DDSdesc.dwFlags & DDSD_HEIGHT)) {
m_bmrect.left = m_bmrect.top = 0;
m_bmrect.right = DDSdesc.dwWidth;
m_bmrect.bottom = DDSdesc.dwHeight;
} else return FALSE;

m_bminfo.bmi.bmiHeader.biCompression = BI_RGB;//BI_BITFIELDS;
m_bminfo.bmi.bmiHeader.biBitCount = DDSdesc.ddpfPixelFormat.dwRGBBitCount;

// m_bminfo.truecolour = DDSdesc.ddpfPixelFormat.dwFlags & DDPF_RGB;
if (m_bminfo.bmi.bmiHeader.biBitCount > 8)
m_bminfo.truecolour = TRUE;
else
m_bminfo.truecolour = FALSE;

ZeroMemory(&DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize = sizeof(DDSdesc);
DDSdesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
DDSdesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
DDSdesc.dwHeight = m_bmrect.bottom - m_bmrect.top;
DDSdesc.dwWidth = m_bmrect.right - m_bmrect.left;
hr = lpDD->CreateSurface(&DDSdesc, &lpDDSBack, 0);
if (FAILED(hr)) return FALSE;
// hr = lpDDSPrime->QueryInterface( IID_IDirectDrawSurface3, (LPVOID *)&lpSurf);
// if (FAILED(hr)) return FALSE;

switch (m_bminfo.bmi.bmiHeader.biBitCount) {
case 32:
case 24:
// Update the bitmapinfo header
m_b24 = TRUE;
m_bminfo.bmi.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
m_bminfo.bmi.bmiHeader.biWidth = 1024;
m_bminfo.bmi.bmiHeader.biHeight = 768;
m_bminfo.bmi.bmiHeader.biPlanes = 1;
// m_bminfo.bmi.bmiHeader.biBitCount = 24;
m_bminfo.bmi.bmiHeader.biCompression = BI_RGB;
m_bminfo.bmi.bmiHeader.biSizeImage = abs((m_bminfo.bmi.bmiHeader.biWidth * m_bminfo.bmi.bmiHeader.biHeight * m_bminfo.bmi.bmiHeader.biBitCount)/8);
m_bminfo.bmi.bmiHeader.biXPelsPerMeter = (1024*1000)/1024;
m_bminfo.bmi.bmiHeader.biYPelsPerMeter = (768*1000)/768;
m_bminfo.bmi.bmiHeader.biClrUsed = 0;
m_bminfo.bmi.bmiHeader.biClrImportant = 0;
break;
}

return m_bminfo.bmi.bmiHeader.biSizeImage;
}

BOOL CaptureScreen(RECT &rect, BYTE *scrBuff, UINT scrBuffSize) {// 捕捉屏幕。rect: 区域。scrBuff: 输出缓冲。scrBuffSize: 缓冲区大小
HRESULT hr=0;

hr = lpDDSBack->BltFast(rect.left,rect.top,lpDDSPrime,&rect,DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
if (FAILED(hr)) return FALSE;

DDSURFACEDESC surfdesc;
ZeroMemory(&surfdesc, sizeof(surfdesc));
surfdesc.dwSize = sizeof(surfdesc);

hr = lpDDSBack->Lock(&rect, &surfdesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR /*|DDLOCK_NOSYSLOCK*/, NULL);
// hr = lpDDSPrime->Lock(&rect, &surfdesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR /*|DDLOCK_NOSYSLOCK*/, NULL);
if (FAILED(hr)) return FALSE;

// copy the data into our buffer
BYTE * destbuffpos, * srcbuffpos;
// m_scrinfo.format.bitsPerPixel = 24;
srcbuffpos = (BYTE *) surfdesc.lpSurface;
destbuffpos = scrBuff;

memcpy( destbuffpos, srcbuffpos,m_bminfo.bmi.bmiHeader.biSizeImage);

// unlock the primary surface
// lpDDSPrime->Unlock(surfdesc.lpSurface);
lpDDSBack->Unlock(surfdesc.lpSurface);
return TRUE;
}
enter333 2010-12-02
  • 打赏
  • 举报
回复
截取视频流啊。不会,帮顶。。
liuwei2500 2010-12-02
  • 打赏
  • 举报
回复
再顶一天。
liuwei2500 2010-12-02
  • 打赏
  • 举报
回复

赵4老师 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liuwei2500 的回复:]
再问一问:结贴
我用ffmpeg命令将多张jpg合并成avi文件。命令如下:
ffmpeg -y -i bmp/Screen.%d.jpg -vcodec libx264 "c:\123.avi"
文件是创建成功了,但是只能在暴风影音里面播放,像MidiaPlayer,QvodPlayer都不能播放
,写的软件也不能解析,请问这个命令要如何写,才能是标准的无损压缩,将多个jpg文件压入Av……
[/Quote]
找ffmpeg的高版本或找其它同类软件再试试。

BTW:不想禁用硬件加速后截取视频窗口内容,可以使用DirectX对应截图API函数。
liuwei2500 2010-12-02
  • 打赏
  • 举报
回复
再问一问:结贴
我用ffmpeg命令将多张jpg合并成avi文件。命令如下:
ffmpeg -y -i bmp/Screen.%d.jpg -vcodec libx264 "c:\123.avi"
文件是创建成功了,但是只能在暴风影音里面播放,像MidiaPlayer,QvodPlayer都不能播放
,写的软件也不能解析,请问这个命令要如何写,才能是标准的无损压缩,将多个jpg文件压入Avi,并且能够在上述的两个Player中播放。
飞翔的土豆 2010-12-01
  • 打赏
  • 举报
回复
此问题让我菊花一紧。。帮顶吧
liuwei2500 2010-12-01
  • 打赏
  • 举报
回复
是可以通过
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw] 中的EmulationOnly 设为1这种方式,但是这样设定,如果之前暴风影音是打开状态,还是截取不到。
况且这种方式是对所有的硬件设置了不加速,是否不好呢?
能有其他的方法吗?
赵4老师 2010-12-01
  • 打赏
  • 举报
回复
可能是修改某个注册表项吧。
用dxdiag修改设置时用regmon查看一下。
liuwei2500 2010-12-01
  • 打赏
  • 举报
回复
能不能用程序来实现,不可能我还让别人设定好了再截取吧
liuwei2500 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhao4zhong1 的回复:]

想截暴风影音的视频窗口内容的话试试以下两种方法之一:
·运行dxdiag,“显示、DirectX 功能、DirectDraw 加速:禁用”
·用MediaPlayer随便播放一段视频并暂停
然后再启动暴风影音
[/Quote]
帅哥,第一种方式有例子参考下嘛?这个问题没弄过。
赵4老师 2010-12-01
  • 打赏
  • 举报
回复
想截暴风影音的视频窗口内容的话试试以下两种方法之一:
·运行dxdiag,“显示、DirectX 功能、DirectDraw 加速:禁用”
·用MediaPlayer随便播放一段视频并暂停
然后再启动暴风影音
liuwei2500 2010-12-01
  • 打赏
  • 举报
回复
暂停了也截取不到。
恨天低 2010-12-01
  • 打赏
  • 举报
回复
这个有意思~帮顶,期待解决~
liuwei2500 2010-12-01
  • 打赏
  • 举报
回复
我知道有自带的。关键是现在老大要我写截屏程序来截。
知道的大牛们,吐露下,我相信肯定是有方法的
ddyddl 2010-12-01
  • 打赏
  • 举报
回复
把暴风影音暂停了呢?
就想叫yoko 2010-12-01
  • 打赏
  • 举报
回复
暴风影音自带截屏的
而且用QQ截也是截不到的

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧