最近使用H323Plus,以前从未接触过,网上有些许资料,但是对于从0开始学习H323Plus的人理解有些困难,我作为初学者,在此介绍从编译到Demo实现简单文字,音频,视频聊天的方法,供初学者借鉴,关于原理,结构等请参考网上其他资料。
- 编译
- 环境变量
- simple编译运行
- 视频编码插件
- simple视频聊天
编译
下载PTLib和H.323 Plus Core,官方网站很容易下载:http://www.h323plus.org/source/。
我下载这两个库后存放到目录/home/zht/h323plus/下,文件夹名分别为ptlib和h323core,下面是初步的编译命令:
$cd h323plus/ptlib
$./configure --prefix=$HOME/usr
$make && make install
在编译h323core之前,需要添加一个环境变量:
export PKG_CONFIG_PATH=$HOME/usr/lib/pkgconfig
然后进行h323core的编译:
$cd ~/h323plus/h323core
$./configure --prefix=$HOME/usr
$make && make install
我编译的版本中,h323core的make步骤有个问题,出现下面的错误:
/home/zht/h323plus/h323core/openh323u.mak:67: /home/zht/usr/make/ptbuildopts.mak: No such file or directory
/home/zht/h323plus/h323core/openh323u.mak:96: /home/zht/usr/make/ptlib.mak: No such file or directory
make: *** No rule to make target `/home/zht/usr/make/ptlib.mak'. Stop.
我的方法是修改openh323u.mak文件中的PTLIBDIR=/home/zht/usr为PTLIBDIR=/home/zht/h323plus/ptlib,这种方法虽然不一定标准,但是编译对结果确实没有问题。我尝试将ptlib.mak拷贝到/home/zht/usr下,但是后面对编译仍然有问题,所以使用了这种方法。这个错误可能是我代码对原因,如遇到可照此解决,如未遇到忽略即可。
环境变量
算上在编译h323core之前添加的一个环境,.bash_profile下面应该有如下环境变量,程序可正常运行:
export PKG_CONFIG_PATH=$HOME/usr/lib/pkgconfig
export OPENH323DIR=$HOME/h323plus/h323core
export PTLIBDIR=$HOME/h323plus/ptlib
export LD_LIBRARY_PATH=$HOME/usr/lib
simple编译运行
此时可以编译h323core下的一个示例程序:
$cd ~/h323plus/h323core/samples/simple
$make
运行需要找两台linux机器,分别运行命令:
服务端: $./obj_linux_x86_64/simph323 -n -l -v FakeVideo
客户端: $./obj_linux_x86_64/simph323 -n 服务端IP地址 -v FakeVideo
此时输入内容回车可以在对端显示,由于此示例必须有视频支持,所以在命令中加了假的视频-v FakeVideo。如果linux的音频和麦克可以正常使用,使用下面的命令可以进行音频通话:
服务端: $./obj_linux_x86_64/simph323 -n -l -v FakeVideo -s Default
客户端: $./obj_linux_x86_64/simph323 -n 服务端IP地址 -v FakeVideo -s Default
视频编码插件
研究h323plus的代码不难发现,代码中有大量plugin相关文件,我开始也总是找不到视频编码相关的内容,原来需要单独编译插件,然后放到相应目录。
$cd ~/h323plus/h323core/plugins/
$./configure
$make
按照默认编译了H261编码的插件,将h261-vic_video_pwplugin.so放在/home/zht/usr/lib/ptlib-2.12.8/目录下的子文件夹下,simple启动时会自动检索该目录下所有编码插件,看其目录结构可知,最好放在其下的devices/videoinput下,这下面都是视频相关的编码插件。这时候启动,能力列表会增加H.261-CIF{sw} <3>这个能力。simple程序中的OpenVideoChannel函数才有执行的可能性。
simple视频聊天
接下来就是开始视频聊天功能,关键处理就在SimpleH323EndPoint::OpenVideoChannel中,经过各种尝试,总结后进行如下3个修改即可打开视频设备开始向对端发送视频数据:
1)将Open放到设置格式以前
2)将设置对SetFrameSize修改为SetFrameSizeConverter
3)添加Start方法,此3步经过修改后如下:
if (!device->Open(deviceName, TRUE)) {
PTRACE(1, "Failed to open the video device \"" << deviceName << '"');
return FALSE;
}
if (!device->SetFrameSizeConverter(codec.GetWidth(), codec.GetHeight()) ||
!device->SetFrameRate(codec.GetFrameRate()) ||
!device->SetColourFormatConverter("YUV420P")) {
PTRACE(1, "Failed to configure the video device \"" << deviceName << '"');
return FALSE;
}
if (!device->Start()) {
PTRACE(1, "Failed to open the video device \"" << deviceName << '"');
cout<<"41"<<endl;
return FALSE;
}
修改完成后,编译simple,使用下面的命令运行:
服务端: $./obj_linux_x86_64/simph323 -n -l -v V4L2 -s Default
客户端: $./obj_linux_x86_64/simph323 -n 服务端IP地址 -v V4L2 -s Default
此时摄像头是开启的,但是接收端并没有效果,是因为视频的输出设备没有,又是一段时间苦找,并且结合网上简单对拾取摄像头然后显示对例子,发现了SDL对用途,并且在ptlib中就有关于SDL的使用,于是返回头去重新编译ptlib,前提是linux系统安装了SDL的支持,可以使用yum install命令安装SDL.x86_64,SDL-devel.x86_64。ptlib和h323core并不需要全部重新编译,重新configure配置ptlib,添加SDL支持,然后make && make install即可。
$cd ~/h323plus/ptlib/
$./configure --prefix=$HOME/usr --enable-SDL
$make && make install
$cd ~/h323plus/h323core/
$rm lib/libh323_x86_64_*
$make && make install
代码中需要添加头文件:
#include <ptclib/vsdl.h>
然后如果是接收视频数据时,将device重新赋值:
PVideoDevice * device = isEncoding ? (PVideoDevice *)PVideoInputDevice::CreateDeviceByName(deviceName)
: (PVideoDevice *)PVideoOutputDevice::CreateDeviceByName(deviceName);
if(!isEncoding){
PVideoOutputDevice_SDL *vfile = new PVideoOutputDevice_SDL();
device = (PVideoDevice *)vfile;
}
重新编译运行,但命令改为如下:
服务端: $./obj_linux_x86_64/simph323 -n -l -v V4L2 -s Default
客户端: $./obj_linux_x86_64/simph323 -n 服务端IP地址 -v V4L2 -s Default
即可显示视频。
本文经过实践后,总结所写,难免有没遇到的情况发生,但是总体方法应该无误,希望能给研究h323plus的新手有所帮助。经过改写的simple在优快云资源http://download.youkuaiyun.com/detail/carl_cheer/8664131