⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 一个很不错的代码
💻 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 + -