OpenCV温故而知新: 人脸检测

应用场景

人脸侦测的应用非常广泛,但真正意义上来说,检测出人脸在日常生活中的意义并不是那么大(只有在诸如相机之类的应用中才被广泛应用),而从未来来讲,主要的方向将是人脸识别,即通过人脸图像识别出这个人是谁,但是这个难度就有点高了(我有找到过一个算法可以识别人,但准确度相当差),但要是做出来那必然前途无量(Facebook已经实现在这个功能,但目前仍在试用中),试想,现在的搜索都是文字搜索,未来必然将逐步发展到图像搜索,甚至视频搜索,那将会是怎样的一个世界???好了,不啰嗦了,呵呵。

工作原理

利用haar like来实现。利用haarcascade来进行计算检测(程序附带一个haarcascade_frontalface_alt.xml)。

补充说明

本算法在OpenCV的自带示例里有完整代码,你完全可以参考该代码进行学习和修改。

以下是接口说明。 Continue reading “OpenCV温故而知新: 人脸检测”

OpenCV温故而知新: 入侵侦测

应用场景

入侵侦测通常可被广泛用于诸如禁行区域的非法进入,如:私家住宅、限制区域、军事区的非法进入等情景。检测对象为人物。

工作原理

预先设置一条线性区域,然后在该区域内检测移动人物,看是否有人物穿越。

补充说明

本算法容易受到穿越人物大小及穿越角度的影响,人体大小参数可设,但若是设置过大容易检测不到小物体,设置过小,则容易误报。通常需配合警报录像来工作,以实现实时的检测和事后的排查及过滤。注意:镜头视野(焦距)的大小也会影响检测的准确度。

使用者操作:
1.在视窗点选实体围墙的上面两角(顺序:左→右)
2.调整Threshold的大小:如果产生的FG杂讯太多,此时可以试着调高Threshold
3.调整pattern的大小:尽量让蓝色框包含整个人形

影片场景预设:
1.实体围墙,墙高至少要到成年人肩膀以上
2.摄影机的拍摄角度和围墙的法向量夹角不能超过45度以上
3.摄影机架设的高度约2.5公尺至3.5公尺左右
4.调整实体围墙分隔线最好是在画面1/2处左右

Continue reading “OpenCV温故而知新: 入侵侦测”

OpenCV温故而知新: 异常对象侦测

这个异常对象侦测通常可被广泛用于诸如银行ATM机上的非法广告张贴等情景,但是同其他的一些算法一样,容易受到一些客观条件的干扰,如:灯光、光线,物体形状,物体大小等等,我们可以对这些参数做设置和配置,但是在各种不同的情景和场景下,仍然有比较大的误报可能性。

同时考虑到可能的误报,侦测背景也是做成了逐渐腐蚀渗透,即,一旦发生报警,而没有人去处理(可能是误报),就直接将该区域混合到计算背景中,以期在最大程度上降低误报的可能性(如:因白天的光亮度和晚上光亮度不一样而导致的整体误报)。 Continue reading “OpenCV温故而知新: 异常对象侦测”

OpenCV温故而知新: 人流统计

应用场景

人流统计主要被广泛应用于一些商场,或者步行街等与人流相关的商业活动场所,这也是以人流来评价一个地方(或者是在一定时间内)的商业价值的一个重要手段。除这个人流统计之外,其实还有一个类似的算法是车流统计,车流统计主要用于高速公路或者马路。但从算法实现、技术角度来讲,这二者其实并没有太大的差别。

补充说明

本算法在OpenCV的自带示例里有完整代码,你完全可以参考该代码进行学习和修改。 Continue reading “OpenCV温故而知新: 人流统计”

OpenCV温故而知新: 遺失物偵測

函式功能规格

全域类别说明:

class CLostDetect{

private:

int         nAlarmFlag         ;                    //警告之flag

int         nWidth, nHeight ;                    //Frame之宽高

int         nAlarmTimer              ;                    //警告时间

 

bool      bEgdeDen           ;                    //edge density的变数

bool      bObjectSetted            ;                    //侦测物是否设定

int         nHdims               ;                    //Histogram维度变数

float      pHranges_arr[2]  ;                    //Histogram范围大小

float      *pHranges           ;

CvRect cvRectObjectWinodw       ;             //设定选取对象之框的变量

CvHistogram *pRHist                   ;             //计算R & G & B之histogram

CvHistogram *pGHist                    ;

CvHistogram *pBHist                    ;

IplImage *pCurFrame                            ;     //input image

IplImage *pGray                             ;      //color to gray

IplImage *pEdge                                 ;      //edge image

IplImage *pObjectImageModel            ;      //for rotate 0

IplImage *pObjectImageModel1          ;      //for rotate 15 degree

IplImage *pObjectImageModelMinus1       ;      //for rotate-15 degree

public:

CLostDetect(int width, int height, int alarmerTimer);                            //建构子

~CLostDetect();                                                                        //解构子

bool Reset() { bObjectSetted = false; return true;};                  //把bObjectSetted设为false

bool SetImage(BYTE* pImageArray);                                             //承接AP所传入的变量型态

bool SetImage(IplImage *pImage);                                           //whole algorithm

bool SetObject(IplImage *pImage, int x, int y, int width, int height);

//设定object model

int   GetObjectState();                                                               //计算edge density

bool Alarm() {return (nAlarmFlag>nAlarmTimer); };               //send alarm message

};

成员函式说明:

CLostDetect::CLostDetect(int width, int height, int nSeconds=5){

Purpose: initial all variables we’ll use the program

Usage: set all variable will use.

Parameter:

Parameter

Type

Description

width

int

the width of frame

height

int

the height of frame

nSeconds

int

alarm time set to 5

}

CLostDetect::~CLostDetect(){

Purpose: release variables

release all image variables

release both Hist variables

}

bool CLostDetect::SetImage(BYTE* pImageArray){

Purpose: Succeed to AP’s package to IplImage data type variable.

Usage: While webcam give image data into the program, check it data type.

Parameter:

Parameter

Type

Description

pImageArray BYTE Succeed input data type

Return:

True, if success

False, otherwise

}

bool CLostDetect::SetImage(IplImage *pImage){

Purpose: detect whether the lost happened.

Usage: While AP given the right data type, starting the algorithm of detection

Parameter:

Parameter

Type

Description

PImage IplImage If the input data is not NULL, starting to go the process

Return:

True, if success

False, otherwise

}

bool CLostDetect::SetObject(IplImage *pImage, int x, int y, int width, int height){

Purpose: set the object model.

Usage: given image frame, object position, width and height, return bool variable.

Parameter:

Parameter

Type

Description

pImage

IplImage

input image variable

x

int

Position of x

y

int

Position of y

width

int

Width of frame

height

int

Height of frame

Return:

True, if success

False, otherwise

}

int CLostDetect::GetObjectState(){

Purpose: After setting object model, quantify the object model edge density.

Usage: compute the edge density of object model.

Return:

0 when the procedure finished

}

测试程序及序列

测试程序: http://rg4.net/p/easyiv/liblostdetect_test.7z。测试程序快捷键:按r重新设定ROI检测区域,按p暂停处理,按t中止。

测试视频序列:http://rg4.net/p/easyiv/liblostdetect_sample.7z

 

OpenCV温故而知新: 画面遮蔽功能实现

应用场景

画面遮蔽侦测主要应用于一些强制性开放的视频地点,如:煤矿矿产区,或者是一些特定的娱乐场所,这些视频在一些时候通常是要作为“现场证据”来呈现的,而有人的却可能由于各种原因,不想让视频给录下来…这个模块的目标就是检测出画面遮蔽,并告警通知相关人员去进行必要的处理。

工作原理

先将视频进行灰度处理,然后进行背景、前景差检测画面的差异,并检测差异部分是否是大片连续的,若是则认为画面被遮蔽。

补充说明

由于本算法对其应用场景有一定的特殊要求,若是放到不太合适的地方容易出现许多误报的状况。

以下是接口说明。

函式功能规格说明

全域类别说明

class CMaliciousDetect{

private:

bool bAlarmFlag;                                   //发出警告的bool variable

int nAlarmTimer;                             //警告时间

int nWidth, nHeight;                       //Frame之宽高

bool IsSetted;                                         //background是否设定变量

IplImage *Frame;                                   //input image

IplImage *Gray;                             //把input image转换成gray level

IplImage *C_edge;                       // The edge value image

IplImage *BG_edge;

IplImage *_small;                                //resize C_edge to _small

IplImage *BG_small;                            //       BG_edge to _small

CvHistogram *BG_hist,*C_hist;          //计算histogram for 变量BG_hist & C_hist

int hist_size ;                                         //设histogram之纵轴范围

CvScalar  num1 , num2 ;                     //计算BG_small&_small的edge value

int WCount;                                          //出现warning的时间变量

int OCount;                                     //发生状况一的遮蔽,计算秒数的变量

int ECount;                                     //发生状况二的遮蔽,计算秒数的变量

int HCount;                                     //发生状况三的遮蔽,计算秒数的变变

int H_HT ;                                       //histogram high and low threshold

int H_LT ;

double HistDiff;                                   //the difference of BG_hist & C_hist

public:

CMaliciousDetect( int nImageWidth, int nImageHeight, int nSeconds );  //建构子

~CMaliciousDetect();                                                                        //解构子

bool SetImage(BYTE *pImageArray);  //由AP承接image package

bool SetImage(IplImage *pImage);       //Whole algorithm

bool Alarm() {return bAlarmFlag;};      //send the alarm information

void ResetSystem() {IsSetted = false;};//判断是否已经设定background

};

成员函式说明:

CMaliciousDetect::CMaliciousDetect(int nImageWidth, int nImageHeight, int nSeconds){

Purpose:initial image variables and Hist variables.

Usage :set all variable will use.

Parameter:

Parameter Type Description
nImageWidth int the width of frame
nImageHeight int the height of frame
nSeconds int alarm time

}

CMaliciousDetect::~CMaliciousDetect(){

Purpose:release variables

release all image variables

release both Hist variables

}

bool CMaliciousDetect::SetImage(BYTE* pImageArray){

Purpose: Succeed to AP’s package.

Usage: While webcam give image data into the program, check it data type.

Parameter:

Parameter

Type

Description

pImageArray BYTE input data type

Return:

True, if success

False, otherwise

}

bool CMaliciousDetect::SetImage(IplImage *pImage){

Purpose: detect whether the occlusion happened.

Usage: While AP given the right data type, starting the algorithm of detection

Parameter

Parameter

Type

Description

PImage IplImage If the input data is not NULL, starting to go the process

Return:

True, if success

False, otherwise

}

测试程序及序列

测试程序: http://rg4.net/p/easyiv/libmaliciousdetect_test.7z

测试视频序列:http://rg4.net/p/easyiv/libmaliciousdetect_sample.7z

Code review: Using Haarcascade to implement “passenger flow statistics”.

Using haarcascade_frontalface_alt to implement “passenger flow statistics”.

The detail flow chart of the major implementation

passenger flow statistics
passenger flow statistics flow chart

Sample test program:http://rg4.net/p/easyiv/passenger_flow_statistics.7z

Sample video: http://rg4.net/p/easyiv/passenger_flow_statistics.avi

BTW: This video file is temporary unavailable due to the my blog’s space limitation, I’m looking for a hosting with larger hard disk space and fair price.

EzStreamSvr version update

This version is rebuilt by using the source code recovered from the backup svn repository(I’d encountered with a hard disk collapse a year ago, and lost almost all my data). This means this version has some known bugs, and some new features once EzStreamSvr had are no more supported. But I will try re-code for it if I can recall. EzStreamSvr had not been maintained for at least over one year(Either some other windows applications provided by RG4.NET), because I don’t have the time, but now I quitted my job, so I have plenties of free times before I go to the new company, I wish I can make some improvement for these applications, including the open-source project EasyRTMP.

Back to the agenda, the known change about this version of EzStreamSvr is only I removed the license module from EzStreamSvr, so you can use this version as long as you want.

But please do help me to improve it if you are using it, mail me if you find any bugs, tell me if you believe that there’s anything wrong.

EasyRTMP开源了

经过两周的投票,最终的结果是EasyRTMPRTSPPlayer的人气高一点,十一后又加了两天,结果EasyRTMP拔了头,坦白说,这个结果是让我有点失望的,因为无论是技术上讲,还是从实用程度上来说,这两个明显不是最能“引导流媒体潮流”的东西,尤其是EasyRTMP更甚。

而从另一个角度来看,流媒体开发论坛上这么多人,流媒体开发群里有那么数百个人,这个投票搞了将近两个星期也就这么三十几个人,如此看来真正对开源项目感兴趣的人还真少,更别提会去做开源项目了。

罢了。 Continue reading “EasyRTMP开源了”

准备做一件有意义的事情:启动一个开源项目

马上十一了,又将有几天空,我在想要不要把我做过的一些东西整理一下,做成一个开源项目,以活跃QQ群和论坛。
但不知道有没有人兴趣。

先把几个选项放出来,如果感兴趣的人多,我就做,实在没有人感兴趣,那我就。。。自己玩吧。

现已经发了一个投票,希望大家踊跃投票。

投票地址:http://bbs.rosoo.net/thread-14364-1-1.html

以下是上面有写名字的几个软件的介绍及下载地址:

  • RTSPPlayer: RTSP/RTP流媒体播放器,可以支持Windows,Linux,Android,iOS(目前只有做Linux和Android版),目标是做成一个ONVIF播放器。http://rg4.net/p/rtspplayer
  • EasyPlayer: 一个基于ffmpeg的全格式播放器,支持Windows/Linux/Android,但每个版本都不怎么一样,Windows/Linux的网上太多了,Android上的也不少,但真正能跑的开源播放器很少,所以,优先Android上的版本。http://rg4.net/p/easyplayer
  • EasyRTMP: 将普通的视频文件,或者是来自网络的(如:Youku, IP Camera, DVR, DVS)视频转换成rtmp流,并喂给FMS/Red5,使你的客户端不需要安装任何插件即可浏览这些视频(条件是有Flash支持), http://rg4.net/p/easyrtmp
  • EzStreamSvr: 基本功能类似于EasyIPCam,不同的是 EasyIPCam是小型应用,并且视频是采集上来的,而EzStreamSvr的目标是大型流媒体服务器,而且视频源同EasyRTMP,可以是任意来 源的视频,包括普通视频文件(全格式),以及网络上能访问到的任意视频, http://rg4.net/p/ezstreamsvr

同时,上面这些软件都只是一些实验室的作品,未经严格测试,许多功能也有待进一步的完善,所以,我希望许多习惯潜水的大牛们也能出来一起帮我完善,而不是我一个人在傻干。

当然,如果你其他好的项目,也可以在此留言,若是的确不错,而且也是我力所能及范围以内的,也可以立项来做。

4D影院播放控制系统大手术

由于原来的ffmpeg + SDL版本存在一些问题,最近4D影院播放控制系统进行了一个大手术。现已基本完成,欢迎大家试用。

之前的版本是用ffmpeg + SDL来实现的播放器,然而ffmpeg并不支持Intel的 Indeo Video 5(IV5)的编码格式(许多4D影片都是这种编码格式的),并且,自己在手动控制一些时间戳存在问题的视频格式时也容易出来播放同步上的问题(在不同电 脑上的表现不一样),因此,我又花了大力气改了一版基于VLC的播放器,以实现这个4D影院播放控制系统。
不过,这个版本仍未实现控制命令协议的编辑(仍然需要自己手动的去更改excel中的控制命令/协议)。
注:
修改后的整个软件变得非常大,达到64M之多,而我的网站是放在国外的,国内连接下载速度有限,因此,我有同时在360云盘里放了一份copy,您也可以直接到那儿下载:http://yunpan.cn/lk/22gseek1ll

4D影院相关资料收藏

前两天深圳的林工反馈回来说4D影院控制系统在不同的电脑上会出现播放速度不同的问题。现初步断定为CPU利用率的原因所致。目前正在努力解决中。同时,又让我回来看了一下4D影院的介绍。摘录如下。

介绍
4D影院是从传统的立体影院基础上发展而来,相比较于其他类型影院,具有主题突出、科技含量高、效果逼真、画面冲击性强等特点和优势。随着影娱乐技 术的发展和娱乐市场的需求,人们不仅将震动、坠落、吹风、喷水等特技引入3D影院,还根据影片的情景精心设计出雨、光电、气泡等效果,形成了一种独特的 体验,这就是当今十分流行的4D影院。由于观众在观看4D影片时能够获得视觉、听觉、触觉、嗅觉等全方位感受,近年来4D影院的发展非常迅猛。
(一)4D 影院的银幕结构: 从视觉角度讲,采用180度的柱面环幕立体影像——它是指银幕保持在有相同圆心的一段弧度上,而不是一个平面(平幕)上。银幕的高宽比例为16 :9,柱面环幕3D物体运动影视范围大为扩展、开阔视野,摆脱了平面视觉束缚,使影视空间和现实空间更为接近,并且可以产生横越、环绕等多种运动方式,从 而产生时空变换的感觉。(区别于“平面四维影视”——限制了观众的视觉角度,也限制了物体的运动方向。)
(二)、偏振光眼镜 针对柱面画面效果的需要,专门设计和制造了适合于观看柱面电影的柱面偏振光眼镜(即“立体眼镜”)。使观众看到的影片左眼和右眼的图像不同,这样反映到人脑中的影像就是3D影像,从而创造置身其中的立体视觉空间。
(三)、 4D特技座椅 座椅根据影片的故事情节包含由计算机控制做出五种特技效果:分别是坠落、震动、喷风、喷水、拍腿。另再配以精心设计出雨、光电、气泡、等等引入3D影视, 从而调动了人的所有感知系统,使人真正走进影片情节。由于在四维影视中的电影情节结合了以上的特技效果,将观众与现场感受紧密地结合在一起,所以观众在观 看4D影片时能够获得视觉、听觉、触觉、嗅觉等全方位的感受,体验身临其境、如梦如幻的感受。形成了一种独特的表演方式,这就是当今世界十分流行的4D影 院。通过这一系列的技术改进和革新,四维影视已经突破了传统意义中电影是光影艺术的概念,是全新的、真正的高科技产品。
(四)、数字音响系统: 采用高品质声音效果素材——多声道环绕声系统作为影院的音响系统。提供6.1甚至7.1声道系统从而增强环境声音效果。4D影院的多声道环绕声系统在设计 和制作时充分考虑到柱面4D影院能够使3D物体产生环绕运动的特点,可以精确的对运动物体进行定位,使4D影院的声音也立体起来,形成真实的立体空间感。

(五). 计算机控制系统: 上述各种要件都具备了之后,怎样才能使它们有机、有序的发挥自己的作用呢?这就需要针对不同影片内容专门设计的计算机控制系统来发挥功能了,控制系统的核 心是控制软件,程序工程师根据影片的内容,在准确的时间点设定命令,用以控制放映系统、特效座椅、特效设备、音响系统等的开关,使整个4D影院系统构成一 个有机的整体,为观众提供全方位的感官体验。

不管是4D立体电影的8个特效(喷气 扫腿气泡 雪花 闪电 吹风 喷水 喷雾)一样不少,就连特效4D立体电影动感坐椅也可180度三自由度摇摆。

以下是在网上看到的一个与我做的这个4D影院控制系统相类似的产品的说明

4D电影播放器 4D影片控制软件 动作编辑器

深圳市精敏数字机器有限公司做为国内工业级智能4控制领域的标杆性企业,是国内3D、4D、5D、6D影院核心控制系统最专业的研发商、提供商,为国内80%以上的4D影院设备提供商/集成商/经营者提供了定制化的4D影院控制软件:编辑软件和播放器。
深 圳市精敏数字机器有限公司是国内工业级高可靠智能控制领域领导者、单片机工控板创始者,工业级微控制自主研发商、生产制造商、控制系统方案提供商,具备硬 件、软件创新研发实力,一贯坚持“以客户为导向,自主创新、持续发展”的宗旨,多年来聚焦于数控领域,关注客户需求,致力于智能控制、可编程逻辑控制、单 片机控制、运动控制、机器人及机器人控制系统、嵌入式控制、机房现场环境数据采集、远程监控、各种通信控制、自动化、数字信息化、物联网等领域软硬件开发 和销售。

[说明]:编辑端软件用来编辑动作;客户端(播放器)用来命令控制器执行动作,配合控制器来实现4D影院内所有设备(座椅、特效设备、投影仪、音响等)随电影情节协同工作。
精敏数字4D动感影院控制软件分为编辑端(JMDM-4Dfilm editor)和客户端(JMDM-4Dfilm player)两部分,配合JMDM系列多款工业级4D座椅特效控制器使用,构成JMDM 4D影院座椅特效设备控制系统。

标准配置:1套软件只有1个编辑端、1个客户端软件的使用权限,一般标配2个加密狗,用于打开编辑端和客户端软件,即1个加密狗用于打开编辑端软件,1个加密狗用于打开客户端软件。
。也可根据客户需求,配备1个加密狗,仅提供播放器软件的功能。
编辑端软件(编辑器)功能如下:
1、供4D影院厂家使用,用于编辑4D立体电影的动感座椅、特效设备随电影情节同步动作,也可播放已编辑好特效的影片,用来测试效果。
2、可以边看电影,边在软件界面上手工编辑特效;或通过JMDM 4D影院动作采集系统来自动生成动作。
3、 实现的功能:可把立体4D动感电影的座椅特效、电影立体画面与剧情紧密结合,可以很方便地编辑出:震动、颠簸、下坠、风暴、雷电、下雨、撞击、喷洒水雾、 拍腿、喷气、烟雾、雪花、气味、喷风等座椅和特效动作,给观众带来犹如梦幻般身临其境、紧张刺激惊险全新的娱乐享受。
客户端软件(播放器)功能如下:
客户端用于播放已编辑好动作、带有特效的4D电影,供观众欣赏,没有编辑功能,能实现:
1、影片内容和所有设备的动作同步播放、协同工作。
2、 JMDM-4D player播放器结合SSP(Stereoscopic Player)播放器能支持几乎所有的影片格式,比如:播放器支持左右格式、上下格式、左右分离等格式;avi、mkv、mpg、mpeg、rm、 rmvb、mov、m2ts等(并且格式可以通过软件相互转换)。
3、播放器支持外部载入字幕,并可以设置成左右立体格式。

该公司的解决方案概要说明

解决方案特点概要:

1、JMDM-4D动感影院核心控制系统支持:气压,电动,液压3种动感座椅、3自由度、6自由度运动平台座椅!

2、播放软件:分为编辑端(JMDM-4Dfilm editor )和客户端(JMDM-4Dfilmplayer)。

(1)JMDM-4D动感影院核心控制系统支持多种格式影片,比如:avi、mkv、mpg、mpeg、rm、rmvb、mov等(格式可以通过软件相互转换)。

(2)播放器支持外部载入字幕,并可以设置成左右立体格式。

(3)播放器支持左右格式影片(上下格式可以转成左右格式)。

3、编辑端(编辑器)用于编辑4D立体电影动感座椅特效;边看电影,边编辑座椅动作和特效。

4、客户端(播放器)用于播放已编辑好、带有特效的4D电影,供观众欣赏,没有编辑功能。

5、每套软件只能有1个编辑端、1个客户端,编辑端和客户端可放在同一个加密狗上,便于客户使用。

RTSPPlayer升级到1.2了

修改了几个反馈回来的bug.

1.2 (2012/06/27)
Fix bug: Some H.264 video stream can not be parsed property issue(rtp stream does not contain SPS & PPS).
Fix bug: huge video(larger than your phone’s resolution) can not show properly issue.

待完成功能:
1. 在这里边的视频列表是写死在程序里的,下一步有空我会考虑把它放到网上,然后打开程序的时候从网上同步地址,再进行视频观看。
2. 下一步计划考虑把RTSPPlayer改成一个支持所有ONVIF协议的终端的流媒体播放器,那样的话,第一项功能也就不那么重要了。

下载地址:http://rg4.net/p/rtspplayer

RTSPPlayer升级到1.1了

前两天把RTSPPlayer for android递交到应用汇,并通过了审核,应用汇里的地址:http://www.appchina.com/soft_detail_296045_0_10.html
这个周末没事就再拿出来改改,并把版本号改为1.1。主要的改动如下:

1.1 (2012/06/17)
Change application UI to fullscreen mode(@android:style/Theme.NoTitleBar.Fullscreen),
Change VideoPlayer activity to LANDSCAPE mode to maximize the video.
Add a menu for main UI.
Add a preset URL list(hard coded url save in a spinner), so that you can just select live streaming video from the list by just one click.
Fix large video display resolution bug.

现在这里边的视频列表是写死在程序里的,下一步有空我会考虑把它放到网上,然后打开程序的时候从网上同步地址,再进行视频观看。

另外,也在找存放源码的地方,希望有热情的同行,共同参与改善。

下载地址:http://rg4.net/p/rtspplayer

EasyIPCam更新 – 可以支持音频了

经过一个周末的努力,EasyIPCam终于可以发布第一个版本了,且可以同时支持音频和视频。其中视频暂只支持MPEG4格式,音频暂只支持ALAW,但可同时支持RTP over TCP 和 RTP over UDP两种模式,这样,可以保证在Wifi和3G网络下都能正常工作。

不过,可以肯定的是还存在很多问题有待改进,慢慢来吧,有空就弄弄,没空就拖拖,呵呵。