花色文件结构

  • Frameworks: 假若文件夹不存在, 点击classes选择Show in Finder,
    新建一个即可, 将你打包的如故下载的framework拖入其中并拉进项目中.
    你也足以友善建一个文件夹, 把这么些Frameworks直接delete即可

  • Profile : 个人主旨, 那多少个中只有一个ProfileController.
    因为总写重复代码, 都写吐了, 这儿有趣味的自己写一下呢, So easy…

  • Network : 关于网络连接的工具类. 关于网络的实时督查, 网络状态的切换,
    网络请求的工具类都在此处面.

  • Other : 全局的常量. 当然你也足以在其师长文件结构进一步细化.

  • Home : 包含最新主播, 最热直播, 关注的直播, 礼物名次榜等模块.
    还有最要害的视频直播也在这里面了.

  • Show提姆e :见名知意. 视频直播的前处理,
    智能美颜和H264硬编码等都在此处面.

  • Main : UITabBarControllerUINavigationController的配置

  • Toos : 这儿命名有点不专业, 这其间放置的都是项目用到的分类

  • Login : 登录模块

  • Resource : 项目用到的资源文件

技巧准备

19世纪,电在总计机中的应用关键有两大方面:一是提供引力,靠电动机(俗称马达)代替人工驱动机器运行;二是提供控制,靠一些活动器件实现总计逻辑。

我们把这么的微处理器称为机电统计机

效果图

gif1

gif2

由于licecap录制的GIF失帧太严重, 都模糊掉了, 再放两张高清截图

png1

png2

电磁继电器

约瑟夫(Joseph)·Henley(约瑟夫 Henry 1797-1878),弥利坚数学家。爱德华(Edward)·戴维(David)(EdwardDavy 1806-1885),英帝国物工学家、数学家、发明家。

电磁学的价值在于摸清了电能和动能之间的变换,而从静到动的能量转换,正是让机器自动运行的显要。而19世纪30年份由Henley和戴维(David)所分别发明的继电器,就是电磁学的机要应用之一,分别在电报和电话领域发挥了重点效用。

电磁继电器(原图来自维基「Relay」词条)

其布局和规律至极简约:当线圈通电,暴发磁场,铁质的电枢就被掀起,与下侧触片接触;当线圈断电,电枢就在弹簧的效用下发展,与上侧触片接触。

在机电设备中,继电器紧要发挥两地方的机能:一是通过弱电控制强电,使得控制电路能够操纵工作电路的通断,这或多或少放张原理图就能看清;二是将电能转换为动能,利用电枢在磁场和弹簧功效下的来往运动,驱动特定的纯机械结构以成功总括任务。

继电器弱电控制强电原理图(原图来源网络)

感触

即使这么些项目是个山寨的, 高仿的, 不过仍旧已经很庞大了.
具体的细节仍然需要我们温馨去看本身的项目源码.
短短几千字还真说不清这么多的文化点. blog的篇章名字说了是初窥,
还确确实实只是初窥, 录像直播里面的坑太多. 且行且珍爱…

tip: 本文理论知识部分, 采集自网络.
请牢记一句话talk is cheap show me the code, 重点在于Demo品类本身.
理论部分自己只是一个苦力和总括者…

Model I

Model I的运算部件(图片来源于《Relay computers of GeorgeStibitz》,实在没找到机器的全身照。)

这边不追究Model
I的切切实实落实,其规律简单,可线路复杂得特别。让我们把关键放到其对数字的编码上。

Model
I只用于落实复数的揣度运算,甚至连加减都未曾设想,因为贝尔(Bell)实验室认为加减法口算就够了。(当然后来他们发现,只要不清空寄存器,就可以透过与复数±1相乘来兑现加减法。)当时的对讲机系统中,有一种具有10个情形的继电器,可以象征数字0~9,鉴于复数总括机的专用性,其实没有引入二进制的必备,直接动用这种继电器即可。但斯蒂比兹实在舍不得,便引入了二进制和十进制的杂种——BCD编码(Binary-Coded
Decimal‎,二-十进制码),用四位二进制表示一位十进制:

0 → 0000
1 → 0001
2 → 0010
3 → 0011
……
9 → 1001
10 → 00010000(本来10的二进制表示是1010)

为了直观一点,我作了个图。

BCD码既拥有二进制的简要表示,又保留了十进制的运算形式。但作为一名优良的设计师,斯蒂比兹仍不知足,稍做调整,给各类数的编码加了3:

0 → 0011 (0 + 3 = 3)
1 → 0100 (1 + 3 = 4)
2 → 0101 (2 + 3 = 5)
3 → 0110 (3 + 3 = 6)
……
9 → 1100 (9 + 3 =12)

为了直观,我连续作图嗯。

是为余3码(Excess-3),或称斯蒂比兹码。为啥要加3?因为四位二进制原本可以表示0~15,有6个编码是多余的,斯蒂比兹选拔使用当中10个。

这么做当然不是因为躁狂症,余3码的精通有二:其一在于进位,观看1+9,即0100+1100=0000,寓目2+8,即0101+1011=0000,以此类推,用0000这一新鲜的编码表示进位;其二在于减法,减去一个数一定于加上此数的反码再加1,0(0011)的反码即9(1100),1(0100)的反码为8(1011),以此类推,每个数的反码恰是对其每一位取反。

无论您看没看懂这段话,不问可知,余3码大大简化了线路计划。

套用现在的术语来说,Model
I采取C/S(客户端/服务端)架构,配备了3台操作终端,用户在自由一台终端上键入要算的姿态,服务端将吸纳相应信号并在解算之后传出结果,由集成在终端上的电传打字机打印输出。只是这3台终端并无法而且采纳,像电话一样,只要有一台「占线」,另两台就会收下忙音指示。

Model I的操作台(客户端)(图片源于《Relay computers of GeorgeStibitz》)

操作台上的键盘示意图,左边开关用于连接服务端,连接之后即表示该终端「占线」。(图片来源《Number,
Please-Computers at Bell Labs》)

键入一个姿势的按键顺序,看看就好。(图片来自《Number, Please-Computers
at Bell Labs》)

测算一回复数乘除法平均耗时半分钟,速度是利用机械式桌面统计器的3倍。

Model
I不不过首先台多终端的微处理器,依旧率先台可以长距离操控的总结机。这里的远程,说白了就是贝尔(Bell)实验室利用自身的技能优势,于1940年8月9日,在Dutt茅斯高校(Dartmouth
College
)和伦敦的驻地之间搭起线路,斯蒂比兹带着小小的的终端机到大学演示,不一会就从伦敦盛传结果,在参与的物文学家中挑起了伟大轰动,其中就有日后名满天下的冯·诺依曼,个中启迪由此可见。

自己用Google地图估了瞬间,这条路线全长267公里,约430公里,充分纵贯江西,从沈阳火车站连到大庆武夷山。

从马尔默站发车至武夷山430余公里(截图来自百度地图)

斯蒂比兹因此成为远程总计第一人。

而是,Model
I只可以做复数的四则运算,不可编程,当Bell的工程师们想将它的听从扩大到多项式总结时,才发现其线路被规划死了,根本改观不得。它更像是台重型的总括器,准确地说,仍是calculator,而不是computer。

视频直播初窥

视频直播,可以分为 采集,前处理,编码,传输, 服务器处理,解码,渲染

  • 征集: iOS系统因为软硬件体系不多, 硬件适配性相比较好, 所以相比简单.
    而Android端市面上机型众多, 要做些机型的适配工作.PC端是最辛劳的,
    各个奇葩壁画头驱动.所以现在成千上万的中小型直播平台, 都舍弃了PC的直播,
    更有局部直播平台只做iOS端的视频直播.

  • 前处理: 美颜算法,录像的歪曲效果, 水印等都是在这一个环节做.
    最近iOS端最闻明开源框架的自然就是GPUImage.其中内置了125种渲染效果,
    还襄助各种本子自定义. 我高仿的喵播的美颜效能也是按照GPUImage的.

  • 编码:
    重难点在于要在分辨率,帧率,码率,GOP等参数设计上找到最佳平衡点。iOS8随后,
    Apple开放了VideoToolbox.framework, 可以平素举行硬编解码,
    这也是为啥现在多数直播平台最低只补助到iOS8的原因之一.
    iOS端硬件兼容性相比好, 可以一向运用硬编码.
    而Android得硬编码又是一大坑.

  • 传输: 这块一般都是交由CDN服务商.
    CDN只提供带宽和服务器之间的传输,
    发送端和接收端的网络连接抖动缓存依然要协调实现的.近年来国内最大的CDN服务商应该是网宿.

  • 服务器处理: 需要在服务器做一些流处理工作,
    让推送上来的流适配各样平台各类不同的商谈, 比如:RTMP,HLS,FLV…

  • 解码和渲染: 也就即音视频的播放. 解码毫无疑问也非得要硬解码.
    iOS端兼容较好, Android依旧大坑.这块的困难在于音画同步,
    近来广大直播平台这块是硬伤.国内相比好的开源项目相应是B站开源的<a
    href=”https://github.com/Bilibili/ijkplayer"&gt;ijkplayer
    </a>. 斗鱼就是按照<a
    href=”https://github.com/Bilibili/ijkplayer"&gt;ijkplayer
    </a>的, 本项目也是遵照<a
    href=”https://github.com/Bilibili/ijkplayer"&gt;ijkplayer
    </a>的.

技能坑 : 降噪, 音频解码器, 蓝牙适配, 回声消除, 信令控制, 登录, 鉴权,
权限管理, 状态管理, 应用新闻, 信息推送, 礼物系统, 即时闲聊, 支付系列,
总结系统, 数据库, 缓存, 分布式文件存储, 音信队列,
运维系统等等大小不一的坑等你来填!!!

成本坑 : 以带宽为例, 2万人同时在线, 手机码率在600KB,
每个月的带宽费用至少在30万左右. 依据欢聚时代(YY)15年四季度财务报,
他们的带宽成本为人民币1.611亿元, 折合每月5000万+.
人力成本+渠道支出和其他支出就一无所知谈了.

社会坑: 还得时刻与各类黑暗势力斗争, 包括色情, 广告, 刷大号,
刷充值, 告侵权, DDos…(我反编译喵播的官方APP,
他们的项目名就叫Shehui, O(∩_∩)O哈哈~)

Harvard Mark系列

稍晚些时候,踏足机电总结领域的还有加州莫斯科分校大学。当时,有一名正在南开攻读物理PhD的学童——艾肯,和当年的祖思一样,被手头繁复的盘算苦恼着,一心想建台统计机,于是从1937年起来,抱着方案四处寻找合作。第一家被拒,第二家被拒,第三家到底伸出了橄榄枝,便是IBM。

霍华德(Howard)·艾肯(Howard Hathaway Aiken
1900-1973),花旗国物工学家、总计机科学先驱。

1939年三月31日,IBM和印度孟买理工草签了最后的商事:

1、IBM为科尔多瓦希伯来建造一台自动统计机器,用于缓解科学统计问题;

2、早稻田免费提供建造所需的底蕴设备;

3、哈工大指定一些人士与IBM合作,完成机器的宏图和测试;

4、全部新加坡国立人士签订保密协议,珍贵IBM的技巧和表明权利;

5、IBM既不收受补偿,也不提供额外经费,所建总计机为复旦的资产。

乍一看,砸了40~50万加元,IBM似乎捞不到此外好处,事实上人家大商店才不在意这一点小钱,首如果想借此显示团结的实力,提升商家声誉。然则世事难料,在机器建好之后的礼仪上,早稻田音讯办公室与艾肯私自准备的音信稿中,对IBM的功绩没有给予丰硕的认可,把IBM的主管沃森气得与艾肯老死不相往来。

实际上,印度孟买理工这边由艾肯主设计,IBM这边由莱克(Clair(Claire) D.
Lake)、哈密尔敦(Francis E. 哈密尔敦(Hamilton))、德菲(本杰明(Benjamin)Durfee)三名工程师主建造,按理,双方单位的孝敬是对半的。

1944年十月,(从左至右)汉森尔顿、莱克、艾肯、德菲站在马克(Mark)I前合影。(图片来源http://www-03.ibm.com/ibm/history/exhibits/markI/markI\_album.html)

于1944年到位了这台Harvard 马克 I, 在娘家叫做IBM自动顺序控制统计机(IBM
Automatic Sequence Controlled Calculator),ASCC。

马克(Mark)I长约15.5米,高约2.4米,重约5吨,撑满了整套实验室的墙面。(图片源于《A
Manual of Operation for the Automatic Sequence Controlled
Calculator》,下同。)

同祖思机一样,MarkI也由此穿孔带拿到指令。穿孔带每行有24个空位,前8位标识用于存放结果的寄存器地址,中间8位标识操作数的寄存器地址,后8位标识所要举办的操作——结构早已不行相近后来的汇编语言。

马克 I的穿孔带读取器以及织布机一样的穿孔带支架

给穿孔带来个五颜六色特写(图片来源维基「Harvard 马克(Mark) I」词条)

这么严酷地架好(截图来自CS101《Harvard 马克 I》,下同。)

场馆之壮观,犹如挂面制作现场,这就是70年前的APP啊。

关于数目,MarkI内有72个增长寄存器,对外不可见。可见的是另外60个24位的常数寄存器,通过开关旋钮置数,于是就有了如此蔚为壮观的60×24旋钮阵列:

别数了,这是两面30×24的旋钮墙无误。

在现今俄亥俄奥斯汀分校大学正确核心陈列的马克(Mark)I上,你不得不看到一半旋钮墙,这是因为那不是一台完整的马克I,此外部分保存在IBM及史密森尼博物院。(截图来自CS50《Harvard Mark I》)

再就是,马克(Mark)I还足以透过穿孔卡片读入数据。最后的计量结果由一台打孔器和两台活动打字机输出。

用以出口结果的自行打字机(截图来自CS101《Harvard 马克 I》)

po张加州圣巴巴拉分校馆藏在不利中央的真品(截图来自CS50《Harvard 马克 I》)

下面让大家来大概瞅瞅它其中是怎么运作的。

这是一副简化了的马克I驱动机构,左下角的电机带动着一行行、一列列纵横啮合的齿轮不停转动,最后靠左上角标注为J的齿轮去带动计数齿轮。(原图来源《A
Manual of Operation for the Automatic Sequence Controlled
Calculator》,下同。)

理所当然马克(Mark)I不是用齿轮来表示最后结出的,齿轮的团团转是为着接通表示不同数字的线路。

咱俩来探望这一机关的塑料外壳,其里面是,一个由齿轮带动的电刷可分别与0~9十个岗位上的导线接通。

齿轮和电刷是可离合的,若它们不接触,任齿轮不停旋转,电刷是不动的。艾肯将300皮秒的机械周期细分为16个时间段,在一个周期的某一时间段,靠磁力吸附使齿轮和电刷发生关系齿轮通过轴带动电刷旋转。吸附从前的时刻是空转,从吸附起首,周期内的剩余时间便用来开展精神的旋转计数和进位工作。

另外复杂的电路逻辑,则理所当然是靠继电器来完成。

艾肯设计的统计机并不局限于一种材料实现,在找到IBM往日,他还向一家制作传统机械式桌面统计器的营业所提出过合作请求,假如这家铺子同意合作了,那么马克I最终极可能是纯机械的。后来,1947年成功的马克(Mark)II也表明了这或多或少,它大体上仅是用继电器实现了马克(Mark)I中的机械式存储部分,是马克I的纯继电器版本。1949年和1952年,又各自出生了半电子(二极管继电器混合)的MarkIII和纯电子的马克 IV。

说到底,关于这一多级值得一提的,是随后常拿来与冯·诺依曼结构做比较的内华达教堂山分校结构,与冯·诺依曼结构统一存储的做法各异,它把指令和数据分开储存,以获取更高的实施效用,相对的,付出了统筹复杂的代价。

二种存储结构的直观比较(图片来源《ARMv4指令集嵌入式微处理器设计》)

就这样趟过历史,逐渐地,这么些长时间的事物也变得与大家亲爱起来,历史与先天历来没有脱节,脱节的是大家局限的咀嚼。往事并非与现时毫无关系,大家所熟稔的壮烈创建都是从历史五遍又一回的更迭中脱胎而出的,那几个前人的聪明串联着,会聚成流向我们、流向将来的灿烂银河,我掀开它的惊鸿一瞥,陌生而熟练,心里头热乎乎地涌起一阵难以言表的惊艳与喜悦,这便是商量历史的野趣。

早期准备

品类重倘若遵照<a
href=”https://github.com/Bilibili/ijkplayer"&gt;ijkplayer </a>的.
最好是打包成framework. 原本自己准备写一个装进教程,
不过后来在简书上发现了一篇专门详细的打包blog, 分享给我们: <a
href=”http://www.jianshu.com/p/1f06b27b3ac0"&gt;http://www.jianshu.com/p/1f06b27b3ac0&lt;/a&gt;.

假如你按照教程打包失败了(当然这种概率相比小),
我这还有一份本身已经打包好的(Release版), 下载地址:
链接:http://pan.baidu.com/s/1eRVetdK
密码:2dc0
下载后, 直接解压即可.

Model K

1937年,斯蒂比兹察觉到继电器的开闭意况与二进制之间的关联。他做了个实验,用两节电池、五个继电器、三个指令灯,以及从易拉罐上剪下来的触片组成一个大概的加法电路。

(图片来源http://www.vcfed.org/forum/showthread.php?5273-Model-K)

按下右手触片,相当于0+1=1。(截图来自《AT&T Archives: Invention of the
First Electric Computer》,下同。)

按下右边触片,相当于1+0=1。

与此同时按下几个触片,相当于1+1=2。

有简友问到具体是怎么落实的,我从未查到相关资料,但通过与同事的探索,确认了一种有效的电路:

开关S1、S2分别控制着继电器R1、R2的开闭,出于简化,这里没有画出开关对继电器的操纵线路。继电器可以视为单刀双掷的开关,R1默认与上触点接触,R2默认与下触点接触。单独S1关闭则R1在电磁效率下与下触点接触,接通回路,A灯亮;单独S2密闭则R2与上触点接触,A灯亮;S1、S2同时关闭,则A灯灭,B灯亮。诚然这是一种粗糙的方案,仅仅在表面上实现了最终效果,没有反映出二进制的加法过程,有理由相信,大师的原规划也许精妙得多。

因为是在厨房(kitchen)里搭建的模型,斯蒂比兹的婆姨名叫Model K。Model
K为1939年修建的Model I——复数总计机(Complex Number
Computer)做好了陪衬。

联系我

<a href=”https://github.com/SunLiner"&gt;github&lt;/a&gt;

<a
href=”http://www.weibo.com/5589163526/profile?rightmod=1&wvr=6&mod=personinfo&is\_all=1"&gt;微博&lt;/a&gt;

<a
href=”http://www.jianshu.com/users/9723687edfb5/latest\_articles"&gt;简书&lt;/a&gt;

上一篇:现代处理器真正的高祖——超过时代的宏大思想

类别下载地址

<a
href=”https://github.com/SunLiner/MiaowShow"&gt;GitHub下载地址&lt;/a&gt;
请star和fork. 后续的bug会持续更新到github上的.
有题目可以在简书给自己留言/私信, 或者博客园(简书个人上首页有本人的乐乎)私信我.

9月9日黎明改进: 项目现已合并录像直播推流
blog地址详解<a
href=”http://www.jianshu.com/p/8ea016b2720e"&gt;快速集成iOS基于RTMP的视频推流&lt;/a&gt;

Model II

第二次大战期间,米国要研制高射炮自动瞄准装置,便又有了研制总括机的需求,继续由斯蒂比兹负责,便是于1943年完成的Model
II——Relay Interpolator(继电器插值器)。

Model
II起初利用穿孔带举办编程,共统筹有31条指令,最值得一提的要么编码——二-五编码。

把继电器分成两组,一组五位,用来表示0~4,另一组两位,用来代表是否要加上一个5——算盘既视感。(截图来自《总结机技术发展史(一)》)

你会意识,二-五编码比上述的任一种编码都要浪费位数,但它有它的强劲之处,便是自校验。每一组继电器中,有且仅有一个继电器为1,一旦出现六个1,或者全是0,机器就能即刻发现题目,由此大大进步了可靠性。

Model II之后,一贯到1950年,Bell实验室还陆续推出了Model III、Model
IV、Model V、Model
VI,在处理器发展史上占据一席之地。除了战后的VI返璞归真用于复数总括,此外都是部队用途,可见战争真的是技术改进的催化剂。

品种下载地址

<a
href=”https://github.com/SunLiner/MiaowShow"&gt;GitHub下载地址&lt;/a&gt;

制表机(tabulator/tabulating machine/unit record equipment/electric accounting machine)

从1790年起来,美利坚合众国的人口普查基本每十年举行五回,随着人口繁衍和移民的加码,人口数量这是一个爆裂。

前十次的人口普查结果(图片截自维基「米国 Census」词条)

自家做了个折线图,可以更直观地感受这洪水猛兽般的增长之势。

不像前日以此的互联网时代,人一出生,各个音信就曾经电子化、登记好了,甚至仍能数据挖掘,你不可以想像,在分外总括设备简陋得基本只好靠手摇举办四则运算的19世纪,千万级的人口总计就早已是及时米利坚政党所不可以接受之重。1880年开头的第十次人口普查,历时8年才最后成就,也就是说,他们休息上两年之后将要最先第十几回普查了,而这一遍普查,需要的年华或者要超越10年。本来就是十年总括一回,假设老是耗时都在10年以上,还总计个鬼啊!

随即的食指调查办公室(1903年才正式建立美利坚合众国人数调查局)方了,赶紧征集能减轻手工劳动的发明,就此,霍尔瑞斯带着她的制表机完虐竞争对手,在方案招标中脱颖而出。

赫尔曼·霍尔瑞斯(Herman Hollerith 1860-1929),美利哥发明家、商人。

霍尔瑞斯的制表机第一次将穿孔技术使用到了多少存储上,一张卡片记录一个居民的各种消息,就像身份证一样一一对应。聪明如你势必能联想到,通过在卡片对应地方打洞(或不打洞)记录音讯的法子,与现代电脑中用0和1象征数据的做法简直一毛一样。确实这足以看作是将二进制应用到电脑中的思想萌芽,但当下的宏图还不够成熟,并未能最近这样巧妙而丰裕地应用宝贵的贮存空间。举个例子,我们前些天一般用一位数据就可以表示性别,比如1意味着男性,0意味女性,而霍尔瑞斯在卡片上用了三个职位,表示男性就在标M的地方打孔,女性就在标F的地方打孔。其实性别还集合,表示日期时浪费得就多了,12个月需要12个孔位,而真正的二进制编码只需要4位。当然,这样的局限与制表机中简易的电路实现有关。

1890年用于人口普查的穿孔卡片,右下缺角是为了制止不小心放反。(图片源于《Hollerith
1890 Census Tabulator》)

有特另外打孔员使用穿孔机将居民音讯戳到卡片上,操作面板放大了孔距,方便打孔。(原图来源《Hollerith
1890 Census Tabulator》)

仔细如您有没有发现操作面板居然是弯的(图片源于《Hollerith 1890 Census
Tabulator》)

有没有一些熟谙的赶脚?

是的,简直就是现在的血肉之躯工程学键盘啊!(图片来源于网络)

这真的是即时的身子工程学设计,目的是让打孔员每日能多打点卡片,为了节省时间他们也是蛮拼的……

在制表机前,穿孔卡片/纸带在各样机具上的功能重假诺储存指令,相比较有代表性的,一是贾卡的提花机,用穿孔卡片控制经线提沉(详见《现代电脑真正的高祖》),二是自动钢琴(player
piano/pianola),用穿孔纸带控制琴键压放。

贾卡提花机

事先很火的日剧《西部世界》中,每便循环起来都会给一个自动钢琴的特写,弹奏起类似平静安逸、实则诡异违和的背景乐。

为了显示霍尔瑞斯的开创性应用,人们平昔把这种存储数据的卡片叫做「Hollerith
card」。(截图来自百度翻译)

打好了孔,下一步就是将卡片上的音信总结起来。

读卡装置(原图来源专利US395781)

制表机通过电路通断识别卡上音讯。读卡装置底座中内嵌着与卡片孔位一一对应的管状容器,容器里盛有水银,水银与导线相连。底座上方的压板中嵌着同一与孔位一一对应的金属针,针抵着弹簧,可以伸缩,压板的上上边由导电材料制成。这样,当把卡片放在底座上,按下压板时,卡片有孔的地点,针可以通过,与水银接触,电路接通,没孔的地点,针就被屏蔽。

读卡原理示意图,图中标p的针都穿过了卡片,标a的针被挡住。(图片源于《Hollerith
1890 Census Tabulator》)

什么样将电路通断对应到所急需的总括信息?霍尔瑞斯在专利中提交了一个简约的例证。

论及性别、国籍、人种三项音信的总计电路图,虚线为控制电路,实线为办事电路。(图片来源专利US395781,下同。)

实现这一效果的电路能够有多种,巧妙的接线可以节约继电器数量。这里我们只分析上头最基础的接法。

图中有7根金属针,从左至右标的分级是:G(类似于总开关)、Female(女)、Male(男)、Foreign(外国籍)、Native(本国籍)、Colored(有色人种)、惠特e(白种人)。好了,你到底能看懂霍尔瑞斯龙飞凤舞的笔迹了。

以此电路用于总括以下6项构成信息(分别与图中标M的6组电磁铁对应):

① native white males(本国的白种男)

② native white females(本国的白种女)

③ foreign white males(外国的白种男)

④ foreign white females(外国的白种女)

⑤ colored males(非白种男)

⑥ colored females(非白种女)

以第一项为例,假如表示「Native」、「惠特e」和「Male」的针同时与水银接触,接通的控制电路如下:

描死我了……

这一演示首先呈现了针G的效益,它把控着拥有控制电路的通断,目标有二:

1、在卡片上留出一个专供G通过的孔,以防范卡片没有放正(照样可以有一对针穿过错误的孔)而总计到错误的音信。

2、令G比此外针短,或者G下的水银比此外容器里少,从而保证其他针都已经触发到水银之后,G才最终将总体电路接通。我们清楚,电路通断的一念之差便于暴发火花,这样的筹划可以将此类元器件的耗费集中在G身上,便于中期维护。

只可以惊叹,这个发明家做规划真正特别实用、细致。

上图中,橘藏青色箭头标识出3个照应的继电器将关闭,闭合之后接通的工作电路如下:

上标为1的M电磁铁完成计数工作

通电的M将发生磁场,
牵引特定的杠杆,拨动齿轮完成计数。霍尔瑞斯的专利中尚无交给这一计数装置的具体社团,可以想像,从十七世纪先河,机械总计机中的齿轮传动技术早已提高到很干练的水准,霍尔瑞斯无需再度设计,完全可以运用现成的设置——用他在专利中的话说:「any
suitable mechanical counter」(任何方便的机械计数器都OK)。

M不单控制着计数装置,还控制着分类箱盖子的开合。

分类箱侧视图,简单明了。

将分类箱上的电磁铁接入工作电路,每便完成计数的还要,对应格子的盖子会在电磁铁的效能下自行打开,总括员瞟都不用瞟一眼,就足以左手右手一个快动作将卡片投到正确的格子里。由此形成卡片的敏捷分类,以便后续开展其他方面的总计。

接着自己右侧一个快动作(图片源于《Hollerith 1890 Census
Tabulator》,下同。)

天天工作的最后一步,就是将示数盘上的结果抄下来,置零,第二天持续。

1896年,霍尔瑞斯创造了制表机集团(The Tabulating Machine
Company),1911年与此外三家商店统一成立Computing-Tabulating-Recording
Company(CTR),1924年改名为International Business Machines
Corporation(国际商业机器公司),就是前几日红得发紫的IBM。IBM也由此在上个世纪风风火火地做着它拿手的制表机和处理器产品,成为一代霸主。

制表机在即时成为与机械总计机并存的两大主流统计设备,但前者通常专用于大型总结工作,后者则一再只好做四则运算,无一负有通用统计的能力,更大的变革将在二十世纪三四十年份掀起。

前言

本年1月份,斗鱼腾讯领投的1亿比索融资的音信被各大平台报道转载,在电竞、泛娱乐已是热门投资的立时,网络直播平台自然也拿到了各行各业的关切。盗用两张有关游戏直播的自由化图

游玩直播规模

玩耍直播规模

这还只有是游玩直播这块的蛋糕.直播行业的竞争会愈来愈强烈,
不管是主播依然直播平台都面临着可以的竞争, 当然直播行业也会越加规范,
直播元素也进一步多.

机电时期(19世纪末~20世纪40年代)

我们难以了解总结机,也许根本并不由于它复杂的机理,而是根本想不知晓,为何一通上电,那坨铁疙瘩就突然能快速运转,它安安静静地到底在干些什么。

通过前几篇的商讨,大家早已精晓机械总括机(准确地说,我们把它们称为机械式桌面统计器)的做事方法,本质上是因而旋钮或把手带动齿轮转动,这一进程全靠手动,肉眼就能看得清清楚楚,甚至用现时的乐高积木都能促成。麻烦就劳动在电的引入,电这样看不见摸不着的菩萨(当然你可以摸摸试试),正是让电脑从笨重走向传奇、从简单明了走向令人费解的严重性。

花色编译环境

Xcode7(及以上)
最为是将项目跑在真机上. 有些地点模拟器是不襄助的, 也看不到任何功效的,
比如硬编码/智能美颜等, 这么些功效模块, 我做了限制的, 需要真机状态才能举办.

Z3

Z3的寿命比Z1还短,从1941年建造完成,到1943年被炸掉(是的,又被炸毁了),就活了两年。好在战后到了60年代,祖思的营业所做出了周详的复制品,比Z1的仿制品靠谱得多,藏于德意志联邦共和国博物馆,至今还是可以运行。

德意志联邦共和国博物馆展出的Z3复制品,内存和CPU六个大柜子里装满了继电器,操作面板俨而明日的键盘和突显器。(原图来自维基「Z3
(computer)」词条)

由于祖思一脉相承的统筹,Z3和Z1有着一毛一样的体系布局,只不过它改用了电磁继电器,内部逻辑不再需要靠复杂的教条运动来贯彻,只要接接电线就可以了。我搜了一大圈,没有找到Z3的电路设计资料——因着祖思是德意志联邦共和国人,研商祖思的Rojas教师也是德意志人,更多详尽的资料均为德文,语言不通成了大家接触知识的分野——就让大家简要点,用一个YouTube上的示范录像一睹Z3芳容。

以12+17=19这一算式为例,用二进制表示即:1100+10001=11101。

先经过面板上的按键输入被加数12,继电器们萌萌哒一阵颤巍巍,记录下二进制值1100。(截图来自《Die
Z3 von Konrad Zuse im Deutschen Museum》,下同。)

继电器闭合为1,断开为0。

以同等的法门输入加数17,记录二进制值10001。

按下+号键,继电器们又是一阵萌萌哒摆动,总结出了结果。

在原来存储被加数的地点,得到了结果11101。

本来这只是机械内部的代表,假使要用户在继电器上查看结果,分分钟都成老花眼。

终极,机器将以十进制的花样在面板上显示结果。

除外四则运算,Z3比Z1还新增了开平方的功用,操作起来都一定便宜,除了速度稍微慢点,完全顶得上现在最简便的这种电子总括器。

(图片来源于网络)

值得一提的是,继电器的触点在开闭的刹那间便于招惹火花(这跟大家现在插插头时会现身火花一样),频繁通断将严重缩水使用寿命,这也是继电器失效的重中之重原因。祖思统一将有着线路接到一个筋斗鼓,鼓表面交替覆盖着金属和绝缘材料,用一个碳刷与其接触,鼓旋转时即暴发电路通断的效能。每周期,确保需闭合的继电器在鼓的金属面与碳刷接触以前关闭,火花便只会在转动鼓上发出。旋转鼓比继电器耐用得多,也容易转换。假使你还记得,不难察觉这一做法与霍尔瑞斯制表机中G针的配备如出一辙,不得不感叹那些发明家真是英雄所见略同。

除去上述这种「随输入随总计」的用法,Z3当然还襄助运行预先编好的先后,不然也无力回天在历史上享有「第一台可编程总括机器」的声望了。

Z3提供了在胶卷上打孔的装备

输入输出、内存读写、算术运算——Z3共鉴别9类指令。其中内存读写指令用6位标识存储地方,即寻址空间为64字,和Z1一样。(截图来自《Konrad
Zuse’s legacy: the architecture of the Z1 and Z3》)

由穿孔带读取器读出指令

1997~1998年间,Rojas助教将Z3评释为通用图灵机(UTM),但Z3本身并未提供规范分支的能力,要促成循环,得粗暴地将穿孔带的两岸接起来形成环。到了Z4,终于有了标准分支,它接纳两条穿孔带,分别作为主程序和子程序。Z4连上了打字机,能将结果打印出来。还扩展了指令集,帮助正弦、最大值、最小值等丰盛的求值功效。甚而至于,开创性地应用了仓库的定义。但它回归到了机械式存储,因为祖思希望扩展内存,继电器仍然体积大、成本高的老问题。

简单的讲,Z连串是一代更比一代强,除了这里介绍的1~4,祖思在1941年建立的店家还陆续生产了Z5、Z11、Z22、Z23、Z25、Z31、Z64等等等等产品(当然前面的泛滥成灾着手拔取电子管),共251台,一路欢歌,如火如荼,直到1967年被西门子吞并,成为这一国际巨头体内的一股灵魂之血。

花色详解

  • tip1: 判读网络类型.

在观望直播的时候, 我们平常都是用WiFi或者3/4G(土豪级另外),
一般用户在拓展网络切换的时候, 我们都要提交友善的唤起, 告诉TA:
您的网络状态切换来了XX状态. 假若用户从WiFi切换来4G,
你的行使也没个提示, 导致TA的流量归零甚至欠了运营商一臀部的钱,
我想你的APP的用户体验也就归零或者为负了.

俺们得以采取苹果的Reachability构成下面的代码实时监听网络状态的变动

typedef NS_ENUM(NSUInteger, NetworkStates) {
    NetworkStatesNone, // 没有网络
    NetworkStates2G, // 2G
    NetworkStates3G, // 3G
    NetworkStates4G, // 4G
    NetworkStatesWIFI // WIFI
};

// 判断网络类型
+ (NetworkStates)getNetworkStates
{
    NSArray *subviews = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    // 保存网络状态
    NetworkStates states = NetworkStatesNone;
    for (id child in subviews) {
        if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
            //获取到状态栏码
            int networkType = [[child valueForKeyPath:@"dataNetworkType"] intValue];
            switch (networkType) {
                case 0:
                   //无网模式
                    states = NetworkStatesNone;
                    break;
                case 1:
                    states = NetworkStates2G;
                    break;
                case 2:
                    states = NetworkStates3G;
                    break;
                case 3:
                    states = NetworkStates4G;
                    break;
                case 5:
                {
                    states = NetworkStatesWIFI;
                }
                    break;
                default:
                    break;
            }
        }
    }
    //根据状态选择
    return states;
}
  • tip2: 登录模块

固然你多运行两遍就会发现,
登录模块背景中播放的视频是2个视频每便随机播放一个的.并且是十分重复的,
也就是说只要您直接呆着登录界面, 就会单视频循环播放当下的视频.
这儿的报到只是多少个按钮, 没有具体的记名逻辑,
随便点哪一个按钮都可以进入首页.

咱俩需要监听视频, 是否播放完成.

// 监听视频是否播放完成
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinish) name:IJKMPMoviePlayerPlaybackDidFinishNotification object:nil];

设若播放完成了, 让IJKFFMoviePlayerController再次play即可

- (void)didFinish
{
    // 播放完之后, 继续重播
    [self.player play];
}
  • tip3: 首页

首页

那种效能相信广大人都看出过仍然做过.我大概说一下自己的做法(不必然是一级的,
只是提供一个思路)

一个父控制器HomeViewController+五个子控制器(最热/最新/关注.
每个控制器各自管理自己的业务逻辑, 高内聚低耦合).
重写HomeViewControllerloadView,
self.view替换成UIScrollView.
将五个子控制器的view添加到UIScrollView上即可. 其他的效果实现,
请参照我的代码, 都有详实的中文注释.

  • tip4: 直播(面向观众端)
    这多少个是成套项目标机要之一了.这种直播的布局, 应该是相比较主流的了.
    我下载的不少直播类APP都是其一项目布局,
    包括YY也是这种界面布局.这一个里面涉及的东西相比多了, 三言两语真说不清.

简短说一下早已实现的功能:
A: 主播的直播
B: 关联主播的视频直播, 默认是只有界面, 没有声息的.
点击该视图可以切换来此主播
C: 下拉切换另一个主播, 这个意义是很宽泛的.
做法是直播控制器是一个UICollectionViewController, 只有一个cell,
cell.frame就是self.collectionViewb.bounds.
我们进去直播控制器的时候, 其实是传进去一个关系主播数组,
每一趟下拉的时候, 就加载数组里面的主播
D. 查看观众席的观众详情
E. 查看主播详情
F. 足迹: 粒子动画, 后边详解
G. 弹幕: 点击最下方的工具栏第一个按钮可以打开/关闭弹幕, 后边详解

  • tip5: 粒子动画实现游客足迹
    粒子动画的layer是增长到播放器的view下面的. 下边代码有详细的阐明

CAEmitterLayer *emitterLayer = [CAEmitterLayer layer];
// 发射器在xy平面的中心位置
emitterLayer.emitterPosition = CGPointMake(self.moviePlayer.view.frame.size.width-50,self.moviePlayer.view.frame.size.height-50);
// 发射器的尺寸大小
emitterLayer.emitterSize = CGSizeMake(20, 20);
// 渲染模式
emitterLayer.renderMode = kCAEmitterLayerUnordered;
// 开启三维效果
//    _emitterLayer.preservesDepth = YES;
NSMutableArray *array = [NSMutableArray array];
// 创建粒子
for (int i = 0; i<10; i++) {
    // 发射单元
    CAEmitterCell *stepCell = [CAEmitterCell emitterCell];
    // 粒子的创建速率,默认为1/s
    stepCell.birthRate = 1;
    // 粒子存活时间
    stepCell.lifetime = arc4random_uniform(4) + 1;
    // 粒子的生存时间容差
    stepCell.lifetimeRange = 1.5;
    // 颜色
    // fire.color=[[UIColor colorWithRed:0.8 green:0.4 blue:0.2 alpha:0.1]CGColor];
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"good%d_30x30", i]];
    // 粒子显示的内容
    stepCell.contents = (id)[image CGImage];
    // 粒子的名字
    //            [fire setName:@"step%d", i];
    // 粒子的运动速度
    stepCell.velocity = arc4random_uniform(100) + 100;
    // 粒子速度的容差
    stepCell.velocityRange = 80;
    // 粒子在xy平面的发射角度
    stepCell.emissionLongitude = M_PI+M_PI_2;;
    // 粒子发射角度的容差
    stepCell.emissionRange = M_PI_2/6;
    // 缩放比例
    stepCell.scale = 0.3;
    [array addObject:stepCell];
}

emitterLayer.emitterCells = array;
[self.moviePlayer.view.layer insertSublayer:emitterLayer below:self.catEarView.layer];

 _renderer = [[BarrageRenderer alloc] init];
// 设置弹幕的显示区域. 基于父控件的.
_renderer.canvasMargin = UIEdgeInsetsMake(ALinScreenHeight * 0.3, 10, 10, 10);
[self.contentView addSubview:_renderer.view];

弹幕配置

#pragma mark - 弹幕描述符生产方法
/// 生成精灵描述 - 过场文字弹幕
- (BarrageDescriptor *)walkTextSpriteDescriptorWithDirection:(NSInteger)direction
{
    BarrageDescriptor * descriptor = [[BarrageDescriptor alloc]init];
    descriptor.spriteName = NSStringFromClass([BarrageWalkTextSprite class]);
    descriptor.params[@"text"] = self.danMuText[arc4random_uniform((uint32_t)self.danMuText.count)];
    descriptor.params[@"textColor"] = Color(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256));
    descriptor.params[@"speed"] = @(100 * (double)random()/RAND_MAX+50);
    descriptor.params[@"direction"] = @(direction);
    descriptor.params[@"clickAction"] = ^{
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:@"弹幕被点击" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil];
        [alertView show];
    };
    return descriptor;
}

末尾一步, 千万要记得start

[_renderer start];
  • tip7: 智能美颜效用
    前些天的直播平台, 美颜是标配.
    不然绝大多数的主播都是没法看的.美颜算法需要用到GPU编程,
    需要懂图像处理的人. 图像处理这一块我不是很谙习,
    相关的文献也是看得云里雾里的. 所以, 仍然接纳开源的车轱辘:<a
    href=”https://github.com/BradLarson/GPUImage"&gt; GPUImage
    </a>. 这多少个开源框架有近1.3W+star(9月5日数码), 真不是盖的,
    内置125种滤镜效果, 没有你不意, 只有你不会用.
    我的项目中都有详实的用法, 仍然很简短的.
    在此处摘抄一份其.h文件的注释. 一方面方便我们修改我项目中的美颜效率,
    另一方面也是做个备份.(具体出处自己真忘了, 如若有人找到了源地址链接,
    可以互换我加上)

#import "GLProgram.h"

// Base classes
#import "GPUImageOpenGLESContext.h"
#import "GPUImageOutput.h"
#import "GPUImageView.h"
#import "GPUImageVideoCamera.h"
#import "GPUImageStillCamera.h"
#import "GPUImageMovie.h"
#import "GPUImagePicture.h"
#import "GPUImageRawDataInput.h"
#import "GPUImageRawDataOutput.h"
#import "GPUImageMovieWriter.h"
#import "GPUImageFilterPipeline.h"
#import "GPUImageTextureOutput.h"
#import "GPUImageFilterGroup.h"
#import "GPUImageTextureInput.h"
#import "GPUImageUIElement.h"
#import "GPUImageBuffer.h"

// Filters
#import "GPUImageFilter.h"
#import "GPUImageTwoInputFilter.h"


#pragma mark - 调整颜色 Handle Color

#import "GPUImageBrightnessFilter.h"                //亮度
#import "GPUImageExposureFilter.h"                  //曝光
#import "GPUImageContrastFilter.h"                  //对比度
#import "GPUImageSaturationFilter.h"                //饱和度
#import "GPUImageGammaFilter.h"                     //伽马线
#import "GPUImageColorInvertFilter.h"               //反色
#import "GPUImageSepiaFilter.h"                     //褐色(怀旧)
#import "GPUImageLevelsFilter.h"                    //色阶
#import "GPUImageGrayscaleFilter.h"                 //灰度
#import "GPUImageHistogramFilter.h"                 //色彩直方图,显示在图片上
#import "GPUImageHistogramGenerator.h"              //色彩直方图
#import "GPUImageRGBFilter.h"                       //RGB
#import "GPUImageToneCurveFilter.h"                 //色调曲线
#import "GPUImageMonochromeFilter.h"                //单色
#import "GPUImageOpacityFilter.h"                   //不透明度
#import "GPUImageHighlightShadowFilter.h"           //提亮阴影
#import "GPUImageFalseColorFilter.h"                //色彩替换(替换亮部和暗部色彩)
#import "GPUImageHueFilter.h"                       //色度
#import "GPUImageChromaKeyFilter.h"                 //色度键
#import "GPUImageWhiteBalanceFilter.h"              //白平横
#import "GPUImageAverageColor.h"                    //像素平均色值
#import "GPUImageSolidColorGenerator.h"             //纯色
#import "GPUImageLuminosity.h"                      //亮度平均
#import "GPUImageAverageLuminanceThresholdFilter.h" //像素色值亮度平均,图像黑白(有类似漫画效果)

#import "GPUImageLookupFilter.h"                    //lookup 色彩调整
#import "GPUImageAmatorkaFilter.h"                  //Amatorka lookup
#import "GPUImageMissEtikateFilter.h"               //MissEtikate lookup
#import "GPUImageSoftEleganceFilter.h"              //SoftElegance lookup




#pragma mark - 图像处理 Handle Image

#import "GPUImageCrosshairGenerator.h"              //十字
#import "GPUImageLineGenerator.h"                   //线条

#import "GPUImageTransformFilter.h"                 //形状变化
#import "GPUImageCropFilter.h"                      //剪裁
#import "GPUImageSharpenFilter.h"                   //锐化
#import "GPUImageUnsharpMaskFilter.h"               //反遮罩锐化

#import "GPUImageFastBlurFilter.h"                  //模糊
#import "GPUImageGaussianBlurFilter.h"              //高斯模糊
#import "GPUImageGaussianSelectiveBlurFilter.h"     //高斯模糊,选择部分清晰
#import "GPUImageBoxBlurFilter.h"                   //盒状模糊
#import "GPUImageTiltShiftFilter.h"                 //条纹模糊,中间清晰,上下两端模糊
#import "GPUImageMedianFilter.h"                    //中间值,有种稍微模糊边缘的效果
#import "GPUImageBilateralFilter.h"                 //双边模糊
#import "GPUImageErosionFilter.h"                   //侵蚀边缘模糊,变黑白
#import "GPUImageRGBErosionFilter.h"                //RGB侵蚀边缘模糊,有色彩
#import "GPUImageDilationFilter.h"                  //扩展边缘模糊,变黑白
#import "GPUImageRGBDilationFilter.h"               //RGB扩展边缘模糊,有色彩
#import "GPUImageOpeningFilter.h"                   //黑白色调模糊
#import "GPUImageRGBOpeningFilter.h"                //彩色模糊
#import "GPUImageClosingFilter.h"                   //黑白色调模糊,暗色会被提亮
#import "GPUImageRGBClosingFilter.h"                //彩色模糊,暗色会被提亮
#import "GPUImageLanczosResamplingFilter.h"         //Lanczos重取样,模糊效果
#import "GPUImageNonMaximumSuppressionFilter.h"     //非最大抑制,只显示亮度最高的像素,其他为黑
#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" //与上相比,像素丢失更多

#import "GPUImageSobelEdgeDetectionFilter.h"        //Sobel边缘检测算法(白边,黑内容,有点漫画的反色效果)
#import "GPUImageCannyEdgeDetectionFilter.h"        //Canny边缘检测算法(比上更强烈的黑白对比度)
#import "GPUImageThresholdEdgeDetectionFilter.h"    //阈值边缘检测(效果与上差别不大)
#import "GPUImagePrewittEdgeDetectionFilter.h"      //普瑞维特(Prewitt)边缘检测(效果与Sobel差不多,貌似更平滑)
#import "GPUImageXYDerivativeFilter.h"              //XYDerivative边缘检测,画面以蓝色为主,绿色为边缘,带彩色
#import "GPUImageHarrisCornerDetectionFilter.h"     //Harris角点检测,会有绿色小十字显示在图片角点处
#import "GPUImageNobleCornerDetectionFilter.h"      //Noble角点检测,检测点更多
#import "GPUImageShiTomasiFeatureDetectionFilter.h" //ShiTomasi角点检测,与上差别不大
#import "GPUImageMotionDetector.h"                  //动作检测
#import "GPUImageHoughTransformLineDetector.h"      //线条检测
#import "GPUImageParallelCoordinateLineTransformFilter.h" //平行线检测

#import "GPUImageLocalBinaryPatternFilter.h"        //图像黑白化,并有大量噪点

#import "GPUImageLowPassFilter.h"                   //用于图像加亮
#import "GPUImageHighPassFilter.h"                  //图像低于某值时显示为黑


#pragma mark - 视觉效果 Visual Effect

#import "GPUImageSketchFilter.h"                    //素描
#import "GPUImageThresholdSketchFilter.h"           //阀值素描,形成有噪点的素描
#import "GPUImageToonFilter.h"                      //卡通效果(黑色粗线描边)
#import "GPUImageSmoothToonFilter.h"                //相比上面的效果更细腻,上面是粗旷的画风
#import "GPUImageKuwaharaFilter.h"                  //桑原(Kuwahara)滤波,水粉画的模糊效果;处理时间比较长,慎用

#import "GPUImageMosaicFilter.h"                    //黑白马赛克
#import "GPUImagePixellateFilter.h"                 //像素化
#import "GPUImagePolarPixellateFilter.h"            //同心圆像素化
#import "GPUImageCrosshatchFilter.h"                //交叉线阴影,形成黑白网状画面
#import "GPUImageColorPackingFilter.h"              //色彩丢失,模糊(类似监控摄像效果)

#import "GPUImageVignetteFilter.h"                  //晕影,形成黑色圆形边缘,突出中间图像的效果
#import "GPUImageSwirlFilter.h"                     //漩涡,中间形成卷曲的画面
#import "GPUImageBulgeDistortionFilter.h"           //凸起失真,鱼眼效果
#import "GPUImagePinchDistortionFilter.h"           //收缩失真,凹面镜
#import "GPUImageStretchDistortionFilter.h"         //伸展失真,哈哈镜
#import "GPUImageGlassSphereFilter.h"               //水晶球效果
#import "GPUImageSphereRefractionFilter.h"          //球形折射,图形倒立

#import "GPUImagePosterizeFilter.h"                 //色调分离,形成噪点效果
#import "GPUImageCGAColorspaceFilter.h"             //CGA色彩滤镜,形成黑、浅蓝、紫色块的画面
#import "GPUImagePerlinNoiseFilter.h"               //柏林噪点,花边噪点
#import "GPUImage3x3ConvolutionFilter.h"            //3x3卷积,高亮大色块变黑,加亮边缘、线条等
#import "GPUImageEmbossFilter.h"                    //浮雕效果,带有点3d的感觉
#import "GPUImagePolkaDotFilter.h"                  //像素圆点花样
#import "GPUImageHalftoneFilter.h"                  //点染,图像黑白化,由黑点构成原图的大致图形


#pragma mark - 混合模式 Blend

#import "GPUImageMultiplyBlendFilter.h"             //通常用于创建阴影和深度效果
#import "GPUImageNormalBlendFilter.h"               //正常
#import "GPUImageAlphaBlendFilter.h"                //透明混合,通常用于在背景上应用前景的透明度
#import "GPUImageDissolveBlendFilter.h"             //溶解
#import "GPUImageOverlayBlendFilter.h"              //叠加,通常用于创建阴影效果
#import "GPUImageDarkenBlendFilter.h"               //加深混合,通常用于重叠类型
#import "GPUImageLightenBlendFilter.h"              //减淡混合,通常用于重叠类型
#import "GPUImageSourceOverBlendFilter.h"           //源混合
#import "GPUImageColorBurnBlendFilter.h"            //色彩加深混合
#import "GPUImageColorDodgeBlendFilter.h"           //色彩减淡混合
#import "GPUImageScreenBlendFilter.h"               //屏幕包裹,通常用于创建亮点和镜头眩光
#import "GPUImageExclusionBlendFilter.h"            //排除混合
#import "GPUImageDifferenceBlendFilter.h"           //差异混合,通常用于创建更多变动的颜色
#import "GPUImageSubtractBlendFilter.h"             //差值混合,通常用于创建两个图像之间的动画变暗模糊效果
#import "GPUImageHardLightBlendFilter.h"            //强光混合,通常用于创建阴影效果
#import "GPUImageSoftLightBlendFilter.h"            //柔光混合
#import "GPUImageChromaKeyBlendFilter.h"            //色度键混合
#import "GPUImageMaskFilter.h"                      //遮罩混合
#import "GPUImageHazeFilter.h"                      //朦胧加暗
#import "GPUImageLuminanceThresholdFilter.h"        //亮度阈
#import "GPUImageAdaptiveThresholdFilter.h"         //自适应阈值
#import "GPUImageAddBlendFilter.h"                  //通常用于创建两个图像之间的动画变亮模糊效果
#import "GPUImageDivideBlendFilter.h"               //通常用于创建两个图像之间的动画变暗模糊效果


#pragma mark - 尚不清楚
#import "GPUImageJFAVoroniFilter.h"
#import "GPUImageVoroniConsumerFilter.h"

// 开启硬解码
[option setPlayerOptionValue:@"1" forKey:@"videotoolbox"];

硬编码的采取场景: 我们要将主播的视频数据传送给服务器

透过拍照头来收集图像,然后将收集到的图像,通过硬编码的方法举办编码,最终编码后的多寡将其构成成H264的码流通过网络盛传。

视频头采集图像, iOS系统提供了AVCaptureSession来采访视频头的图像数据.
项目中自我是直接利用<a
href=”https://github.com/BradLarson/GPUImage"&gt; GPUImage
</a>中的GPUImageVideoCamera,
直接设置GPUImageVideoCamera的代办即可,
在其代理方法- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer;进展数据编码即可.

纪事一点:
不管是系统自带的AVCaptureSession还是GPUImageVideoCamera收集到的数量都是未经过编码的CMSampleBuffer.

下一场将收集到的多少, 用iOS开放的VideoToolbox展开硬编码.
关于VideoToolbox硬编解码网上广大科目, 当然最好是看Apple的合法文档,
假使只是硬编码, 看本身的品类即可.

一言九鼎的编码函数(来自YOLO直播负责人的开源项目<a
href=”https://github.com/Guikunzhi/BeautifyFaceDemo"&gt;
BeautifyFaceDemo </a>)

void didCompressH264(void *outputCallbackRefCon, void *sourceFrameRefCon, OSStatus status, VTEncodeInfoFlags infoFlags,
                     CMSampleBufferRef sampleBuffer )
{
    if (status != 0) return;
    // 采集的未编码数据是否准备好
    if (!CMSampleBufferDataIsReady(sampleBuffer))
    {
        NSLog(@"didCompressH264 data is not ready ");
        return;
    }
    ALinH264Encoder* encoder = (__bridge ALinH264Encoder*)outputCallbackRefCon;

    bool keyframe = !CFDictionaryContainsKey((CFArrayGetValueAtIndex(CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, true), 0)), kCMSampleAttachmentKey_NotSync);

    if (keyframe) // 关键帧
    {
        CMFormatDescriptionRef format = CMSampleBufferGetFormatDescription(sampleBuffer);
        size_t sparameterSetSize, sparameterSetCount;
        const uint8_t *sparameterSet;
        OSStatus statusCode = CMVideoFormatDescriptionGetH264ParameterSetAtIndex(format, 0, &sparameterSet, &sparameterSetSize, &sparameterSetCount, 0 );
        if (statusCode == noErr)
        {
            size_t pparameterSetSize, pparameterSetCount;
            const uint8_t *pparameterSet;
            OSStatus statusCode = CMVideoFormatDescriptionGetH264ParameterSetAtIndex(format, 1, &pparameterSet, &pparameterSetSize, &pparameterSetCount, 0 );
            if (statusCode == noErr)
            {
                encoder->sps = [NSData dataWithBytes:sparameterSet length:sparameterSetSize];
                encoder->pps = [NSData dataWithBytes:pparameterSet length:pparameterSetSize];
                NSLog(@"sps:%@ , pps:%@", encoder->sps, encoder->pps);
            }
        }
    }

    CMBlockBufferRef dataBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
    size_t length, totalLength;
    char *dataPointer;
    OSStatus statusCodeRet = CMBlockBufferGetDataPointer(dataBuffer, 0, &length, &totalLength, &dataPointer);
    if (statusCodeRet == noErr) {

        size_t bufferOffset = 0;
        static const int AVCCHeaderLength = 4;
        while (bufferOffset < totalLength - AVCCHeaderLength)
        {
            uint32_t NALUnitLength = 0;
            memcpy(&NALUnitLength, dataPointer + bufferOffset, AVCCHeaderLength);
            NALUnitLength = CFSwapInt32BigToHost(NALUnitLength);
            NSData *data = [[NSData alloc] initWithBytes:(dataPointer + bufferOffset + AVCCHeaderLength) length:NALUnitLength];
            bufferOffset += AVCCHeaderLength + NALUnitLength;
            NSLog(@"sendData-->> %@ %lu", data, bufferOffset);
        }

    }

}

祖思机

康拉德·祖思(Konrad Zuse 1910~1995),德意志土木工程师、发明家。

有些天才决定成为大师,祖思便是这些。读大学时,他就不安分,专业换到换去皆以为无聊,工作以后,在亨舍尔集团到场研商风对机翼的熏陶,对复杂的总括更是忍无可忍。

整天就是在摇总括器,中间结果还要手抄,简直要疯。(截图来自《Computer
History》)

祖思一面抓狂,一面相信还有为数不少人跟她一致抓狂,他见到了商机,觉得这么些世界迫切需要一种能够自动测算的机器。于是一不做二不休,在亨舍尔才呆了多少个月就自然辞职,搬到家长家里啃老,一门心境搞起了发明。他对巴贝奇一无所知,凭一己之力做出了社会风气上第一台可编程总计机——Z1。

参考文献

胡守仁. 总括机技术发展史(一)[M]. 斯特拉斯堡: 国防理工大学出版社, 2004.

Wikipedia. Hans Christian Ørsted[EB/OL].
https://en.wikipedia.org/wiki/Hans\_Christian\_%C3%98rsted, 2016-12-10.

Wikipedia. Michael Faraday[EB/OL].
https://en.wikipedia.org/wiki/Michael\_Faraday, 2016-11-27.

Wikipedia. Relay[EB/OL].
https://en.wikipedia.org/wiki/Relay\#cite\_note-adb-6, 2016-12-20.

Wikipedia. Joseph Henry[EB/OL].
https://en.wikipedia.org/wiki/Joseph\_Henry, 2016-12-03.

Wikipedia. Edward Davy[EB/OL].
https://en.wikipedia.org/wiki/Edward\_Davy, 2016-11-04.

Wikipedia. Unit record equipment[EB/OL].
https://en.wikipedia.org/wiki/Unit\_record\_equipment, 2016-12-29.

陈厚云, 王行刚. 总括机发展简史[M]. 时尚之都: 科学出版社, 1985.

吴为平, 严万宗. 从算盘到电脑[M]. 夏洛特(Charlotte): 吉林教育出版社, 1986.

Wikipedia. United States Census[EB/OL].
https://en.wikipedia.org/wiki/United\_States\_Census, 2017-01-15.

Wikipedia. United States Census Bureau[EB/OL].
https://en.wikipedia.org/wiki/United\_States\_Census\_Bureau,
2017-01-20.

Wikipedia. Herman Hollerith[EB/OL].
https://en.wikipedia.org/wiki/Herman\_Hollerith, 2017-01-08.

Herman Hollerith. Art of Compiling Statistics[P]. 美利坚同盟国专利: 395781,
1889-01-08.

Frank da Cruz. Hollerith 1890 Census Tabulator[EB/OL].
http://www.columbia.edu/cu/computinghistory/census-tabulator.html,
2011-03-28.

Wikipedia. Player piano[EB/OL].
https://en.wikipedia.org/wiki/Player\_piano, 2017-01-20.

Wikipedia. Konrad Zuse[EB/OL].
https://en.wikipedia.org/wiki/Konrad\_Zuse, 2017-01-30.

Largest Dams. Computer History[EB/OL].
https://www.youtube.com/watch?v=HEmFqohbQCI, 2013-12-23.

Wikipedia. Z1 (computer)[EB/OL].
https://en.wikipedia.org/wiki/Z1\_(computer), 2017-04-27.

Rojas R. The Z1: Architecture and Algorithms of Konrad Zuse’s First
Computer[J]. Eprint Arxiv, 2014.

逸之. Z1:第一台祖思机的架构与算法[EB/OL].
http://www.jianshu.com/p/cb2ed00dd04f, 2017-04-07.

柏林(Berlin)随意大学. Architecture and Simulation of the Z1 Computer[EB/OL].
http://zuse-z1.zib.de/.

talentraspel. talentraspel simulator für mechanische schaltglieder
zuse[EB/OL]. https://www.youtube.com/watch?v=4Xojcw3FVgo, 2013-11-12.

Wikipedia. Z2 (computer)[EB/OL].
https://en.wikipedia.org/wiki/Z2\_(computer), 2017-02-23.

Wikipedia. Z3 (computer)[EB/OL].
https://en.wikipedia.org/wiki/Z3\_(computer), 2017-04-14.

Rojas R. Konrad Zuse’s legacy: the architecture of the Z1 and Z3[J].
Annals of the History of Computing IEEE, 1997, 19(2):5-16.

Rojas R. How to make Zuse’s Z3 a universal computer[J]. IEEE Annals of
the History of Computing, 1998, 20(3):51-54.

DeutschesMuseum. Die Z3 von Konrad Zuse im Deutschen Museum[EB/OL].
https://www.youtube.com/watch?v=aUXnhVrT4CI, 2013-10-23.

Wikipedia. Z4 (computer)[EB/OL].
https://en.wikipedia.org/wiki/Z4\_(computer), 2017-05-10.

Wikipedia. George Stibitz[EB/OL].
https://en.wikipedia.org/wiki/George\_Stibitz, 2017-04-24.

Paul E. Ceruzzi. Number, Please-Computers at Bell Labs[EB/OL].
http://ed-thelen.org/comp-hist/Reckoners-ch-4.html.

AT&T Tech Channel. AT&T Archives: Invention of the First Electric
Computer[EB/OL]. https://www.youtube.com/watch?v=a4bhZYoY3lo,
2011-10-19.

history-computer.com. Relay computers of George Stibitz[EB/OL].
http://history-computer.com/ModernComputer/Relays/Stibitz.html.

Wikipedia. Howard H. Aiken[EB/OL].
https://en.wikipedia.org/wiki/Howard\_H.\_Aiken, 2017-07-21.

Wikipedia. Harvard Mark I[EB/OL].
https://en.wikipedia.org/wiki/Harvard\_Mark\_I, 2017-07-04.

Comrie L J. A Manual of Operation for the Automatic Sequence Controlled
Calculator[J]. Nature, 1946, 158:567-568.

CS101. Harvard Mark I[EB/OL].
https://www.youtube.com/watch?v=SaFQAoYV1Nw, 2014-09-13.

CS50. Harvard Mark I[EB/OL].
https://www.youtube.com/watch?v=4ObouwCHk8w, 2014-02-21.

Wikipedia. Harvard Mark II[EB/OL].
https://en.wikipedia.org/wiki/Harvard\_Mark\_II, 2017-08-03.

Wikipedia. Harvard Mark III[EB/OL].
https://en.wikipedia.org/wiki/Harvard\_Mark\_III, 2017-08-03.

Wikipedia. Harvard Mark IV[EB/OL].
https://en.wikipedia.org/wiki/Harvard\_Mark\_IV, 2017-08-03.

陈明敏, 易春分, 石敏. ARMv4指令集嵌入式微处理器设计[J]. 电子技术应用,
2014, 40(12):23-26.


下一篇:敬请期待


连锁阅读

01改动世界:引言

01改变世界:没有统计器的生活怎么过——手动时期的臆度工具

01改成世界:机械之美——机械时代的总结设备

01改动世界:现代总括机真正的天皇——抢先时代的巨大思想

01变动世界:让电代替人工去总计——机电时期的权宜之计


Z1

祖思从1934年起先了Z1的规划与试验,于1938年成功建造,在1943年的一场空袭中炸毁——Z1享年5岁。

俺们早就不能看出Z1的原状,零星的片段照片呈现弥足爱慕。(图片来自http://history-computer.com/ModernComputer/Relays/Zuse.html)

从相片上得以发现,Z1是一坨庞大的机械,除了靠电动马达驱动,没有其余与电相关的预制构件。别看它原本,里头可有好几项甚至沿用至今的开创性理念:


将机械严刻划分为电脑和内存两大一部分,这多亏明日冯·诺依曼连串布局的做法。


不再同前人一样用齿轮计数,而是采用二进制,用穿过钢板的钉子/小杆的来往移动表示0和1。


引入浮点数,相相比之下,后文将关联的部分同时期的微机所用都是定点数。祖思还表明了浮点数的二进制规格化表示,优雅卓殊,后来被纳入IEEE标准。


靠机械零件实现与、或、非等基础的逻辑门,靠巧妙的数学方法用这个门搭建出加减乘除的意义,最完美的要数加法中的并行进位——一步成功有着位上的进位。

与制表机一样,Z1也应用了穿孔技术,但是不是穿孔卡,而是穿孔带,用废弃的35分米电影胶卷制成。和巴贝奇所见略同,祖思也在穿孔带上存储指令,有输入输出、数据存取、四则运算共8种。

简化得不可以再简化的Z1架构示意图

每读一条指令,Z1内部都会带动一大串部件完成一多样复杂的机械运动。具体怎么运动,祖思没有留下完整的叙说。有幸的是,一位德意志的微处理器专家——Raul
Rojas
对关于Z1的图片和手稿举办了大量的钻研和分析,给出了较为完善的阐释,重要见其随想《The
Z1: Architecture and Algorithms of Konrad Zuse’s First
Computer》,而我时代抽风把它翻译了五遍——《Z1:第一台祖思机的架构与算法》。假诺您读过几篇Rojas教师的舆论就会发觉,他的钻研工作可谓壮观,当之无愧是社会风气上最精通祖思机的人。他建立了一个网站——Konrad
Zuse Internet
Archive
,专门搜集整理祖思机的资料。他带的某部学生还编写了Z1加法器的虚假软件,让我们来直观感受一下Z1的精致设计:

从转动三维模型可见,光一个着力的加法单元就早已万分复杂。(截图来自《Architecture
and Simulation of the Z1 Computer》,下同。)

此例演示二进制10+2的处理过程,板带动杆,杆再带来其他板,杆处于不同的职位决定着板、杆之间是否足以联动。平移限定在前后左右六个趋势(祖思称为东南西北),机器中的所有钢板转完一圈就是一个时钟周期。

地点的一堆零件看起来也许仍旧比较散乱,我找到了此外一个基本单元的演示动画。(图片来源《talentraspel
simulator für mechanische schaltglieder zuse》)

幸运的是,退休未来,祖思在1984~1989年间凭着自己的回想重绘Z1的计划图片,并成功了Z1复制品的建造,现藏于德意志技术博物馆。固然它跟原先的Z1并不完全一致——多少会与真情存在出入的记念、后续规划经验或者带来的研讨提升、半个世纪之后材料的迈入,都是潜移默化因素——但其大框架基本与原Z1如出一辙,是后人研商Z1的宝贵财富,也让吃瓜的乘客们可以一睹纯机械总括机的风姿。

在Rojas教师搭建的网站(Konrad Zuse Internet
Archive
)上,提供着Z1复成品360°的高清显示。

本来,这台复制品和原Z1一律不靠谱,做不到长日子无人值守的机动运行,甚至在揭幕仪式上就挂了,祖思花了多少个月才修好。1995年祖思去世后,它就没再运行,成了一具钢铁尸体。

Z1的不可靠,很大程度上归结于机械材料的局限性。用现时的见地看,总结机内部是无与伦比复杂的,简单的教条运动一方面速度不快,另一方面不可以灵活、可靠地传动。祖思早有接纳电磁继电器的想法,无奈这时的继电器不但价钱不低,体积还大。到了Z2,祖思灵机一动,最占零件的只是是机器的仓储部分,何不继续行使机械式内存,而改用继电器来促成电脑吧?

Z2是尾随Z1的第二年出生的,其计划素材一样难逃被炸掉的流年(不由感慨那些动乱的年份啊)。Z2的资料不多,大体可以认为是Z1到Z3的过渡品,它的一大价值是表明了继电器和机械件在促成电脑方面的等效性,也相当于验证了Z3的来头,二大价值是为祖思赢得了建筑Z3的一些帮忙。

贝尔Model系列

一样时期,另一家不容忽视的、研制机电总结机的单位,便是上个世纪叱咤风云的Bell实验室。众所周知,Bell实验室及其所属集团是做电话建立、以通信为重要工作的,即使也做基础研商,但为什么会插足总计机世界啊?其实跟他们的老本行不无关系——最早的电话系统是靠模拟量传输信号的,信号随距离衰减,长距离通话需要动用滤波器和放大器以保险信号的纯度和强度,设计这两样设备时索要处理信号的振幅和相位,工程师们用复数表示它们——几个信号的叠加是两岸振幅和相位的各自叠加,复数的运算法则正好与之相符。这就是全部的导火线,贝尔(Bell)实验室面临着大量的复数运算,全是大概的加减乘除,这哪是脑力活,明显是体力劳动啊,他们为此甚至特意雇佣过5~10名巾帼(当时的跌价劳重力)全职来做这事。

从结果来看,Bell实验室讲明统计机,一方面是来自自己需求,另一方面也从自家技术上得到了启迪。电话的拨号系统由继电器电路实现,通过一组继电器的开闭决定何人与何人举行通话。当时实验室探讨数学的人对继电器并不熟习,而继电器工程师又对复数运算不尽通晓,将双方关系到一头的,是一名叫George·斯蒂比兹的研商员。

George·斯蒂比兹(乔治(George) Stibitz 1904-1995),Bell实验室切磋员。

电动机

汉斯·克莉丝钦·奥斯特(Hans 克赖斯特(Christ)(Christ)ian Ørsted
1777-1851),丹麦王国物翻译家、科学家。Michael·法拉第(Faraday)(Michael 法拉第(Faraday)1791-1867),英帝国物思想家、科学家。

1820年十一月,奥斯特在实验中窥见通电导线会促成附近磁针的偏转,注解了电流的磁效应。第二年,法拉第(Faraday)想到,既然通电导线能带动磁针,反过来,倘诺一定磁铁,旋转的将是导线,于是解放人力的英雄发明——电动机便出生了。

电机其实是件很不希罕、很笨的发明,它只会连续不停地转圈,而机械式桌面计数器的运作本质上就是齿轮的转体,两者简直是天造地设的一双。有了电机,总括员不再需要吭哧吭哧地挥动,做数学也算是少了点体力劳动的眉眼。