设计电子商务网站必知的十款免费 jQuery 图像缩放插件 Jquery 图像缩放插件不仅简单易用,而且还能够给予用户更好的体验。你只需要在图像或产品上移动鼠标,你将看到图片或产品的详细信息。 今 天,我们来分享一些 jQuery 图像缩放插件。事实上,图像缩放是很多在线购物网站最基本的组成部分。如果你是开发人员,你想在网站中使用图像缩放功能的话,推荐你使用下面十款 jquery 图像缩放插件。你可以根据需要,选择任意你想要的图像缩放插件,而且还免费哦。 EasyZoom Demo | Download EasyZoom 是一个 jQuery 图像缩放和平移插件。它支持触摸屏设备,且能用 CSS 来设计你想要的效果。 zoom.js Demo | Download zoom.js 是一款灵巧的 jQuery 图像缩放插件。点击图片,即可放大/缩小你的图片。更有趣的是,只要你滚动图片即可查看过去浏览过的图片。 picZoomer Demo | Download picZoomer 是一个非常小的 jQuery 插件,通过鼠标悬停放大图像,同时支持缩略图实现导航。你可以在电子商务网站使用该插件创建一个产品浏览页面,它允许访问者通过缩略图查看产品的的不同照片,且支持单独放大照片。 jQuery Zoom Demo | Download jQuery Zoom 是一个易于使用的 jQuery 图像缩放插件,你可以通过点击鼠标、抓取动作和切换动作来实现缩放图像。 WM Zoom Demo | Download WM Zoom 能够在图像中创建一个放大镜,并在旁边显示其高清晰度的图像。此外,它内置一个变焦功能,当你的鼠标悬停在图像上,能够放大图像。 BZoom Demo | Download BZoom 支持创建缩略图导航,并支持鼠标悬停时,在旁边显示特定区域的高清晰度图像。 elevateZoom Demo | Download Elevate Zoom 提供了两种图像缩放模式,一个低分辨率的可见光图像和一个高分辨率缩放的图像。且它支持缩略图导航,同时支持鼠标悬停时放大图像。 magnificent.js Demo | Download magnificent.js 是一个简单的响应式插件,能够提供两种缩放模式: 模式 1: 内部缩放。 悬停时在图像内部显示放大后的图像。 模式 2: 外部缩放。显示放大镜玻璃效果,以展示图像的特定部分。 也支持鼠标滚动来缩放图片。 zoom.js Demo | Download zoom.js […]
View Details前言: 08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写. 可见当时的JAVA水平真的不咋地, 时过进迁, 还是一样的不咋地. 这边是当时的CSDN下载链接: java(台球游戏), 实现比较简单. 后来写过一个版本, 比这个要强大许多, 可惜源码丢失了. 效果展示入下图所示: 本文想讲述下台球游戏中核心算法的实现, 以及游戏AI的设计技巧. 当然自己也有个小愿望, 希望能实现一个html5版的台球游戏. 基础物理知识: • 摩擦阻力 其满足牛顿第二定律: f = m * a 速度与加速度关系公式: vt = v0 + a * t 地面摩擦力与运动物体的方向相反, 阻碍物体的向前运动. • 动量守恒 假设物体A质量为m1, 速度为v1, 物体B质量为m2, 速度为v2, 碰撞后速度分别为v1′, v2′. 则满足动量守恒定律: m1 * v1 + m2 * v2 = m1 * v1′ + m2 * v2′ • 碰撞类型和能量守恒定律 1). 完全弹性碰撞 动能没有损失, 则满足如下公式: 1/2 * m1 * v1^2 + 1/2 * m2 * v2^2 = 1/2 * m1 * v1’^2 + 1/2 […]
View Details在院子里发现 http://www.cnblogs.com/yangecnu/p/3759784.html 模型验证方法 1. 一般方法 繁琐, 无数的if else, 在炎炎夏天,我见过一个验证方法3000行代码的,还要改需求,想必您能了解作为coder当时的心情。 2. 使用第三方框架,功能过于繁琐,还得自己学习,没必要 3. Code Contract 不熟悉,貌似和第三方不同的是:MS提供的,先得高大上一点而已,本质一样 下面的方法,既简单,维护也很方便。代码涉及点: 1) 模型文件代码-添加验证规则,至于你想怎么添加,可以自定义Attribute,或者使用FCL中自带的(本例即是) 2)模型数据操作的Action-在需要验证的Actiond中注入属性或者controller或者全局也行 3)过滤器-添加错误捕捉,处理 维护时,只需要修改各个业务模型中每个字段的验证规则即可 模型建立:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace Model_Validation.Models { public class User { [Required(ErrorMessage = "用户名不能为空")] public string UserName { get; set; } [RegularExpression("[a-z|A-Z|0-9]{6,20}", ErrorMessage = "密码位数太短")] public string UserPassword { get; set; } [DataType(DataType.EmailAddress, ErrorMessage = "邮件格式不正确")] public string EmailAddress { get; set; } [RangeAttribute(1, 1000, ErrorMessage = "评论长度1,1000")] public string Comments { get; set; } } } |
模型数据操作:
1 2 3 4 5 6 |
[HttpPost, ModelValidationFilterAttribute] public JsonResult DoLogin(Models.User User) { return Json(new object(), JsonRequestBehavior.DenyGet); } |
1 |
ModelValidationFilterAttribute:数据验证的过滤器 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class ModelValidationFilterAttribute : FilterAttribute,IActionFilter { // Summary: // Called after the action method executes. // // Parameters: // filterContext: // The filter context. public void OnActionExecuted(ActionExecutedContext filterContext) { } // // Summary: // Called before an action method executes. // // Parameters: // filterContext: // The filter context. public void OnActionExecuting(ActionExecutingContext filterContext) { var _MS = ((Controller)filterContext.Controller).ModelState; if (!_MS.IsValid) { var _FirstErrorField = _MS.FirstOrDefault(); string strHtmlId = _FirstErrorField.Key; string strErrorMessage = _FirstErrorField.Value.Errors.FirstOrDefault().ErrorMessage;//这个数据你想怎么给JS都行. } } } |
from:http://www.cnblogs.com/youlixishi/p/4497462.html
View Details直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运行。 项目的核心功能已经基本实现,但12年之后我基本停止了这方面的开发,现在翻出来在这里写出来想和大家交流一下。 鉴于篇幅和精力的原因,请原谅我这篇博文对于技术实现的具体细节谈的不是很多,只能算是一个概述。对业务的说明也不多,我想大家都是技术流,应该一看就明白。 写这个项目的时间是五六年前,现在回过头去看,有很多不足之处,设计上的,技术上的都有,加上当时技术力有限,不足之处还请指正,谢谢。 后续是否会写一个系列的博文详细的分析讲解实现方法,我暂时也没有想好,主要是没有太多时间,我现在基本又回到了当初每天只睡四五个小时的状态。 如果此篇博文有点儿价值,给个推荐呗 ^_^ 项目使用了 .Net Framework 3.5 开发,分为两大块: IDE 和 运行时(解析器) IDE中开发的项目在打包后生成 zip 格式的包,解析器通过读取 zip 包实时解析运行,有点类似中间语言的概念,但我这里生成的 zip 包中主要以 xml 文件为主,通过 xml 文件对项目的 UI,业务,数据结构 进行描述。 到此可以看出,运行时本身并不一定是 .Net 或 WinForm 的,而是可以使用任何平台或语言实现,只要读取 zip 文件和 xml 文件并解析即可。 事实上我自己实现的默认运行时也不是 WinForm,而是用了 Silverlight。 再简单说说 IDE 的设计思路,几个主要的设计目标如下: 1.像 Visual Studio 一样 有可视化的环境,拖拖拽拽界面就出来了。 2.模块化设计 功能模块全部独立,解耦,以插件的形式存在于主程序(宿主)中。 2.不要写代码,业务通过界面,向导进行配置 拖一个按钮上去,想要单击时做一件事情,就先把按钮拖上去,然后设置这个按钮的事件序列,配置对应的事件。 3.把事件这个概念抽象并封装起来 如“保存数据”这个事件,配置好数据的来源,如窗体上的数据,或系统数据,再配置好要保存的目标,某种数据实体,即可,这个事件被添加到某个事件序列,如按钮的单击事件序列中,项目被运行时解析时,就会按钮这个逻辑执行。 4.对数据操作要有一定的自由度 除了基本的向导式配置以外,要能满足特殊需求,比如支持自定义 sql 语句。但是自定义 sql 语句怎样与数据源,目标交互呢?我设计了一种简单的表达方法,如 UPDATE FROM [User] SET [Name] = {FormElement.txtName} WHERE [Id]={System.UserId} 5.对数据库数据表的操作怎样交互 就是将其抽象为“数据实体”,数据实体也在 IDE 中由用户自己定义,定义的过程类似于 SqlServer,定义好数据实体以后,在 IDE 中进行设计时,通过数据实体来抽象对数据库、表的操作,在打包项目时,可以根据定义的数据实体,生成多种数据库,如 SqlServer,Mysql 等。 6.资源文件的管理 在项目中必然要引用到外部资源,这部分外部资源,怎样引入,管理,打包呢?我在 IDE 中设计了独立的资源管理器,在 IDE 中设计 […]
View Details腾讯科技刘亚澜 5 月 12 日报道 对于中华英才网的又一次转手,其创始人张杰贤显得异常平静。“今天的中华英才网在经历了多次的转手后,更多的是传达的资本的意思,而不是创始人的意思,也不是跟着中华英才网做了十多年的员工的意思。” 就在上周五,58 同城宣布完成对中华英才网的并购。这家身世沉浮的招聘网站迎来了继美国招聘网站 Monster 和爱尔兰尚龙集团之后的又一家买主,不过这次,中华英才回到了“祖国”的怀抱。 张杰贤于 1997 年创办中华英才网,2004 年辞去管理层职务退居股东。对于此次并购,早已退出的他持一种“喜忧参半”的态度。 张杰贤告诉腾讯科技:“中华英才网终于有了一个本土的企业接盘,我觉得这也许是一个好事。”无论是 2008 年 Monster 正式接手,到 2013 年的尚龙接手,其实都是属于外资背景的投资人在运营中华英才网。而从过往这些年的运作来看,他们都是非常不成功的。一个本土的互联网公司接手,或许能给中华英才网带来转机。 但另一方面,张杰贤也表露出担忧:“58 过去两年虽然在招聘领域有一定的影响力,但是在招聘方面的经验,无论是跟中华英才网比,还是智联招聘、前程无忧等比较,还是有非常大的差别。58 上的用户群体,都是以蓝领为主,另外产品形态、团队风格也会非常不一样。” 的确,58 的招聘以蓝领为主,中华英才则侧重白领。如果两相互补,将有助于占领市场。张贤杰认为如果按照姚劲波在信函中所说的保留中华英才的品牌独立运营,58 将一些流量、市场资源、资金等向中华英才网输送,应该会是比较好的一种方式。但要想完全整合,成功的可能性微乎其微。 而谈起当年为何出走,张杰贤并不避讳。“最重要的原因是我在经营和发展策略上与当时的投资人和董事会有比较大的分歧。”追溯当年,张杰贤“在二三线城市扩张”以及“开展派遣代理业务”的主张均被董事会否定。 离开之后,张杰贤做起了投资,但由于投资太过分散并未收到太好的效果。最终在 2010 年,他选择重新回到招聘行业,创办了新的招聘网站——全职招聘网。但这次,他选择先低调地完善产品。“因为多次创业,心态就不会那么急躁。”据了解,张杰贤再次创业的全职招聘网并未进行任何融资。 以下为腾讯科技专访张杰贤实录: 腾讯科技:58 同城收购了中华英才网,您认为这对于中华英才网来说是好事还是坏事? 张杰贤:到目前为止,我还无法判断,我觉得只能是各占一半。 首先,中华英才网终于有了一个本土的企业接盘, 我觉得这也许是一个好事。因为无论是 2008 年 monster 正式接手,到 2013 年的尚龙接手,其实都是属于外资背景的投资人在运营中华英才网。从过往这些年的运作来看,他们都是非常不成功的。所以这个时候,一个本土的互联网公司接手,应该说有更好的机会把它做好。 但另一方面,因为 58 过去两年虽然在招聘领域有一定的影响力,但是在招聘方面的经验,无论是跟中华英才网比,还是智联招聘、前程无忧等比较,还是有非常大的差别。58 上的用户群体,都是以蓝领为主,比如保洁、保姆、司机等,另外产品形态、团队风格也会非常不一样。 腾讯科技:58 的招聘是以蓝领为主,而中华英才网的招聘主要以白领为主,您觉得 58 在收购之后能把这两块业务整合起来么? 张杰贤:我认为 58 之所以去收购,就是看中了中华英才网在白领人群中的品牌影响力和客户资源。但是 58 能否整合好这两块业务,我觉得还是存在不确定性。因为 58 针对蓝领人才的市场定位,和中华英才网等这些针对白领人才的市场定位,是非常不同的。 求职者去 58 和去智联或者英才是完全不同的求职体验,这两类人群有着非常大的差异。 举个简单的例子,这两类求职者在填写简历的时候都是非常不同的,更不用说他们自身的背景,企业在判断人才时候的深度等等。如果是白领人群,企业可能会问更多关于个人过往背景的问题,面一个小时或者两个小时;而针对蓝领人群,企业就不需要问很多问题,可能只需要半个小时就能确定,因为企业更多关注的是这个人的技能技巧。 所以我觉得他要整合这两块业务也是非常困难的。 目前,我们看到姚劲波发出的信函中讲的是,会保留中华英才网的品牌已经这个团队的独立运作。如果真的这样实施的话,那么他们应该不会做整合,只会把 58 的一些流量、市场资源、资金等向中华英才网输送,这应该是比较好的一种方式。 如果真的把两个有着完全不同的招聘群体的网站整合到一起的话,我觉得挑战应该非常大,甚至于不成功的可能性也更大。 腾讯科技:您觉得现在中华英才网的发展方向和您创立时的初衷是否还一致呢? 张杰贤:我离开中华英才网已经蛮久了,2011 年所有资本层面上的联系都已经结束。 18 年前我创立中华英才网的时候,我的初衷非常简单,就是满足企业的招聘需求和求职者的求职需求。 而今天的中华英才网在经历了多次的转手后,更多的是传达的资本的意思,而不是创始人的意思,也不是跟着中华英才网做了十多年的员工的意思。我不愿意看到公司在经历多次倒手后变得越来越没落,客户越来越不认可,我相信这也不是跟着英才网十多年的老员工们愿意看到的。 腾讯科技: 周五的时候,全职招聘网在中华英才网楼下举了牌子“创始人接你们回家”。您又是怎样想到再次选择招聘这个行业来创立一个全新的网站呢? 张杰贤:2010 年我重新回归到招聘领域,2012 年推出了全职招聘网。这些年,我发现在互联网领域里变化最小的,就是招聘领域。无论是前程无忧、智联招聘这些老牌网站,还是后来起来的新的招聘网站,今日如日中天的猎聘、拉勾,我觉得他们都是大同小异。 为什么我们不能做出一些变化?为什么在用户需求已经有很大变化的情况下,这些网站没有变化。所以这是我重新回来做招聘的一个主要的原因。 但是其实我也一直在摸索,并不是你想改变回来就能够改变。经过摸索,我们从产品形态到业务模式都跟这些同行、前辈们有很大很大的不同。 腾讯科技:那么追溯到 2004 年,当时是出于什么样的原因离开了中华英才网呢? 张杰贤:最重要的原因是我在经营和发展策略上与当时的投资人和董事会有比较大的分歧。 比如说,我们当时面临的情况是,需要去扩张,而在扩张的过程中,我们的利润目标就要降低。我当时建议的策略是,如果要发展,就必然要牺牲利润,就不能再以利润为目标。但当时的董事会,由于手上的现金并不多,所以希望公司既要有快速的发展,同时还要有利润。这就是一个矛盾。 我们当时还要扩展区域市场,我们的同行都去到了各地的二三线城市。我就建议我们也去,当时我的意见是如果你今天不去,那公司就没有未来。但董事会并不同意,他们认为如果去二线城市还不如把人力放在一线城市。 我们当时还做了派遣代理的业务,也是三家网站中最早做外包业务的网站。但是今天你可以看到,这项业务已经成了前程无忧未来最具潜力的业务分支,已经占到前程无忧的 30% […]
View Details5 月 11 日消息 近日福布斯公布了 2015 年度全球企业 2000 强的榜单,现金储备超 141 国国家生产总值、市值超 7400 亿美元的苹果排在哪儿呢?世界上的上市公司中苹果的确很能赚钱,但并非福布斯标准中的最大。 在福布斯 2015 年全球企业 2000 强榜单中,苹果以 1994 亿美元销售额、445 亿美元净利润、2619 亿美元资产和 7418 亿美元市值排在了第 12 名,虽然依然未能进入前十,但较之 2014 年已上升了三个名次,而其竞争对手三星电子则从第 22 名上升到了第 18 名。据最新统计,苹果现金储备已达到 1780 亿美元,其中 89% 在海外。 福布斯全球 2000 强榜单通过计算上市公司的上述四大方面指标之综合成绩而得出,被视为全球最权威、最受关注的商业企业排行榜之一。据悉此次 2000 家上榜企业合计创造了 39 亿美元营业收入、净利 3 万亿美元、总资产达 162 万亿美元,并累积了 48 万亿美元的市值。 榜单中前十均由中美企业瓜分,得益于中国银行从去年的第九跃升至第四,加上工商、建设、农业“四大行”占领了前排。而 2000 家上榜企业中有 279 家来自中国(中国大陆占 180 席),多为银行、能源、房地产、保险、互联网、通讯等领域。 来自: www.feng.com
View Details这是一篇博客,不是,这是一篇开源人的心酸和喜悦,没有人可以理解我们的心情,一路的辛酸一路的艰辛,不过还好,在大家的支持下,总算是终见天日,谢谢那些给予我们无私帮助的朋友。您的支持,依然是我们无限的动力,作为回报,免费继续保持开源,是我们对您们的真诚谢意。 Iveely 从0.1.0走到现在,我们见证了付出与汇报,失落与惊喜,柳暗花明,我们遭遇了财力枯竭,人员严重短缺,精疲力竭的眼泪,该经历的我们都经历了,但是我们很庆幸,我们幸运的经历了这些,我们痛并快乐的坚持,终究迎来了0.8.0,0.8.0 更加注重知识问答,因此至少为我们带来了下面功能: 1. 分布式实时计算平台。 分布式实时计算平台,脱离任何具体业务,动态分配机器节点,为程序直接进行分布式运行。 2. 强劲数据存储引擎。 对于数据存储,我们想了很多方法,尝试了很多开源数据存储,但是他们都不适合搜索引擎数据存储,在插入和读取之间难以平衡,在0.7.0中,我们拥有了数据存储引擎,但是0.7.0的数据存储弱点依然比较明显,为了达到较快的读取和写入速度,牺牲了较大磁盘空间,很多朋友反应,磁盘很快就不够用,从商业化角度,增加了企业成本,由此,0.8.0,在保证读写性能上,考虑了磁盘存储,使得存储更佳强劲。 3. 插件式热启搜索功能。 我们一直在思考一件事情,怎样更佳灵活的给搜索引擎添加新功能,例如天气预报、计算器、股票信息等等,在加入的过程中,又不影响线上版本的使用。于是乎,我们从新研制了插件热启机制,可以灵活为搜索添加新功能。上线一个新功能,不再需要重启搜索服务。 4. 更智能的问答。 说了这么多,也许你还是想看看,Iveely 0.8.0到底长什么样子?0.8.0中是包含网页搜索,但是示例中未去收录更多网页,原因是我们的硬件资源(硬盘)已经不足,不得不放弃网页搜索的示例。下面截图示例: 事实到了0.8.0这一步,距离0.7.0发布,时隔近6个月,越到后面工作量越大,很多朋友私下QQ或者邮件问了我一些问题: “没有收益,没有盈利,没有公司支持,你们为啥做这个?” 这是我们遭遇到最尴尬的问题,我们原本可以享受着高薪的生活,拿着比同龄人高很多的薪水,甚至有人拿着丰厚的待遇邀我出任其公司CTO,可我们选择了辞掉工作,婉拒别人邀请,和小伙伴们一直坚持最初的梦想。每个人都是聪明的,都非常有天赋,而天赋就是兴趣,每个人都不必去追求职称、纠结绩效,不必为了丰厚的薪酬,丢弃了真实的自己,做自己厌倦的事情。因为我们坚信人工智能的时代已经到来,如果我们能够为这个时代效绵薄之力,我们也会热血沸腾,这也是我们的快乐。 “Iveely 可否用于商业化?” 这是很多期望做垂直领域信息挖掘的朋友都会问我的问题,答案肯定是可以的。0.8.0版本,在我们4台服务器上,稳定运行了30天,基本上排除了大事故的发生,但是谁也不能保证bug的存在不给您造成麻烦,我们也无法为您花时间提供搜索定制化服务,但是我们可以给予您无偿的技术支持,任何问题都可以发送邮件到 liufanping@iveely.com。 捐助我们 如果,我是说如果,您愿意帮助我们,希望您能够联系我们,我们将利用您的捐助租赁更多服务器,以保证Iveely的稳定性,我们提前对您表示感谢! 此外,也感谢Bogdan P Sliwowski先生、Marcin Bak先生对Iveely 0.8.0的不懈支持,您们的无私支持,让我们备受鼓舞。 再次谢谢大家,谢谢团队的奉献,家人们的理解,朋友们的关心,回过头来,感谢有您! 您的朋友:刘凡平 本文相关帮助: 如何使用Iveely的数据存储引擎Iveely Database 如何部署Iveely.Computing分布式实时计算系统 如何快速写一个分布式实时应用程序 如何编写Iveely搜索引擎插件 直接部署文件下载 源码啊文件下载 发布历史记录: 开源搜索引擎 Iveely Search Engine 0.1.0 的发布 开源搜索引擎 Iveely Search Engine 0.2.0 的发布 Iveely 搜索引擎0.3.0 发布 & 如何搭建自己的搜索引擎 千呼万唤始出来,Iveely Search Engine 0.4.0 的发布 开源分布式计算引擎 & 开源搜索引擎 Iveely 0.5.0 为大数据而生 开源搜索 Iveely Search Engine 0.6.0 发布 — 黎明前的娇嫩 开源搜索引擎Iveely 0.7.0发布,不一样,那就让他不一样! from:http://www.cnblogs.com/liufanping/p/4489864.html
View Details自从在博客园发布广域网即时通信系统GG(QQ高仿版)以来,结识了很多做IM的朋友,然后我和我的伙伴们也接到了很多与IM相关的项目。相比在发布GG之前难以接到项目的状况相比,现在简直太幸福了,虽然做项目很辛苦,但毕竟有钱赚,那辛苦也值了。 饮水思源,这里要感谢博客园提供了这么好的一个平台,让我们能展现自己的实力,提升我们的知名度,然后才能接到了更多项目。所以,我强烈建议那些希望接项目、接私单的朋友,都来博客园写博客吧,写出自己的知名度后,真是好处多多! 言归正传,前段时间做了个在线教育培训的项目,与视频会议比较类似,所以了,我打算像GG一样,写一个视频会议系统并把实现的原理和源码都分享出来,让有兴趣的朋友可以参考下。继承GG的名称,我把这个视频会议系统命名为GGMeeting,目前版本为1.0,后续功能会不断增强。 一般而言,视频会议的主要核心功能是:多人语音、多人视频、公共电子白板、会议房间管理。本文我们将介绍视频会议系统的主要功能及其实现原理,后面有空在介绍详细每个功能的详细实现细节。 一.语音通话 1.基础模型 在视频会议中,网络语音通话通常多对多的的,但就模型层面来说,我们讨论一个方向的通道就可以了。一方说话,另一方则听到声音。看似简单而迅捷,但是其背后的流程却是相当复杂的。我们将其经过的各个主要环节简化成下图所示的概念模型: 这是一个最基础的模型,由五个重要的环节构成:采集、编码、传送、解码、播放。 语音采集指的是从麦克风采集音频数据,即声音样本转换成数字信号。其涉及到几个重要的参数:采样频率、采样位数、声道数。 假设我们将采集到的音频帧不经过编码,而直接发送,那么我们可以计算其所需要的带宽要求,仍以上例:320*100 =32KBytes/s,如果换算为bits/s,则为256kb/s。这是个很大的带宽占用。而通过网络流量监控工具,我们可以发现采用类似QQ等IM软件进行语音通话时,流量为3-5KB/s,这比原始流量小了一个数量级。而这主要得益于音频编码技术。 所以,在实际的语音通话应用中,编码这个环节是不可缺少的。目前有很多常用的语音编码技术,像G.729、iLBC、AAC、SPEEX等等。 当一个音频帧完成编码后,即可通过网络发送给通话的对方。对于语音对话这样Realtime应用,低延迟和平稳是非常重要的,这就要求我们的网络传送非常顺畅。 当对方接收到编码帧后,会对其进行解码,以恢复成为可供声卡直接播放的数据。 完成解码后,即可将得到的音频帧提交给声卡进行播放。 2.高级功能 如果仅仅依靠上述的技术就能实现一个效果良好的应用于广域网上的语音对话系统,那就太easy了。正是由于很多现实的因素为上述的概念模型引入了众多挑战,使得网络语音系统的实现不是那么简单,其涉及到很多专业技术。一个“效果良好”的语音对话系统应该达到如下几点:低延迟,背景噪音小,声音流畅、没有卡、停顿的感觉,没有回音。 对于低延迟,只有在低延迟的情况下,才能让通话的双方有很强的Realtime的感觉。当然,这个主要取决于网络的速度和通话双方的物理位置的距离,就单纯软件的角度,优化的可能性很小。 (1)回音消除 现在大家几乎都已经都习惯了在语音聊天时,直接用PC或笔记本的声音外放功能。当使用外放功能时,扬声器播放的声音会被麦克风再次采集,传回给对方,这样对方就听到了自己的回音。 回音消除的原理简单地来说就是,回音消除模块依据刚播放的音频帧,在采集的音频帧中做一些类似抵消的运算,从而将回声从采集帧中清除掉。这个过程是相当复杂的,因为它还与你聊天时所处的房间的大小、以及你在房间中的位置有关,因为这些信息决定了声波反射的时长。 智能的回音消除模块,能动态调整内部参数,以最佳适应当前的环境。 (2)噪声抑制 噪声抑制又称为降噪处理,是根据语音数据的特点,将属于背景噪音的部分识别出来,并从音频帧中过滤掉。有很多编码器都内置了该功能。 (3)抖动缓冲区 抖动缓冲区(JitterBuffer)用于解决网络抖动的问题。所谓网络抖动,就是网络延迟一会大一会小,在这种情况下,即使发送方是定时发送数据包的(比如每100ms发送一个包),而接收方的接收就无法同样定时了,有时一个周期内一个包都接收不到,有时一个周期内接收到好几个包。如此,导致接收方听到的声音就是一卡一卡的。 JitterBuffer工作于解码器之后,语音播放之前的环节。即语音解码完成后,将解码帧放入JitterBuffer,声卡的播放回调到来时,从JitterBuffer中取出最老的一帧进行播放。 JitterBuffer的缓冲深度取决于网络抖动的程度,网络抖动越大,缓冲深度越大,播放音频的延迟就越大。所以,JitterBuffer是利用了较高的延迟来换取声音的流畅播放的,因为相比声音一卡一卡来说,稍大一点的延迟但更流畅的效果,其主观体验要更好。 当然,JitterBuffer的缓冲深度不是一直不变的,而是根据网络抖动程度的变化而动态调整的。当网络恢复到非常平稳通畅时,缓冲深度会非常小,这样因为JitterBuffer而增加的播放延迟就可以忽略不计了。 (4)静音检测 在语音对话中,要是当一方没有说话时,就不会产生流量就好了。静音检测就是用于这个目的的。静音检测通常也集成在编码模块中。静音检测算法结合前面的噪声抑制算法,可以识别出当前是否有语音输入,如果没有语音输入,就可以编码输出一个特殊的的编码帧(比如长度为0)。特别是在多人视频会议中,通常只有一个人在发言,这种情况下,利用静音检测技术而节省带宽还是非常可观的。 (5)混音 在视频会议中,多人同时发言时,我们需要同时播放来自于多个人的语音数据,而声卡播放的缓冲区只有一个,所以,需要将多路语音混合成一路,这就是混音算法要做的事情。 二.视频通话 1.基础模型 视频通话的概念模型与语音完全一致: 摄像头采集指的是从捕捉摄像头采集到的每一帧视频图像。在windows系统上,通常使用VFW技术或DirectShow技术来实现。采集视频的两个关键参数是帧频(fps)和分辨率。 一般而言,一个摄像头可以支持多种不同的采集分辨率和采集帧频,而不同的摄像头支持的分辨率的集合不一样。比如现在有很多高清摄像头可以支持30fps的1920*1080的图像采集。 编码用于压缩视频图像,同时也决定了图像的清晰度。视频编码常用的技术是H.263、H.264、MPEG-4、XVID等。 当对方接收到编码的视频帧后,会对其进行解码,以恢复成一帧图像,然后在UI的界面上绘制出来。 2.高级功能 相比于语音,视频的相关处理要简单一些。 (1)动态调整视频的清晰度 在Internet上,网络速度是实时动态变化的,所以,在视频会议中,为了优先保证语音的通话质量,需要实时调整视频的相关参数,其最主要的就是调整编码的清晰度,因为清晰度越高,对带宽要求越高,反之亦然。 比如,当检测网络繁忙时,就自动降低编码的清晰度,以降低对带宽的占用。 (2)自动丢弃视频帧 同样网络繁忙时,还有一个方法,就是发送方是主动丢弃要发送的视频帧,这样在接收方看来,就是帧频fps降低了。 三.电子白板 在视频会议中,电子白板的功能是很重要的。通常会议的主持人会在白板上画图进行讲解,然后其它的人能同步观看和操作电子白板的内容。 通常的电子白板都支持如下功能:线段、箭头线、双箭头线,水平肘型连接符、垂直肘型连接符,矩形、三角形、椭圆(圆),文本,自由曲线,插入图片,激光笔。 在实现上,电子白板主要是使用GDI+技术。 对于电子白板的同步,其原理是这样的:比如,当操作者在白板上绘制一个图像时,这个操作会被封装成一个Command对象(命令模式),然后,通过网络广播发送给会议中的其它人。当其他人接收到这个Command对象时,就将其转换成一个白板操作来执行,这样各个白板的内容就自动同步了。 四.会议房间管理 对于那些动态创建视频会议室,在用完之后就动态将其销毁的通常的视频会议应用场景来说,使用动态组来表示会议房间,是非常恰当的。 所谓“动态组”,就是在服务器内存中动态创建的组,不需要序列化存储到比如数据库或磁盘中,需要的时候就创建一个,然后加入多个成员进行组内沟通,当不再使用的时候,就直接从内存中销毁了。 基于Socket技术,我们可以在服务端实现DynamicGroupManager类来对动态组进行管理。 虽然,动态组仅仅存在于内存之中,但是,在项目需要时,我们仍然可以将其某些重要的信息持久化到数据库中存储。然后,在服务器重启时,可以从DB中加载重要的房间信息。 五.GGMeeting 源码 GGMeeting的当前版本为1.0,已经实现了上述的4个主要功能,大家可以下载源码研究下。 GGMeeting-V1.0 GGMeeting1.0bushu 广告:如果您有类似视频会议系统、在线培训系统、IM系统需要定制开发的,可以联系我们哦:) QQ:2027224508 运行效果截图: 部署说明: (1)将GGMeeting.Server部署到服务器上,并运行起来。 (2)修改Client配置文件GGMeeting.exe.config中的ServerIP的值。 (3)运行第一个Client实例,以随机帐号进入测试房间。 (4)在别的机器上继续运行Client,以随机帐号进入测试房间,大家即可在测试房间中进行视频会议。 注意:语音视频数据都是实时采集、实时播放的数据,所以测试时,服务器的带宽要求最好是独享带宽,共享带宽一般无法满足实时语音视频的要求。 ________________________________________________________________________ 欢迎和我探讨关于 GG 和 GGMeeting 的一切,我的QQ:2027224508,多多交流! 大家有什么问题和建议,可以留言,也可以发送email到我邮箱:ggim2013@163.com。 如果你觉得还不错,请粉我,顺便再顶一下啊 from:http://www.cnblogs.com/justnow/p/4487201.html
View Details(最新版本:V4.2,2015.03.25) GG是QQ的高仿版,包括客户端和服务端,可在广域网部署使用,目前最新版本为4.0。我想写一个类似汇总的文章,通过这篇文章,大家可以了解到GG的全貌和最新进展,以及关于一些常见问题的解答也汇总在这里。 言归正传,对我个人而言,我的目标并不是做一个QQ高仿版的玩具,而是希望做成一个能够真正使用的产品(这个过程还有很长的路要走),并持续维护下去。 一.已实现的功能 (01)注册、登录、添加好友、好友列表。 (02)自拍头像。 (03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒 (04)群功能:创建群、加入群、退出群、群聊天 (05)文件传送、文件夹传送(支持断点续传) (06)语音视频聊天 (07)远程磁盘 (08)远程协助 (09)共享桌面(可以指定要共享的桌面区域) (10)可靠的P2P (11)网盘 (12)离线消息 (13)离线文件 (14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。 (15)最近联系人列表 (16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 (19)打开聊天窗口时,自动显示上次交谈的最后一句话。 (20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。 (21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 (22)主窗体靠边自动隐藏。 二.后续待实现的功能 (1)增加持久化支持 (2)视频会议 三.开发环境 开发环境:VS2010 ,开发语言:C#, .NET Framework 版本: 2.0 部署客户端时,客户端机器还需要安装VC++2008 runtime、VC++2010 runtime。 四.相关说明 1.如果要将GG部署到广域网,则可以在服务端的配置文件中设置监听的端口;而在客户端的配置文件中,则可以指定服务器的IP和Port。 2.虚拟数据库 (1)为了部署测试更简单,GG没有采用真实的物理数据库,而是在内存中虚拟了一个数据库(即服务端的VirtualDB类),用于存储用户注册信息、好友关系、群信息等。 (2)GG内置了几个用户:10000、10001、10002、10003,它们的登录密码都是"1"。 (3)GG内置的这几个用户之间都是好友关系。 (4)GG内置了两个群:G001、G002。G001群包含所有内置测试用户,G002群包含10000和10001两个用户。 (5)上述的这些内置信息,在VirtualDB类的构造函数中设定。 3.麦克风、摄像头的选择可在客户端系统设置窗口(SystemSettingForm)中指定。 4.语音视频:也有很多朋友问语音视频设备的工作怎么不正常,或者语音视频不流畅,这个可以直接参考OMCS官方文档:摄像头、麦克风、扬声器、设备测试 、带宽要求。 5.特别说明一下:GG项目中,只要是我写的代码,全部都放出来了。拜托喜欢每一个dll都有源码的朋友不要再问我要其它的源码了:) 五.版本记录 2013.08.07 — V1.0, 登录、好友列表、文字聊天、文件传送、文件夹传送 2013.09.02 — V1.8, 语音视频聊天 2013.09.23 — V2.0, 网盘、远程磁盘 2013.11.05 — V2.4, 远程协助、共享桌面 2014.04.15 — V3.0, 注册、加好友、加入群、群聊 2014.05.16 — V3.2, 离线消息、离线文件 2014.05.28 — V3.4, 系统设置、最近联系人 2014.06.30 — V3.5, 自拍头像、修改密码、删除好友 2014.08.06 — V3.6, […]
View Details入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己。最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及到的ActiveX控件开发并用web来显示的,正好也总结一些,之前在学校一直没有接触过,网上是有教程的,但是大多有问题,只有自己亲自测试通过了才放心。 一、开发ActiveX控件 1、新建类库,命名类库名称“user.cs”; 2、在类库中添加自定义用户控件“ UserControl1”,实现各种自定义功能; 3、为了解决浏览器安全设置对控件的影响,必须在组件中加入IObjectSafety接口,所以再添加一个接口类“IObjectSafety.cs”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Collections.Generic; using System.Text; using System.Web.UI.WebControls.WebParts; //必须引用该包 using System.Security; using System.Runtime.InteropServices; //必须引用该包 namespace user { [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] //GUID这个不需修改,固定的 public interface IObjectSafety { // 方法定义 void GetInterfacceSafyOptions(System.Int32 riid, out System.Int32 pdwSupportedOptions, out System.Int32 pdwEnabledOptions); void SetInterfaceSafetyOptions(System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions); } } |
4、继承接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class UserControl1: UserControl,IObjectSafety { public UserControl1() { InitializeComponent(); } public void GetInterfacceSafyOptions(System.Int32 riid, out System.Int32 pdwSupportedOptions, out System.Int32 pdwEnabledOptions) { pdwSupportedOptions = 1; //不要修改该代码 pdwEnabledOptions = 2; //不要修改该代码 return; } public void SetInterfaceSafetyOptions(System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions) { return; } public void YourFunc(){} } |
5、在UserControl1引入两个命名空间 using System.Security; using System.Runtime.InteropServices; 6、工具——创建GUID——新建GUID——选择第五项——复制,就可以关闭小窗口,然后在命名空间下粘贴,如下
1 2 3 4 5 6 7 |
namespace user { [Guid("7F29ACED-AD84-4EEE-9E1A-58BE255F9EF7")] //这个GUID是web引用的时候用到的 public partial class UserControl1: UserControl,IObjectSafety { …… |
7、最后一步,项目——user属性(最后一项),两处需要修改 ①应用程序——程序集信息——√ 使程序集COM可见 ②生成——√ 为COM互操作注册 8、即可右键项目user——生成 二、web使用ActiveX控件 在web调用很简洁,引用刚刚生成的dll文件,然后在添加
1 2 3 4 5 6 7 8 9 10 11 |
<body> <form id="form1" runat="server"> <div > <object id="VisioDisPlay" classid="clsid:7F29ACED-AD84-4EEE-9E1A-58BE255F9EF7" width="1250" height="600" > </object> </div> </form> |
即可完成。注意的是:这里的classid里边的字符串里边有 “ clsid: ”,别忘啦,后面接的是第六步生成的GUID,必须一致! 好了,该吃午饭了,有什么不足的,忘园子大咖们批评指出。 from:http://www.cnblogs.com/EminemJK/p/4496953.html
View Details