效果图

gif1

gif2

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

png1

png2

直达平等篇:现代电脑真正的始祖——超越时代之伟思想

前言

本年三月份,斗鱼腾讯领投的1亿美元融资的信息让列大平台报道转载,在电竞、泛娱乐已是热门投资之即刻,网络直播平台自也获得了各行各业的关切。盗用两摆有关游戏直播的样子图

玩直播规模

打直播规模

即时还仅仅是一日游直播这块的蛋糕.直播业之竞争会愈发烈,
不管是主播还是直播平台都面临着热烈的竞争, 当然直播行业吗会见越来越规范,
直播元素也越多.


视频直播初窥

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

  • 募集: 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哈哈~)

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

咱俩难以掌握计算机,也许根本并无由它们复杂的机理,而是从想不掌握,为什么同样通上电,这堆铁疙瘩就忽然能够很快运转,它安安安静地到底在事关几什么。

通过前几乎首之追究,我们已经了解机械计算机(准确地说,我们拿它叫机械式桌面计算器)的干活方式,本质上是通过旋钮或把带动齿轮转动,这同一过程均因手动,肉眼就能看得明明白白,甚至为此今天底乐高积木都能够实现。麻烦就是麻烦在电的引入,电这样看不展现摸不正的神灵(当然你可摸摸试试),正是被电脑从笨重走向传奇、从简单明了走向令人费解的首要。

类下载地址

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

技术准备

19世纪,电当电脑中之运用主要出有限非常者:一凡是供动力,靠电动机(俗称马达)代替人工叫机器运行;二凡是提供控制,靠一些机动器件实现计算逻辑。

咱将这样的微机称为机电计算机

前期准备

型重要是根据<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
下载后, 直接解压即可.

电动机

汉斯·克里斯钦·奥斯特(Hans Christian Ørsted
1777-1851),丹麦物理学家、化学家。迈克尔·法拉第(Michael Faraday
1791-1867),英国物理学家、化学家。

1820年4月,奥斯特于试中窥见通电导线会导致附近磁针的偏转,证明了电流的磁效应。第二年,法拉第想到,既然通电导线能带来磁针,反过来,如果一定磁铁,旋转的以凡导线,于是解放人力的伟人发明——电动机便生了。

电机其实是项特别无奇怪、很傻的表明,它才会接连免歇地转圈,而机械式桌面计数器的周转本质上便是齿轮的转圈,两者简直是天之地要的一模一样对。有了电机,计算员不再用吭哧吭哧地挥,做数学也终究掉了点体力劳动的样子。

列文件结构

  • Frameworks: 如果文件夹不设有, 点击classes选择Show in Finder,
    新建一个即可, 将您打包的还是下载的framework拖入其中并拉扯上路中.
    你也可以友善建一个文书夹, 把这Frameworks直接delete即可

  • Profile : 个人基本, 这间只有发生一个ProfileController.
    因为总写重复代码, 都写吐了, 这儿来趣味的协调写一下吧, So easy…

  • Network : 关于网络连接的家伙类. 关于网络的实时监察, 网络状态的切换,
    网络请求的工具类都于此间面.

  • Other : 全局的常量. 当然你也可以在内部用文件结构更加细化.

  • Home : 包含最新主播, 最暖直播, 关注之直播, 礼物排行榜等模块.
    还有无限紧要之视频直播呢以及时中了.

  • ShowTime :见名知意. 视频直播的眼前处理,
    智能美颜和H264硬编码等还在这里面.

  • Main : UITabBarControllerUINavigationController的配置

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

  • Login : 登录模块

  • Resource : 项目因此到的资源文件

电磁继电器

约莫瑟夫·亨利(Joseph Henry 1797-1878),美国科学家。爱德华·戴维(Edward
Davy 1806-1885),英国物理学家、科学家、发明家。

电磁学的值在摸清了电能和动能之间的变,而自从静到动的能转换,正是让机器自动运行的要害。而19世纪30年代由亨利同戴维所分别发明的就电器,就是电磁学的要应用之一,分别于报和电话领域发挥了重点作用。

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

那个布局以及原理非常简单:当线圈通电,产生磁场,铁质的电枢就让诱惑,与下侧触片接触;当线圈断电,电枢就在弹簧的用意下发展,与上侧触片接触。

当机电设备中,继电器主要发挥两方面的打算:一凡通过弱电控制强电,使得控制电路可以操纵工作电路的通断,这一点放张原理图虽能一目了然;二凡是拿电能转换为动能,利用电枢在磁场和弹簧作用下之往返运动,驱动特定的纯机械结构以完成计算任务。

随后电器弱电控制强电原理图(原图来自网络)

品种详解

  • 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];
  • tip6: 弹幕
    弹幕使用的也是一个叔在轮子<a
    href=”https://github.com/unash/BarrageRenderer"&gt;BarrageRenderer
    </a>. 这个开源项目的文档都是华语的, 用法也是十分粗略的.

    着力配备

 _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(7月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"
  • tip8: H264硬编码
    一旦运用<a
    href=”https://github.com/Bilibili/ijkplayer"&gt;ijkplayer
    </a>使用硬解码, 一句子代码即可.

// 开启硬解码
[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);
        }

    }

}

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

由1790年开始,美国的人口普查基本每十年开展同样差,随着人口繁衍和移民的长,人口数量那是一个放炮。

眼前十破的人口普查结果(图片截自维基「United States 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(有色人种)、White(白种人)。好了,你毕竟能看明白霍尔瑞斯龙飞凤舞的墨迹了。

其一电路用于统计以下6桩组成信息(分别同图中标M的6组电磁铁对应):

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

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

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

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

⑤ colored males(非白种男)

⑥ colored females(非白种女)

盖第一项也条例,如果表示「Native」、「White」和「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也为此于上个世纪风风火火地开在其拿手的制表机和电脑产品,成为同代表霸主。

制表机在即时成为与机械计算机并存的少死主流计算设备,但前者通常专用于大型统计工作,后者则一再只能开四虽说运算,无一致具备通用计算的力量,更可怜之变革将于二十世纪三四十年代掀起。

感触

虽说这路是单山寨的, 高仿的, 但是还已经很庞大了.
具体的细节要用大家自己去看我的门类源码.
短短几千许还确确实实说不清这么多的知点. blog的章名字说了凡初窥,
还真的只是初窥, 视频直播中的坑太多. 且行且珍惜…

tip: 本文理论知识部分, 采集自网络.
请记住一句话talk is cheap show me the code, 重点在于Demo类型本身.
理论有自己只是一个搬运工和总结者…

祖思机

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

起若干天才决定成为大师,祖思就是是。读大学时,他虽未老实,专业换来换去都认为无聊,工作之后,在亨舍尔公司与研究风对机翼的影响,对复杂的计算更是忍无可忍。

成天就是当摇计算器,中间结果还要录,简直要狂。(截图来自《Computer
History》)

祖思同冲抓狂,一面相信还有不少人以及他一如既往抓狂,他看出了商机,觉得这世界迫切需要一栽好自动计算的机。于是一不开二不不,在亨舍尔才呆了几只月就自然辞职,搬至家长家里啃老,一门心思搞起了表。他本着巴贝奇一无所知,凭一自己的能力做出了社会风气上率先宝而编程计算机——Z1。

种编译环境

Xcode7(及以上)
最好是拿项目走在真机上. 有些地方模拟器是免支持的, 也看不到任何作用的,
比如硬编码/智能美颜等, 这些功能模块, 我举行了限定的, 需要真机状态才会上行.

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的局部救助。

项目下载地址

<a
href=”https://github.com/SunLiner/MiaowShow"&gt;GitHub下载地址&lt;/a&gt;
吁star和fork. 后续的bug会持续更新到github上之.
发出问题可以于简书给我留言/私信, 或者微博(简书个人及篇页有自己的微博)私信我.

7月9日凌晨创新: 项目现已合龙视频直播推流
blog地址详解<a
href=”http://www.jianshu.com/p/8ea016b2720e"&gt;快速集成iOS基于RTMP的视频推流&lt;/a&gt;

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年于西门子吞并,成为当下等同国际巨头体内的一致抹灵魂之血。

联系我

<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;

贝尔Model系列

无异于时代,另一样小不容忽视的、研制机电计算机的机关,便是上个世纪叱咤风云之贝尔实验室。众所周知,贝尔实验室及其所属企业是做电话建立、以通信为根本业务的,虽然为开基础研究,但怎么会与计算机领域呢?其实与她们之尽本行不无关系——最早的电话机系统是靠模拟量传输信号的,信号仍距离衰减,长距离通话需要采用滤波器和放大器以保信号的纯度和强度,设计这简单种设备时需处理信号的振幅和相位,工程师等就此复数表示它——两只信号的叠加凡两岸振幅和相位的分级叠加,复数的运算法则正好与之切。这虽是成套的起因,贝尔实验室面临着大量底复数运算,全是略的加减乘除,这哪是脑力活,分明是体力劳动啊,他们吗这还特意雇佣过5~10名叫女人(当时之跌价劳动力)全职来做这事。

自打结果来拘禁,贝尔实验室发明计算机,一方面是发源本身需求,另一方面也由自家技术及博了启迪。电话的拨号系统由继电器电路实现,通过一致组就电器的开闭决定谁与谁进行通话。当时实验室研究数学之人头对接着电器并无熟识,而继电器工程师又针对复数运算不尽了解,将两端关系到联合的,是同等称呼于乔治·斯蒂比兹的研究员。

乔治·斯蒂比兹(George Stibitz 1904-1995),贝尔实验室研究员。

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)做好了铺垫。

Model I

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

这边不追究Model
I的切实落实,其规律简单,可线路复杂得不得了。让咱管关键放到其针对性数字的编码上。

Model
I就用于落实复数的计运算,甚至连加减都无设想,因为贝尔实验室认为加减法口算就足够了。(当然后来她们发现,只要不清空寄存器,就得经跟复数±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 George
Stibitz》)

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

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

测算同一不良复数乘除法平均耗时半分钟,速度是动机械式桌面计算器的3倍。

Model
I不但是第一光多终端的电脑,还是第一贵可长距离操控的微处理器。这里的长距离,说白了便是贝尔实验室利用自身的技能优势,于1940年9月9日,在达特茅斯学院(Dartmouth
College
)和纽约的大本营之间多起线,斯蒂比兹带在小小的的终端机到学院演示,不一会就于纽约扩散结果,在参加的数学家中挑起了远大轰动,其中即生天晚名满天下的冯·诺依曼,个中启迪不言而喻。

自我用谷歌地图估了转,这长达线全长267英里,约430公里,足够纵贯江苏,从苏州火车站连到连云港花果山。

从今苏州站开车顶花果山430不必要公里(截图来自百度地图)

斯蒂比兹由此变成远程计算第一人数。

而是,Model
I只能开复数的季虽说运算,不可编程,当贝尔的工程师等想用她的效力扩展至差不多项式计算时,才意识那个线路为规划充分了,根本改观不得。它再次如是光巨型的计算器,准确地游说,仍是calculator,而非是computer。

Model II

二战期间,美国如研制高射炮自动瞄准装置,便以起矣研制计算机的求,继续由斯蒂比兹负责,便是深受1943年做到的Model
II——Relay Interpolator(继电器插值器)。

Model
II开始利用穿孔带进行编程,共统筹来31条指令,最值得一提的抑编码——二-五编码。

将继电器分成两组,一组五各类,用来表示0~4,另一样组简单个,用来代表是否要丰富一个5——算盘既视感。(截图来自《计算机技术发展史(一)》)

您晤面意识,二-五编码比上述的任一种植编码还如浪费位数,但她来她的精锐的处,便是从校验。每一样组就电器中,有且仅来一个随后电器吧1,一旦出现多个1,或者全是0,机器就能即刻发现题目,由此大大提高了可靠性。

Model II之后,一直顶1950年,贝尔实验室还穿插推出了Model III、Model
IV、Model V、Model
VI,在计算机发展史上占一席之地。除了战后底VI返璞归真用于复数计算,其余都是武装用途,可见战争真的是技术革新的催化剂。

Harvard Mark系列

有点晚把时候,踏足机电计算领域的还有哈佛大学。当时,有同称作在哈佛攻读物理PhD的学员——艾肯,和当年之祖思一样,被手头繁复的盘算困扰着,一心想建大电脑,于是由1937年开头,抱在方案四处寻找合作。第一家吃拒,第二小于驳回,第三贱到底伸出了橄榄枝,便是IBM。

霍华德·艾肯(Howard Hathaway Aiken
1900-1973),美国物理学家、计算机对先驱。

1939年3月31日,IBM和哈佛拟签了最后的情商:

1、IBM为哈佛建一模一样大活动测算机器,用于解决科学计算问题;

2、哈佛免费供建造所需要的基本功设备;

3、哈佛指定一些口跟IBM合作,完成机器的筹划和测试;

4、全体哈佛人员签订保密协议,保护IBM的技能同阐明权利;

5、IBM既无受上,也未提供额外经费,所修建计算机为哈佛之财。

乍一看,砸了40~50万美元,IBM似乎捞不顶另外利益,事实上人家死商店才无以一点一滴这点小钱,主要是怀念借这彰显自己的实力,提高公司声誉。然而世事难料,在机建好之后的礼及,哈佛新闻办公室跟艾肯私自准备的新闻稿中,对IBM的佳绩没有予以足够的肯定,把IBM的总裁沃森气得和艾肯老死不相往来。

骨子里,哈佛这边由艾肯主设计,IBM这边由莱克(Clair D.
Lake)、汉密尔顿(Francis E. Hamilton)、德菲(Benjamin
Durfee)三名工程师主建造,按理,双方单位之献是针对性半底。

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

受1944年就了即大Harvard Mark 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》,下同。)

和祖思机一样,Mark
I为通过通过孔带获得指令。穿孔带每行有24独空位,前8位标识用于存放结果的寄存器地址,中间8各类标识操作数的寄存器地址,后8各标识所设开展的操作——结构已大类似后来底汇编语言。

Mark I的过孔带读取器以及织布机一样的通过孔带支架

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

然严谨地架好(截图来自CS101《Harvard Mark I》,下同。)

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

有关数目,Mark
I内发出72独增长寄存器,对外不可见。可见的凡另外60单24员之常数寄存器,通过开关旋钮置数,于是就有矣这般蔚为壮观的60×24旋钮阵列:

变更数了,这是零星当30×24的旋钮墙是。

当今天哈佛大学科学中心位列的Mark
I上,你只能看看一半旋钮墙,那是因马上不是平玉完整的Mark
I,其余部分保存在IBM及史密森尼博物院。(截图来自CS50《Harvard Mark I》)

与此同时,Mark
I还足以经过穿孔卡片读入数据。最终之盘算结果由于同光打孔器和片贵活动打字机输出。

用以出口结果的全自动打字机(截图来自CS101《Harvard Mark I》)

po张哈佛馆藏在不利中心的真品(截图来自CS50《Harvard Mark I》)

脚给咱们来大概瞅瞅它其中是怎么运作的。

当即是同一顺应简化了底Mark
I驱动机构,左下比赛的电机带动着一行行、一列列纵横啮合的齿轮不停歇转动,最终依赖左上角标注为J的齿轮去带动计数齿轮。(原图来源《A
Manual of Operation for the Automatic Sequence Controlled
Calculator》,下同。)

本Mark
I不是为此齿轮来表示最终结果的,齿轮的团团转是以接通表示不同数字之线路。

咱俩来瞧这等同单位的塑料壳,其内部是,一个由于齿轮带动的电刷可个别与0~9十独岗位及之导线接通。

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

其余复杂的电路逻辑,则当是恃就电器来好。

艾肯设计之处理器连无局限为同一种植材料实现,在找到IBM之前,他尚于平等下制作传统机械式桌面计算器的庄提出了合作要,如果这家店铺同意合作了,那么Mark
I最终不过可能是彻头彻尾机械的。后来,1947年就的Mark
II也验证了当时或多或少,它大概上只是用继电器实现了Mark
I中的机械式存储部分,是Mark
I的纯继电器版本。1949年和1952年,又各自出生了大体上电子(二极管继电器混合)的Mark
III和纯电子的Mark IV。

末,关于这同样层层值得一提的,是然后不时将来和冯·诺依曼结构做对比的哈佛结构,与冯·诺依曼结构统一存储的做法不同,它将指令和数据分开储存,以得更强的实施效率,相对的,付出了计划复杂的代价。

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

虽如此和了历史,渐渐地,这些遥远的东西也转移得跟我们密切起来,历史以及本根本不曾脱节,脱节的是我们局限的认知。往事并非与现行毫无关系,我们所熟识的伟大创造都是由历史一样次于以同样次于的交替中脱胎而起之,这些前人之灵气串联在,汇聚成流向我们、流向未来之璀璨银河,我揪她的惊鸿一瞥,陌生而习,心里头热乎乎地涌起一阵难以言表的惊艳与愉悦,这就算是研究历史之意趣。

参考文献

胡守仁. 计算机技术发展史(一)[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]. 长沙: 湖南教育出版社, 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.

柏林随便大学. 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改变世界:让电代替人工去算——机电时期的权宜之计