求助~~我该如何使用这个接口?

ddxz_111 2008-05-13 11:36:19
我最近在用directshow做局域网的视频组播的毕业设计,发送端用的是KTAVMulticase.ax,它同时提供了Delphi和VC的接口,除了可以组播视频流之外,还可以在发送端实时显示FPS(由OnSendRate()函数实现)。我参考了附件中的Delphi代码,想用VC接口实现我需要的功能...可是不得要领,希望各位高手能帮我!



说明如下
一、过滤器说明:

KTAVMulticast.ax是一组基于DirectShow技术开发的音视频组播传输过滤器,包括音视
频组播发送KTAVMSender及音视频组播接收KTAVMReceiver两个Filter,可应用于局域网内实
时音视频及电影的组播与接收,也可以用于局域网视频会议、视频教学系统的开发。其接口
如下:

1. KTAVMSender:是一个Render型的Filter,用于音频或视频组播。

Delphi:

CLSID_KTAVMSender: TGUID = '{5AF8DA7F-988A-4783-B4A7-14AEA8658E10}';

//发送端回调接口
IKTAVMSenderCB = interface(IUnKnown)
['{2C0C7789-15D9-4178-A75B-2D184D5F3190}']
//输出内部控制数据,应传送到另一个KTAVMSender的函数InternalControl
function OnInternalControl(FilterID: Integer; Data: PByte): HRESULT; stdcall;
//输出传送帧速,Fps-帧/秒,Bps-字节/秒
function OnSendRate(FilterID, MajorMediaType, Fps, Bps: Integer): HRESULT; stdcall;
end;

IKTAVMSender = interface(IUnKnown)
['{5307A19B-313F-4475-A393-759F0C993B25}']
//设置授权码
function Authorise(Company, Code: PChar): HRESULT; stdcall;
//设置组IP
function SetMulticastIP(MulticastIP: PChar): HRESULT; stdcall;
//取得组IP,默认是233.0.0.1
function GetMulticastIP(out MulticastIP: PChar): HRESULT; stdcall;
//设置组播端口
function SetMulticastPort(MulticastPort: Integer): HRESULT; stdcall;
//取得组播端口,默认是12700
function GetMulticastPort(out MulticastPort: Integer): HRESULT; stdcall;
//取得本机所有网络适配器的IP地址,每个IP用回车换行符分隔
function GetLocalIPs(out LocalIPs: PChar): HRESULT; stdcall;
//设置本机局域网IP(应在GetLocallIPs取得的列表中选取)
function SetLocalIP(LocalIP: PChar): HRESULT; stdcall;
//取得本机局域网IP,默认是127.0.0.1
function GetLocalIP(out LocalIP: PChar): HRESULT; stdcall;
//设置应用程序识别码,只有相同识别码的程序能互相识别,处理数据
function SetAppID(AppID: Word): HRESULT; stdcall;
//设置本发送端用户标识
function SetUserID(UserID: Integer): HRESULT; stdcall;
//取得本发送端用户标识,默认是1000
function GetUserID(out UserID: Integer): HRESULT; stdcall;
//设置本Filter所组播的媒体类型:0-视频;1-音频,默认是0
function SetMajorMediaType(MajorMediaType: Integer): HRESULT; stdcall;
//取得本Filter正组播的媒体类型
function GetMajorMediaType(out MajorMediaType: Integer): HRESULT; stdcall;
//设置传输模式:0-实时传送;1-传送电影,默认是0
function SetTransmissionMode(TransmissionMode: Integer): HRESULT; stdcall;
//取得当前传输模式
function GetTransmissionMode(out TransmissionMode: Integer): HRESULT; stdcall;
//设置回调函数,FilterID用于本Filter在应用程序中的唯一识别码
function SetCallback(Callback: IKTAVMSenderCB; FilterID: Integer): HRESULT; stdcall;
//用于内部控制,输入另一个KTAVMSender回调函数中输出的数据
function InternalControl(Data: PByte): HRESULT; stdcall;
//组播用户的普通数据
function MulticastData(Data: PByte; DataLen: Integer): HRESULT; stdcall;
end;

VC++:

DEFINE_GUID(CLSID_KTAVMSender,
0x5AF8DA7F, 0x988A, 0x4783, 0xB4, 0xA7, 0x14, 0xAE, 0xA8, 0x65, 0x8E, 0x10);

EXTERN_GUID(IID_IKTAVMSenderCB,
0x2C0C7789, 0x15D9, 0x4178, 0xA7, 0x5B, 0x2D, 0x18, 0x4D, 0x5F, 0x31, 0x90);
MIDL_INTERFACE("2C0C7789-15D9-4178-A75B-2D184D5F3190")
IKTAVMSenderCB : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE OnInternalControl(int FilterID, char *Data) = 0;
virtual HRESULT STDMETHODCALLTYPE OnSendRate(int FilterID, int MajorMediaType, itn Fps, int Bps) = 0;
};

EXTERN_GUID(IID_IKTAVMSender,
0x5307A19B, 0x313F, 0x4475, 0xA3, 0x93, 0x75, 0x9F, 0x0C, 0x99, 0x3B, 0x25);
MIDL_INTERFACE("5307A19B-313F-4475-A393-759F0C993B25")
IKTAVMSender : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE Authorise(char *Company, char *Code) = 0;
virtual HRESULT STDMETHODCALLTYPE SetMulticastIP(char *MulticastIP) = 0;
virtual HRESULT STDMETHODCALLTYPE GetMulticastIP(/* [out] */ char **MulticastIP) = 0;
virtual HRESULT STDMETHODCALLTYPE SetMulticastPort(int MulticastPort) = 0;
virtual HRESULT STDMETHODCALLTYPE GetMulticastPort(/* [out] */ int *MulticastPort) = 0;
virtual HRESULT STDMETHODCALLTYPE GetLocalIPs(/* [out] */ char **LocalIPs) = 0;
virtual HRESULT STDMETHODCALLTYPE SetLocalIP(char *LocalIP) = 0;
virtual HRESULT STDMETHODCALLTYPE GetLocalIP(/* [out] */ char **LocalIP) = 0;
virtual HRESULT STDMETHODCALLTYPE SetAppID(WORD AppID) = 0;
virtual HRESULT STDMETHODCALLTYPE SetUserID(int UserID) = 0;
virtual HRESULT STDMETHODCALLTYPE GetUserID(/* [out] */ int *UserID) = 0;
virtual HRESULT STDMETHODCALLTYPE SetMajorMediaType(int MediaType) = 0;
virtual HRESULT STDMETHODCALLTYPE GetMajorMediaType(/*[out]*/ int *MediaType) = 0;
virtual HRESULT STDMETHODCALLTYPE SetTransmissionMode(int TransmissionMode) = 0;
virtual HRESULT STDMETHODCALLTYPE GetTransmissionMode(/*[out]*/ int *TransmissionMode) = 0;
virtual HRESULT STDMETHODCALLTYPE SetCallback(IKTAVMSenderCB *Callback, int FilterID) = 0;
virtual HRESULT STDMETHODCALLTYPE InternalControl(char *Data) = 0;
virtual HRESULT STDMETHODCALLTYPE MulticastData(char *Data, int DataLen) = 0;
};

就是其中这个接口
EXTERN_GUID(IID_IKTAVMSenderCB,
0x2C0C7789, 0x15D9, 0x4178, 0xA7, 0x5B, 0x2D, 0x18, 0x4D, 0x5F, 0x31, 0x90);
MIDL_INTERFACE("2C0C7789-15D9-4178-A75B-2D184D5F3190")
IKTAVMSenderCB : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE OnInternalControl(int FilterID, char *Data) = 0;
virtual HRESULT STDMETHODCALLTYPE OnSendRate(int FilterID, int MajorMediaType, itn Fps, int Bps) = 0;
};
我写了一个类继承自IKTAVMSenderCB,并实现了OnSendRate,但是用自定义类实例化的时候提示不能实例化抽象类,未定义纯虚函数AddRef、Release、QueryInterface,应该是我的方法不对吧,具体该如何使用这个接口以达到我期望的目的呢?希望您能给予指点,谢谢了
...全文
156 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rageliu 2008-05-15
  • 打赏
  • 举报
回复
感谢,已收到
rageliu 2008-05-14
  • 打赏
  • 举报
回复
上面这样基本就ok了,如果再搞不定留言,正好木可用分了
rageliu 2008-05-14
  • 打赏
  • 举报
回复
AddRef、Release、QueryInterface这3个函数,一般都是需要实现的,类似如下方式实现:

STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj)
{
return m_pDDraw->QueryInterface(riid, ppvObj);
}
STDMETHOD_(ULONG,AddRef) (THIS)
{
return m_pDDraw->AddRef();
}
STDMETHOD_(ULONG,Release) (THIS)
{
ULONG count = m_pDDraw->Release();
if(0 == count)
delete this;

return count;
}

上面只是一个我写的例子,这里我认为可以简单成这样:

STDMETHODIMP_(ULONG) AddRef() { return 2; } //直接返回非0,防止自动释放即可
STDMETHODIMP_(ULONG) Release() { return 1; } //直接返回1

STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
{
CheckPointer(ppv, E_POINTER);

if (riid == IID_IKTAVMSenderCB || riid == IID_IUnknown)
{
*ppv = (void *) static_cast<IID_IKTAVMSenderCB *>(this);
return NOERROR; // 返回对该filter的查询,类似 IKTAVMSender * 的东东
}

return E_NOINTERFACE;
}
ddxz_111 2008-05-14
  • 打赏
  • 举报
回复
问题已解决!
1000可用分已捐赠,请查收!
再次感谢您的热心帮助!
ddxz_111 2008-05-13
  • 打赏
  • 举报
回复
能帮我解决问题的,我愿意捐赠1000可用分,绝不食言。

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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