如何利用Flash控件捕获到swf文件的每一帧数据?
最近工作因为需要将swf转换成视频,开始想要从swf文件格式着手,解析出swf里面的图像,了解过swf文件格式后,发现是个复杂的工作,因此放弃这个方法,准备从截取flash控件图像着手。直接用flash控件创建窗口,然后通过窗口的设备dc来获取到flash的图像数据,但是遇到了一个问题,当我要隐藏flash控件窗口后,再也无法获取到图像。郁闷了一段时间。继续查询资料,终于找到了一种解决的办法,以下是解决的代码。
Shockwaveflash.h文件是从网上找到的flash控件提供的接口文件;
Flash.h及Flash.cpp是利用atl来处理flash帧的实现文件,如果需要可以扩展其功能,这里就不详细列出。
//Shockwaveflash.h
#pragma once
/* verify that the <rpcndr.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 440
#endif
#include <ObjBase.h>
#include <Rpc.h>
#include <RpcNdr.h>
#ifndef __h_h__
#define __h_h__
#ifdef __cplusplus
extern "C"{
#endif
#ifndef __IShockwaveFlash_FWD_DEFINED__
#define __IShockwaveFlash_FWD_DEFINED__
typedef interface IShockwaveFlash IShockwaveFlash;
#endif
#ifndef __DShockwaveFlashEvents_FWD_DEFINED__
#define __DShockwaveFlashEvents_FWD_DEFINED__
typedef interface DShockwaveFlashEvents DShockwaveFlashEvents;
#endif
#ifndef __ShockwaveFlash_FWD_DEFINED__
#define __ShockwaveFlash_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShockwaveFlash ShockwaveFlash;
#else
typedef struct ShockwaveFlash ShockwaveFlash;
#endif
#endif
#ifndef __FlashProp_FWD_DEFINED__
#define __FlashProp_FWD_DEFINED__
#ifdef __cplusplus
typedef class FlashProp FlashProp;
#else
typedef struct FlashProp FlashProp;
#endif
#endif
void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t);
void __RPC_USER MIDL_user_free( void __RPC_FAR * );
#ifndef __ShockwaveFlashObjects_LIBRARY_DEFINED__
#define __ShockwaveFlashObjects_LIBRARY_DEFINED__
EXTERN_C const IID LIBID_ShockwaveFlashObjects;
#ifndef __IShockwaveFlash_INTERFACE_DEFINED__
#define __IShockwaveFlash_INTERFACE_DEFINED__
EXTERN_C const IID IID_IShockwaveFlash ;
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("D27CDB6C-AE6D-11CF-96B8-444553540000")
IShockwaveFlash : public IDispatch
{
public:
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_ReadyState(
/* [retval][out] */ long __RPC_FAR *thestate) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_TotalFrames(
/* [retval][out] */ long __RPC_FAR *numframes) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_Playing(
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *Playing) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_Playing(
/* [in] */ VARIANT_BOOL Playing) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_Quality(
/* [retval][out] */ int __RPC_FAR *Quality) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_Quality(
/* [in] */ int Quality) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_ScaleMode(
/* [retval][out] */ int __RPC_FAR *scale) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_ScaleMode(
/* [in] */ int scale) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_AlignMode(
/* [retval][out] */ int __RPC_FAR *align) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_AlignMode(
/* [in] */ int align) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_BackgroundColor(
/* [retval][out] */ long __RPC_FAR *color) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_BackgroundColor(
/* [in] */ long color) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_Loop(
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *Loop) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_Loop(
/* [in] */ VARIANT_BOOL Loop) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_Movie(
/* [retval][out] */ BSTR __RPC_FAR *path) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_Movie(
/* [in] */ BSTR path) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_FrameNum(
/* [retval][out] */ long __RPC_FAR *FrameNum) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_FrameNum(
/* [in] */ long FrameNum) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetZoomRect(
/* [in] */ long left,
/* [in] */ long top,
/* [in] */ long right,
/* [in] */ long bottom) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Zoom(
/* [in] */ int factor) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Pan(
/* [in] */ long x,
/* [in] */ long y,
/* [in] */ int mode) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Play( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Stop( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Back( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Forward( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Rewind( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE StopPlay( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE GotoFrame(
/* [in] */ long FrameNum) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CurrentFrame(
/* [retval][out] */ long __RPC_FAR *FrameNum) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsPlaying(
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *Playing) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE PercentLoaded(
/* [retval][out] */ long __RPC_FAR *__MIDL_0015) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE FrameLoaded(
/* [in] */ long FrameNum,
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *loaded) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE FlashVersion(
/* [retval][out] */ long __RPC_FAR *version) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_WMode(
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_WMode(
/* [in] */ BSTR pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_SAlign(
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_SAlign(
/* [in] */ BSTR pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_Menu(
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_Menu(
/* [in] */ VARIANT_BOOL pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_Base(
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_Base(
/* [in] */ BSTR pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_scale(
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_scale(
/* [in] */ BSTR pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_DeviceFont(
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_DeviceFont(
/* [in] */ VARIANT_BOOL pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_EmbedMovie(
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_EmbedMovie(
/* [in] */ VARIANT_BOOL pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_BGColor(
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_BGColor(
/* [in] */ BSTR pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_Quality2(
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_Quality2(
/* [in] */ BSTR pVal) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE LoadMovie(
/* [in] */ int layer,
/* [in] */ BSTR url) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TGotoFrame(
/* [in] */ BSTR target,
/* [in] */ long FrameNum) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TGotoLabel(
/* [in] */ BSTR target,
/* [in] */ BSTR label) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TCurrentFrame(
/* [in] */ BSTR target,
/* [retval][out] */ long __RPC_FAR *FrameNum) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TCurrentLabel(
/* [in] */ BSTR target,
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TPlay(
/* [in] */ BSTR target) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TStopPlay(
/* [in] */ BSTR target) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetVariable(
/* [in] */ BSTR name,
/* [in] */ BSTR value) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetVariable(
/* [in] */ BSTR name,
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TSetProperty(
/* [in] */ BSTR target,
/* [in] */ int property,
/* [in] */ BSTR value) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TGetProperty(
/* [in] */ BSTR target,
/* [in] */ int property,
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TCallFrame(
/* [in] */ BSTR target,
/* [in] */ int FrameNum) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TCallLabel(
/* [in] */ BSTR target,
/* [in] */ BSTR label) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TSetPropertyNum(
/* [in] */ BSTR target,
/* [in] */ int property,
/* [in] */ double value) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE TGetPropertyNum(
/* [in] */ BSTR target,
/* [in] */ int property,
/* [retval][out] */ double __RPC_FAR *pVal) = 0;
virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get_SWRemote(
/* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
virtual /* [propput][id] */ HRESULT STDMETHODCALLTYPE put_SWRemote(
/* [in] */ BSTR pVal) = 0;
};
#else /* C style interface */
typedef struct IShockwaveFlashVtbl
{
BEGIN_INTERFACE
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(
IShockwaveFlash __RPC_FAR * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(
IShockwaveFlash __RPC_FAR * This);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(
IShockwaveFlash __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )(
IShockwaveFlash __RPC_FAR * This,
/* [out] */ UINT __RPC_FAR *pctinfo);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )(
IShockwaveFlash __RPC_FAR * This,
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )(
IShockwaveFlash __RPC_FAR * This,
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID __RPC_FAR *rgDispId);
/* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )(
IShockwaveFlash __RPC_FAR * This,
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
/* [out] */ VARIANT __RPC_FAR *pVarResult,
/* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
/* [out] */ UINT __RPC_FAR *puArgErr);
/* [propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ReadyState )(
IShockwaveFlash __RPC_FAR * This,
/* [retval][out] */ long __RPC_FAR *thestate);
/* [propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_TotalFrames )(
IShockwaveFlash __RPC_FAR * This,
/* [retval][out] */ long __RPC_FAR *numframes);
/* [propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Playing )(
IShockwaveFlash __RPC_FAR * This,
/* [retval][out] */ VARIANT_BOOL __RPC_FAR *Playing);
/* [propput][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Playing )(
IShockwaveFlash __RPC_FAR * This,
/* [in] */ VARIANT_BOOL Playing);
/* [propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Quality )(
IShockwaveFlash __RPC_FAR * This,
/* [retval][out] */ int __RPC_FAR *Quality);
/* [propput][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Quality )(
IShockwaveFlash __RPC_FAR * This,
/* [in] */ int Quality);
/* [propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ScaleMode )(