这文章记录一些关于计算机的知识,我觉得程序员应该可以看看,大部分都是抽象,我们在写代码或者在做程序的时候,不用在乎底层知识,我们只需要写,编译器会帮我们处理成想要的样子,我觉得硬件底层是很复杂的一个东西,它不仅仅是编程的逻辑判断,还有物理知识,电的知识,这篇文章是一个个抽象来理解计算机,所以我们不用关心底层什么 ALU,或者 计算等等。

视频

这篇文章不只是记录,也写包括我的理解,可能不是很对,有错误请给提 issues。

感谢CrashCourse 字幕组 以及 Crash Course 你们很棒.

文本文件,音乐文件,照片和视频,今天我们要讨论文件到底是什么?以及计算机怎么管理文件
文件格式:如何编码文字,声音,图片,.txt .wav.bmp。

这些格式虽然管用,而且现在还在用,但它们的简单性意味着效率不高。

我们希望文件能小一点,这样能存大量文件,传输也会快一些,等邮件附件下载烦死人了。

解决办法是 压缩,把数据占用的空间压得更小。

用更少的位(bit)来表示数据

图像

图像一般存成一长串像素值,为了知道一行在哪里结束,图像要有元数据,写明尺寸等属性。

每个像素的颜色 是三种原色的组合:红,绿,蓝,每个颜色用一个字节存,数字范围是 0 到 255。
2023-05-10-10-57-34-a96fff45-6317-444e-8559-797f90d0b8a4
如果红绿蓝都是 255 会得到白色。
2023-05-10-10-58-21-98f5c6be-e6e9-46b8-a71e-e2de7878e05d
这个图像有16个像素(4x4),每个像素3个字节,总共占48个字节(16x3 = 48)

但我们可以压缩到少于 48 个字节

  • 减少重复信息

    游程编码,适合经常出现相同值的文件。
    2023-05-10-11-10-28-image
    插入一个额外字节,代表 7 个连续黄色像素,然后删掉后面的重复数据。这时候我们要给字节标上长度。

  • DFTBA

    它用更紧凑的方式表示数据块

    我们需要一个字典,存储 “代码” 和 “数据” 间的对应关系。

    我们可以把图像看成一块块,而不是一个个像素。

    为了简单,我们把 2个像素当成 1 块(占6个字节)但你也可以定成其他大小。

霍夫曼树(算法)这里并不是数字

我是为了方便

2 , 1 ,4 ,1

首先,列出所有块,和出现频率。每轮选两个最低的频率。

这里为 1 ,1 ,把它们组成一个树,总频率 2 ,现在完成一轮算法呢。现在我们重新这样做

2 , 4 , 2

就像上次一样,选频率最低的两个,放在一起,并记录总频率

4 , 4

然后

8

可以看作一个树节点,按频率排列
2023-05-10-11-33-22-31c7a624-e26a-4da0-afbe-9aeececf07f5
频率低的在最小。

我们把每个分支用 0 和 1 标注
2023-05-10-11-36-43-c95e8ee9-109a-4af8-bf92-fd641cff2088
酷的地方是,它们绝对不会冲突,因为树的每条路径是唯一的。
2023-05-10-11-40-02-1915c0ba-4e35-48fd-81f0-ae66f40bb77f
字典也要保存下来,否则 14 bit 毫无意义

加上字典,图像是 30 个字节 。

消除冗余 和 用更紧凑 的表示方法,这两种方法通常会组合使用。

几乎所有无损压缩格式都用了它们,比如 GIF ,PNG,PDF,ZIP

游程编码 和 字典编码 都是无损压缩

压缩时不会丢失信息,解压后,数据和之前完全一样。

无损对很多文件很重要

比如说我给你发了个压缩的 word 文档,你解压之后发现内容变了,这就很糟糕了。

但其他一些文件,丢掉一些数据没什么关系,丢掉那些人类看不出区别的数据

大多数有损压缩技术,都用到了这点


概念

以声音为例,你的听力不是完美的,有些频率我们很擅长,其他一些我们根本听不到,比如超声波,除非你是蝙蝠。

录音乐,超声波数据都可以扔掉,因为人类听不到超声波。

另一方面,人类对人声很敏感,所以应该尽可能保持原样。

低音介于两者之间,人类听得到,但不怎么敏感,一般是感觉到震动

有损音频压缩利用这一点,用不同精度编码不同频段。

听不出什么区别,不会明显影响体验。


音乐发烧友估计要吐槽了,日常生活中你会经常碰到这类音频压缩,所以您在电话里面的声音,和现实中不一样。

压缩音频是为了让更多人能同时打电话,

如果网速变慢了,压缩算法会删更多数据,进一步降低声音质量,所以 Skype 通话有时听起来像个机器人。

和没压缩的音频格式相比,比如 WAV 或 FLAC 。


压缩音频文件如 MP3 ,能小 10 倍甚至更多。省了超多空间。

这些删掉人类无法感知的数据的方法,叫“感知编码”

它依赖于人类的感知,模型来自 “心理物理学”领域

这是各种 “有损压缩图像格式” 的基础,最著名的是 JPEG,但人眼看不出这些细节(我表示看得到)

视频压缩也造成了影响

视频只是一长串连续图片,所以图片的很多方面也适用于视频,但视频可以做一些小技巧,因为帧和帧之间很多像素一样

例如视频里面的背景

视频里不用每一帧都存这些像素,可以只存变了的部分。

很多视频编码格式,只存变化的部分。

这比存所有像素更有效率,利用了帧和帧之间的相似性。

更高级的视频压缩格式 会更进一步,找出帧和帧之间相似的补丁,然后用简单效果实现,比如移动和旋转。变亮和变暗

MPEG-4

是常见标准,可以比原文件小 20 倍到 200倍

但用补丁的移动和旋转,来更新画面,当压缩太严重时会出错,没有足够空间更新补丁内的像素,即使补丁是错的,视频播放器也会照样播放,导致一些怪异又搞笑的效果,您肯定见过这些。
2023-05-10-15-47-52-ecaa7225-91f3-4eb0-a81e-9b30c91a02d4
总的来说,压缩对大部分文件类型都有用。

从这个角度来讲,人类不完美的视觉和听觉,也算有用。

学习压缩非常重要,因为可以高效存储图片,音乐,视频

如果没有压缩,在 youtube 看视频几乎不可能

因为你的带宽可能不够(会很卡)

而且供应商不愿意免费传输那么多数据