audioVideoFilter
所属分类:视频捕捉采集剪辑
开发工具:Visual C++
文件大小:5991KB
下载次数:163
上传日期:2006-03-12 17:18:48
上 传 者:
climbing
说明: 基于directshow实现的音视频组播过滤器,以.ax格式发布,可以直接使用,提供的借口见压缩包中的说明文件
(based on the realization of directshow multicast audio and video filters to. Ax release format, can be directly used to provide a pretext for compressed see the note)
文件列表:
音视频组播过滤器 (0, 2006-03-07)
音视频组播过滤器\1.JPG (83082, 2006-01-22)
音视频组播过滤器\2.JPG (77127, 2006-01-22)
音视频组播过滤器\3.JPG (52727, 2006-01-22)
音视频组播过滤器\AppSource (0, 2006-03-07)
音视频组播过滤器\AppSource\Exe (0, 2006-03-07)
音视频组播过滤器\AppSource\Exe\A.asf (2449326, 2005-12-21)
音视频组播过滤器\AppSource\Exe\KTVRecv.exe (199576, 2006-01-20)
音视频组播过滤器\AppSource\Exe\KTVSend.exe (208792, 2006-01-20)
音视频组播过滤器\AppSource\Recv (0, 2006-03-07)
音视频组播过滤器\AppSource\Recv\KTVRecv.dpr (194, 2005-12-21)
音视频组播过滤器\AppSource\Recv\Main.dfm (3150, 2006-01-19)
音视频组播过滤器\AppSource\Recv\Main.pas (7414, 2006-01-22)
音视频组播过滤器\AppSource\Send (0, 2006-03-07)
音视频组播过滤器\AppSource\Send\KTVSend.dpr (194, 2005-12-21)
音视频组播过滤器\AppSource\Send\Main.dfm (7861, 2006-01-13)
音视频组播过滤器\AppSource\Send\Main.pas (11409, 2006-01-20)
音视频组播过滤器\Conference (0, 2006-03-07)
音视频组播过滤器\Conference\ConfDemo.exe (220568, 2006-01-20)
音视频组播过滤器\Conference\ConfDemoII.exe (221080, 2006-01-20)
音视频组播过滤器\F.JPG (13953, 2006-01-22)
音视频组播过滤器\FII.JPG (36942, 2006-01-22)
音视频组播过滤器\Filter (0, 2006-03-07)
音视频组播过滤器\Filter\KTVideo.ax (237056, 2006-02-22)
音视频组播过滤器\Filter\Reg.bat (19, 2005-12-21)
音视频组播过滤器\Filter\Unreg.bat (22, 2005-12-21)
音视频组播过滤器\FP.JPG (28031, 2006-01-22)
音视频组播过滤器\GraphEdit.avi (3813376, 2006-02-27)
音视频组播过滤器\Thumbs.db (22016, 2006-03-07)
音视频组播过滤器KTVideo.ax
一、KTVideo.ax是一组基于DirectShow技术开发的音视频传输过滤器,包括音视频发送KTVSender、
KTVSenderII及音视频接收KTVReceiver三个Filter,可应用于局域网内实时音视频及电影的组播与
接收,也可以用于局域网视频会议的开发。其接口如下:
1. KTVSender:是一个Render型的Filter,用于音视频组播。
Delphi:
CLSID_KTVSender: TGUID = '{32013214-0DB4-4526-B70D-5CD36AB4B3EF}';
IKTVSender = interface(IUnKnown)
['{A632B270-30CE-4073-BAD6-8D5779617550}']
function Authorise(Company, Code: PChar): HRESULT; stdcall; //设置授权码
function SetMulticastIP(MulticastIP: PChar): HRESULT; stdcall; //设置组IP
function GetMulticastIP(out MulticastIP: PChar): HRESULT; stdcall; //取得组IP,默认是233.0.0.1
function SetMulticastPort(MulticastPort: Integer): HRESULT; stdcall; //设置组播端口
function GetMulticastPort(out MulticastPort: Integer): HRESULT; stdcall; //取得组播端口,默认是12700
function GetLocalIPs(out LocalIPs: PChar): HRESULT; stdcall; //取得本机所有IP地址,每个IP用回车换行符分隔
function SetLocalIP(LocalIP: PChar): HRESULT; stdcall; //设置本机局域网IP
function GetLocalIP(out LocalIP: PChar): HRESULT; stdcall; //取得本机局域网IP,默认是127.0.0.1
function SetUserID(UserID: Integer): HRESULT; stdcall; //设置本发送端用户标识
function GetUserID(out UserID: Integer): HRESULT; stdcall; //取得本发送端用户标识,默认是1000
function SetAppID(AppID: Word): HRESULT; stdcall; //设置应用程序识别码,只有相同识别码的程序能互相识别,处理数据
function SetMajorMediaType(MediaType: Integer): HRESULT; stdcall; //设置本Filter所使用的媒体类型:0-视频;1-音频,默认是0
function GetMajorMediaType(out MediaType: Integer): HRESULT; stdcall; //取得本Filter正使用的媒体类型
function SetTransmissionMode(TransmissionMode: Integer): HRESULT; stdcall;//设置传输模式:0-实时传送;1-传送电影,默认是0
function GetTransmissionMode(out TransmissionMode: Integer): HRESULT; stdcall;//取得当前传输模式
end;
VC++:
DEFINE_GUID(CLSID_KTVSender,
0x32013214, 0x0DB4, 0x4526, 0xB7, 0x0D, 0x5C, 0xD3, 0x6A, 0xB4, 0xB3, 0xEF);
MIDL_INTERFACE("A632B270-30CE-4073-BAD6-8D5779617550")
IKTVSender : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE Authorise(char *Company, char *Code) = 0;//设置授权码
virtual HRESULT STDMETHODCALLTYPE SetMulticastIP(char *MulticastIP) = 0;//设置组IP
virtual HRESULT STDMETHODCALLTYPE GetMulticastIP(/* [out] */ char **MulticastIP) = 0;//取得组IP,默认是233.0.0.1
virtual HRESULT STDMETHODCALLTYPE SetMulticastPort(int MulticastPort) = 0; //设置组播端口
virtual HRESULT STDMETHODCALLTYPE GetMulticastPort(/* [out] */ int *MulticastPort) = 0;//取得组播端口,默认是12700
virtual HRESULT STDMETHODCALLTYPE GetLocalIPs(/* [out] */ char **LocalIPs) = 0; //取得本机所有IP地址,每个IP用回车换行符分隔
virtual HRESULT STDMETHODCALLTYPE SetLocalIP(char *LocalIP) = 0; //设置本机局域网IP
virtual HRESULT STDMETHODCALLTYPE GetLocalIP(/* [out] */ char **LocalIP) = 0;//取得本机局域网IP,默认是127.0.0.1
virtual HRESULT STDMETHODCALLTYPE SetUserID(int UserID) = 0; //设置本发送端用户标识
virtual HRESULT STDMETHODCALLTYPE GetUserID(/* [out] */ int *UserID) = 0;//取得本发送端用户标识,默认是1000
virtual HRESULT STDMETHODCALLTYPE SetAppID(WORD AppID) = 0; //设置应用程序识别码,只有相同识别码的程序能互相识别,处理数据
virtual HRESULT STDMETHODCALLTYPE SetMajorMediaType(int MediaType) = 0; //设置本Filter所使用的媒体类型:0-视频;1-音频
virtual HRESULT STDMETHODCALLTYPE GetMajorMediaType(/*[out]*/ int *MediaType) = 0;//取得本Filter正使用的媒体类型
virtual HRESULT STDMETHODCALLTYPE SetTransmissionMode(int TransmissionMode) = 0;//设置传输模式:0-实时传送;1-传送电影
virtual HRESULT STDMETHODCALLTYPE GetTransmissionMode(/*[out]*/ int *TransmissionMode) = 0;//取得当前传输模式
}
2. KTVSenderII:是一个Transform型的Filter,用于音视频组播,它的下游可连接Renderer进行预览。
Delphi:
CLSID_KTVSenderII: TGUID = '{4A7342C7-686F-4F50-99DA-80FEA29156B4}';
VC++:
DEFINE_GUID(CLSID_KTVSenderII,
0x4A7342C7, 0x686F, 0x4F50, 0x99, 0xDA, 0x80, 0xFE, 0xA2, 0x91, 0x56, 0xB4);
接口Interface使用KTVSender的IKTVSender。
3. KTVReceiver:是一个Source型的Filter,用于音视频接收。
Delphi:
CLSID_KTVReceiver: TGUID = '{5158934A-0ADC-4362-B95F-DE37C16EA5BD}';
IKTVReceiverCB = interface(IUnknown) //接收端的回调接口
['{8080D522-D2D3-4536-B06B-6F0E91D89E42}']
function StartReceive(MediaType, Identifier: Integer): HRESULT; stdcall; //开始接收时执行,MediaType为SetMajorMediaType里的MediaType,Identifier为SetCallback里的Identifier
function StopReceive(MediaType, Identifier: Integer): HRESULT; stdcall; //结束接收时执行
end;
IKTVReceiver = interface(IUnKnown)
['{045187FB-5D03-4DA4-86C5-F4E4F8B5DD73}']
function SetMulticastIP(MulticastIP: PChar): HRESULT; stdcall;
function GetMulticastIP(out MulticastIP: PChar): HRESULT; stdcall;
function SetMulticastPort(MulticastPort: Integer): HRESULT; stdcall;
function GetMulticastPort(out MulticastPort: Integer): HRESULT; stdcall;
function GetLocalIPs(out LocalIPs: PChar): HRESULT; stdcall;
function SetLocalIP(LocalIP: PChar): HRESULT; stdcall;
function GetLocalIP(out LocalIP: PChar): HRESULT; stdcall;
function SetUserID(UserID: Integer): HRESULT; stdcall;
function GetUserID(out UserID: Integer): HRESULT; stdcall;
function SetActive(Active: Bool): HRESULT; stdcall; //设置网络组播接收器状态,Active:TRUE为开始接收,FALSE为停止接收
function GetActive(out Active: Bool): HRESULT; stdcall; //取得网络组播接收器状态
function SetCallback(Callback: IKTVReceiverCB; Identifier: Integer): HRESULT; stdcall; //设置回调接口,可使用回调接口或回调消息的其中一种,看下一个函数
function SetCallbackHandle(CallbackHandle: HWND; Identifier: Integer): HRESULT; stdcall;//设置接收回调消息的句柄,WM_USER + $8001和WM_USER + $8002分别对应StartReceive和StopReceive,WParam和LParam分别对应MediaType和Identifier
function SetAppID(AppID: Word): HRESULT; stdcall;
function SetMajorMediaType(MediaType: Integer): HRESULT; stdcall;
function GetMajorMediaType(out MediaType: Integer): HRESULT; stdcall;
function AdjustSpeed(MS: Integer): HRESULT; stdcall; //用于调整音视频同步
end;
VC++:
MIDL_INTERFACE("8080D522-D2D3-4536-B06B-6F0E91D89E42")
IKTVReceiverCB : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE StartReceive(int MediaType, int Identifier) = 0;//开始接收时执行,MediaType为SetMajorMediaType里的MediaType,Identifier为SetCallback里的Identifier
virtual HRESULT STDMETHODCALLTYPE StopReceive(int MediaType, int Identifier) = 0;//结束接收时执行
}
MIDL_INTERFACE("045187FB-5D03-4DA4-86C5-F4E4F8B5DD73")
IKTVReceiver : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE SetMulticastIP(char *MulticastIP) = 0;//设置组IP
virtual HRESULT STDMETHODCALLTYPE GetMulticastIP(/* [out] */ char **MulticastIP) = 0;//取得组IP,默认是233.0.0.1
virtual HRESULT STDMETHODCALLTYPE SetMulticastPort(int MulticastPort) = 0; //设置组播端口
virtual HRESULT STDMETHODCALLTYPE GetMulticastPort(/* [out] */ int *MulticastPort) = 0;//取得组播端口,默认是12700
virtual HRESULT STDMETHODCALLTYPE GetLocalIPs(/* [out] */ char **LocalIPs) = 0; //取得本机所有IP地址,每个IP用回车换行符分隔
virtual HRESULT STDMETHODCALLTYPE SetLocalIP(char *LocalIP) = 0; //设置本机局域网IP
virtual HRESULT STDMETHODCALLTYPE GetLocalIP(/* [out] */ char **LocalIP) = 0;//取得本机局域网IP,默认是127.0.0.1
virtual HRESULT STDMETHODCALLTYPE SetUserID(int UserID) = 0; //设置本发送端用户标识
virtual HRESULT STDMETHODCALLTYPE GetUserID(/* [out] */ int *UserID) = 0;//取得本发送端用户标识,默认是1000
virtual HRESULT STDMETHODCALLTYPE SetActive(BOOL Active) = 0;//设置网络组播接收器状态,Active:TRUE为开始接收,FALSE为停止接收
virtual HRESULT STDMETHODCALLTYPE GetActive(/* [out] */ BOOL *Active) = 0;//取得网络组播接收器状态
virtual HRESULT STDMETHODCALLTYPE SetCallback(IKTVReceiverCB Callback, int Identifier) = 0;//设置回调接口,可使用回调接口或回调消息的其中一种,看下一个函数
virtual HRESULT STDMETHODCALLTYPE SetCallbackHandle(HWND CallbackHandle, int Identifier) = 0;//设置接收回调消息的句柄,WM_USER + $8001和WM_USER + $8002分别对应StartReceive和StopReceive,WParam和LParam分别对应MediaType和Identifier
virtual HRESULT STDMETHODCALLTYPE SetAppID(WORD AppID) = 0; //设置应用程序识别码,只有相同识别码的程序能互相识别,处理数据
virtual HRESULT STDMETHODCALLTYPE SetMajorMediaType(int MediaType) = 0; //设置本Filter所使用的媒体类型:0-视频;1-音频
virtual HRESULT STDMETHODCALLTYPE GetMajorMediaType(/*[out]*/ int *MediaType) = 0;//取得本Filter正使用的媒体类型
virtual HRESULT STDMETHODCALLTYPE AdjustSpeed(int MS) = 0;//用于调整音视频同步
}
二、简要说明:
1. 注册Filter:
使用KTVideo.ax前请先用压缩包里的Reg.bat对其进行注册,注册后在DirectShow Filters里会出现
KTVSender Filter、KTVSenderII Filter及KTVReceiver Filter三个Filter。
2. 在GraphEdit里测试:
a. 参考图1.jpg,先在FilterGraph中放置摄像头视频源Filter、DIVX视频压缩Filter、声卡音频源
Filter、GSM610音频压缩Filter,然后再放两个KTVSender Filter,打开它们的属性窗口,分别设置
Major Media Type为一个用于Video,一个用于Audio;设置完成后分别把他们按图连起来;
b. 参考图2.jpg,在当前FilterGraph中放置两个KTVReceiver Filter,并分别设置它们的Major Media
Type为一个用于Video,一个用于Audio,然后再次打开两个KTVSender的属性窗口(见图1.jpg),分别
点击窗口上的“Broadcast current MediaType”按钮,这样就把两个KTVSender当前的媒体格式分别发
送到两个KTVReceiver里了;最后分别Render两个KTVReceiver的输出脚。
c. 完成后的FilterGraph见图3.jpg,这时就可以点Run按钮运行FilterGraph了。
需要说明的是,KTVReceiver在FilterGraph里被创建时其内部的网络组播接收器是处于接收状态的,任
何改变MulticastIP, LocallIP, MulticastPort, UserID都不会影响其当前状态, 除非使用SetActive来
改变。用于Video时其默认的媒体格式是XVID 320x240 24bits,用于Audio时其默认媒体格式是PCM8K16bit。
而现在接收的是使用DIVX来压缩的视频和使用GSM来压缩的音频,与其默认的媒体格式不同,所以KTVReceiver
就需要重新获取当前接收的音视频的格式。在KTVReceiver重新获取视频格式后,就可以Render其输出脚了。
F*.jpg是一组用于组播AVI电影的FilterGraph,其中F.jpg是使用KTVSender做发送,而FII.jpg则是使用
KTVSenderII做发送,FP.jpg是接收的FilterGraph,里面的两个KTVReceiver所使用的媒体格式也是需要
F.jpg或FII.jpg里的KTVSender和KTVSenderII传送过来,另外需要把Transmission Mode设为“Transmit
Media File”。
3. 编程:
编程的时候是不需要象在GraphEdit里测试时点“Broadcast current MediaType”按钮那样的做法的。
因为KTVReceiver提供了一个回调接口,正是这个接口实现了对KTVReceiver的自动控制,而控制信息是来
自KTVSender的。KTVSender的每次媒体格式的变化都会通知KTVReceiver,触发执行回调接口的StartReceive
和StopReceive两个函数,应用程序就可以在接收到发送端媒体格式变化的信息时重新获取和连接所需的
Filter,并重新运行FilterGraph。其实回调接口也可以用回调消息来实现,如果设置了接收消息的句柄,
当发送端媒体格式变化时会发送消息,应用程序在消息处理程序里重新获取和连接所需的Filter,并重新
运行FilterGraph。从AppSource里的例子就可以看出,接收Recv是不需要做任何人为控制的(除了网络参
数),而发送Send端的视频源却可以是摄像头或者电影(AVI,ASF,WMV,MPG,MPEG等等,有些可能不行或效果
不好哦~~)。AppSource里的程序需要DSPACK2.34支持,编译前请先安装。
另外,为了能实现上述自动控制,建议接收音频和视频的KTVReceiver放在不同的FilterGraph里,以便
在回调函数中能根据MeidaType和Identifier参数分别对音频和视频的FilterGraph进行控制。
4. 视频会议演示程序:
Conference目录下有两个简单的4人视频会议的演示程序,这两个程序就是使用这个Filter所写,其中
ConfDemo.exe的电影传送使用KTVSender过滤器,而ConfDemoII.exe的电影传送则使用KTVSenderII过滤
器,因此传送的电影可以在本地预览。测试时可以在局域网的4台不同的机器上运行,先对应设好4个用
户的ID,1001至1004,并选择好本机所在的局域网IP地址,点“实时传送”按钮后,所有在“远程”页
里选择了该用户ID的视频就能收到和显示了(双击各视频可切换到全屏模式),也能听到传来的麦克风的
声音,本程序的实时传送的视频使用XVID作为压缩器,因此运行前需安装XVID;点“电影传送”按钮并
选择电影文件后,电影的音视频就会组播出去,其它用户就会收看到了,但由于音视频是分开传送的,
没有很好地实现同步,所以音视频一般同步不好,这时可以在接收到音视频后根据视频是超前或落后于
音频的情况,通过点击数次“视频过快”或“视频过慢”两个按钮来调整,也能达到比较理想的同步效
果:)。
三、不得不说的问题:
由于视频是从关键帧开始解码并显示的(忽略所有关键帧以前的帧),任何从中途切换进去接收的视频都
需要等到下一个关键帧的到来才能显示,因此,有人就误认为视频在如此快的局域网传送也要那么久才到
达,说你的程序是如此的不同步。其实,接收端在极短的时间内就已经收到视频,但由于首先收到的不是
关键帧,只能丢弃,至于说同步,应该说是混淆了概念。他们说的同步是指发送端一发送,接收端立刻就
显示出来这才叫“同步”,其实真正的同步是指发送端和接收端在正常显示出图像后,图像里运动的人或
物的动作是否同时展现。
要解决延迟显示的问题,只需把视频压缩器的关键帧间隔调小一些就可以了,但这会带来网络传输数据
量的增加,自己衡量吧。
暂时先介绍到这吧~~^_^
QQ:93202767(网上飘)
近期下载者:
相关文件:
收藏者: