📄 readme.txt
字号:
视频组播过滤器KTVideo.ax
一、KTVideo.ax包括视频发送KTVSender及视频接收KTVReceiver两个Filter,其接口如下:
1. KTVSender
CLSID_KTVSender: TGUID = '{32013214-0DB4-4526-B70D-5CD36AB4B3EF}';
IKTVSender = interface(IUnKnown)
['{A632B270-30CE-4073-BAD6-8D5779617550}']
function SetMulticastIP(MulticastIP: PChar): HRESULT; stdcall; //设置组IP
function GetMulticastIP(out MulticastIP: PChar): HRESULT; stdcall; //取得组IP,默认是233.0.0.1
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 SetMulticastPort(MulticastPort: Integer): HRESULT; stdcall; //设置组播端口
function GetMulticastPort(out MulticastPort: Integer): HRESULT; stdcall; //取得组播端口,默认是12700
function SetUserID(UserID: Integer): HRESULT; stdcall; //设置本发送端用户标识
function GetUserID(out UserID: Integer): HRESULT; stdcall; //取得本发送端用户标识,默认是1000
function Authorise(Company, Code: PChar): HRESULT; stdcall; //设置授权码
end;
2. KTVReceiver
CLSID_KTVReceiver: TGUID = '{5158934A-0ADC-4362-B95F-DE37C16EA5BD}';
IKTVReceiverCB = interface(IUnknown) //接收端的回调接口
['{8080D522-D2D3-4536-B06B-6F0E91D89E42}']
function StartReceive(Identifier: Integer): HRESULT; stdcall; //开始接收时执行,Identifier为SetCallback里的Identifier
function StopReceive(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 GetLocalIPs(out LocalIPs: PChar): HRESULT; stdcall;
function SetLocalIP(LocalIP: PChar): HRESULT; stdcall;
function GetLocalIP(out LocalIP: PChar): HRESULT; stdcall;
function SetMulticastPort(MulticastPort: Integer): HRESULT; stdcall;
function GetMulticastPort(out MulticastPort: Integer): 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; //设置回调接口
end;
二、说明:
1. 注册Filter:
使用KTVideo.ax前请先用压缩包里的Reg.bat对其进行注册,注册后在DirectShow Filters里会出现
KTVSender Filter及KTVReceiver Filter两个Filter。
2. 在GraphEdit里测试:
先按图FilterGraph1.jpg构建一个发送程序,并把KTVReceiver Filter也加进去,然后打开KTVSender
Filter的属性窗口,再点上面的“Broadcast current MediaType”按钮,这样就把KTVSender当前的媒体
格式发送到KTVReceiver里了。
需要说明的是,KTVReceiver在FilterGraph里被创建时其内部的网络组播接收器是处于接收状态的,任
何改变MulticastIP, LocallIP, MulticastPort, UserID都不会影响其当前状态, 除非使用SetActive来
改变,同时其默认的媒体格式是XVID 320x240 24bits。而现在使用的是DIVX来进行视频压缩,与其默认的
媒体格式不同,所以KTVReceiver就需要重新获取当前接收的视频的格式。
在KTVReceiver重新获取视频格式后,就可以Render其输出脚了,见图FilterGraph2.jpg。这时就可以运
行这个Graph了。
3. 编程:
编程的时候是不需要象在GraphEdit里测试那样的做法的。因为KTVReceiver提供了一个回调接口,正是
这个接口实现了对KTVReceiver的自动控制,而控制信息是来自KTVSender的。KTVSender的每次媒体格式的
变化都会通知KTVReceiver,触发执行回调接口的StartReceive和StopReceive两个函数,应用程序就可以
在接收到发送端媒体格式的变化时重新获取和连接所需的Filter,并重新运行FilterGraph。从AppSource
里的例子就可以看出,接收Recv是不需要做任何人为控制的(除了网络参数),而发送Send端的视频源却可
以是摄像头或者电影(AVI,ASF,WMV等等,有些可能不行或效果不好哦~~)。AppSource里的程序需要DSPACK
2.34支持,编译前请先安装。
4. 视频会议视频部分:
Conference目录下有一个简单的4人视频会议的演示程序,这个程序就是使用这个Filter所写。测试时可
以在局域网的4台不同的机器上运行,先对应设好4个用户的ID,1001至1004,并选择好本机所在的局域网
IP地址,点“传送”按钮后,所有在“远程”页里选择了该用户ID的视频就能收到和显示了。这个程序使
用XVID作为压缩器,因此运行前需安装XVID。
三、不得不说的问题:
由于视频是从关键帧开始解码并显示的(忽略所有关键帧以前的帧),任何从中途切换进去接收的视频都
需要等到下一个关键帧的到来才能显示,因此,有人就误认为视频在如此快的局域网传送也要那么久才到
达,说你的程序是如此的不同步。其实,接收端在极短的时间内就已经收到视频,但由于首先收到的不是
关键帧,只能丢弃,至于说同步,应该说是混淆了概念。他们说的同步是指发送端一发送,接收端立刻就
显示出来这才叫“同步”,其实真正的同步是指发送端和接收端在正常显示出图像后,图像里运动的人和
物的动作是否同时展现。
要解决延迟显示的问题,只需把视频压缩器的关键帧间隔调小一些就可以了,但这会带来网络传输数据
量的增加,自己衡量吧。
暂时先说到这吧~~^_^
QQ:93202767(网上飘)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -