ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

计算机如何存储与显示信息:从二进制到多媒体编码

计算机如何存储与显示信息:从二进制到多媒体编码 1. 从一张照片说起计算机存储与显示到底在干什么你按下快门拍了一张照片手机屏幕上立刻出现了它。你录了一段语音发给朋友对方点开就能听到你的声音。你在电脑上敲下一行字保存后关机第二天打开文件它还在那里。这些操作对现代人来说像呼吸一样自然但如果你停下来想一想会发现一个很诡异的事实计算机本质上只是一堆通电的硅片和金属线它不认识什么叫“照片”不知道什么叫“声音”更不理解什么叫“文字”。它唯一能处理的东西就是电信号的两种状态——有电和没电用数字表示就是1和0。所以信息在计算机中是如何存储及显示的这个问题拆开来看其实是两个问题第一文字、图像、音频、视频这些五花八门的信息怎么被“翻译”成只有0和1的二进制世界第二这些0和1又怎么被“翻译”回人类能看懂、能听见、能感受的形式前者叫编码与存储后者叫解码与显示。这两个过程贯穿了计算机科学的底层逻辑也是每一个想真正理解计算机的人绕不开的基础知识。这篇文章适合谁看如果你是计算机专业的学生正在学《计算机组成原理》或者《计算机系统结构》这里的内容能帮你把课本上抽象的概念和实际体验对应起来。如果你是程序员天天跟文件、数据库、网络传输打交道理解底层的存储和显示机制能让你在遇到乱码、图片失真、音频杂音这些问题时知道该往哪个方向排查。如果你只是对计算机好奇的普通人那更好我会尽量用生活化的类比把这事儿讲清楚让你看完之后对自己每天用的设备有一个全新的认识。接下来的内容会围绕几个核心问题展开二进制为什么是计算机的唯一选择文字怎么变成二进制图像和视频的存储有什么不同音频为什么能“压缩”而不失真显示环节又发生了什么以及在实际操作中我们经常会踩哪些坑怎么排查和解决。我会尽量把每个环节的“为什么”讲透而不是只告诉你“是什么”。2. 二进制的世界计算机为什么只认0和12.1 从十进制到二进制不是选择而是必然人类用十进制是因为我们有十根手指。但计算机没有手指它有的是电路。电路最擅长的东西是什么是开关。电流要么通过要么不通过电压要么是高电平要么是低电平。这种“两种状态”的物理特性天然就对应着二进制——用0表示一种状态用1表示另一种状态。你可能会问为什么不用十进制让电路有十种不同的电压等级不就行了理论上可以但实际工程中极其困难。电压是模拟量会受温度、电磁干扰、元器件老化等因素影响。如果要用十种电压等级来表示0到9那每种等级之间的差距就很小稍微有点波动就会导致误判。而二进制只有两种状态高电平和低电平之间的差距很大抗干扰能力强得多。这就是为什么二进制成为了计算机的唯一选择——不是因为它更“高级”而是因为它更“可靠”。提示理解这一点很重要。计算机的所有信息无论是文字、图片还是视频最终都要被转换成二进制。这个转换过程叫“编码”反过来叫“解码”。2.2 二进制的基本运算与常见换算二进制的运算规则比十进制简单得多。加法只有四种情况0000111011110进位。减法、乘法、除法也类似都是从十进制规则简化而来的。对于日常开发来说你不需要手算二进制除法但需要理解几个关键概念。位bit是二进制的最小单位一个位只能是0或1。字节Byte是8个位这是计算机存储的基本单位。为什么是8位这是历史演化的结果早期有6位、7位的字节后来8位成为了标准因为8位正好能表示256种不同的组合2的8次方足够表示英文字母、数字和常用符号。十进制二进制十六进制000000501015101010A151111F25511111111FF十六进制在计算机领域非常常见因为一个十六进制位正好对应四个二进制位写起来比二进制简洁得多。你在调试程序时看到的那些内存地址、颜色代码比如#FF5733都是十六进制。2.3 存储大小的层级从字节到TB理解了二进制就能理解存储单位了。1 KB 1024 Byte1 MB 1024 KB1 GB 1024 MB1 TB 1024 GB。为什么是1024而不是1000因为1024是2的10次方二进制世界里凑整更方便。这里有一个常见的坑硬盘厂商和操作系统对存储大小的计算方式不同。硬盘厂商通常按1000进制算而操作系统按1024进制算。所以你买了一块500GB的硬盘插上电脑后发现只有465GB左右这不是硬盘缩水了而是计算方式不同导致的。这个差异在实际工作中经常引起误会尤其是做存储容量规划的时候一定要统一单位。3. 文字的存储从字符到编码表3.1 ASCII英文字母的二进制身份证文字要存进计算机第一步是给每个字符分配一个数字编号。比如字母“A”编号是65字母“a”编号是97数字“0”编号是48。这个编号表就是ASCII美国信息交换标准代码。ASCII用7位二进制表示128个字符包括英文字母、数字、标点符号和一些控制字符。比如“Hello”这个词在ASCII表里对应的编号是72、101、108、108、111转换成二进制就是H 72 01001000 e 101 01100101 l 108 01101100 l 108 01101100 o 111 01101111计算机存储“Hello”的时候实际存的就是这串二进制。显示的时候程序读取这串二进制查ASCII表找到对应的字符再渲染到屏幕上。3.2 中文编码的演进GBK、GB2312与UnicodeASCII只有128个字符英文字母够用了但中文怎么办汉字有几万个7位二进制根本不够。所以中国制定了GB2312标准用两个字节表示一个汉字后来扩展成GBK收录了更多汉字。台湾地区有Big5编码日文有Shift-JIS韩文有EUC-KR。每个地区都有自己的编码标准这就导致了一个经典问题乱码。你用GBK编码保存了一个中文文件发给一个用Big5编码打开的人他看到的就是一堆看不懂的符号。因为同一个二进制序列在不同的编码表里对应不同的字符。这个问题在互联网时代变得非常严重于是Unicode出现了。Unicode的目标是给世界上所有字符分配一个唯一的编号不管你是中文、英文、阿拉伯文还是emoji。Unicode只是一个字符集它定义了每个字符的编号但具体怎么存储又是另一回事。UTF-8是目前最流行的Unicode存储方案它用1到4个字节表示一个字符英文字符占1个字节中文字符通常占3个字节。UTF-8的好处是兼容ASCII而且英文文本的存储效率很高。注意在实际开发中文件编码不一致是导致乱码的最常见原因。保存文件时用什么编码读取文件时就要用什么编码否则就会出现“锟斤拷”这种经典乱码。3.3 实操如何查看和转换文件编码在Linux系统下你可以用file命令查看文件的编码file -i filename.txt输出会显示文件的MIME类型和字符集比如text/plain; charsetutf-8。如果要转换编码可以用iconv命令iconv -f GBK -t UTF-8 input.txt -o output.txt这个命令把GBK编码的文件转换成UTF-8。在Windows下你可以用Notepad或者VS Code来查看和转换编码VS Code右下角会显示当前文件的编码点击就可以切换。我个人的经验是跨平台协作时统一用UTF-8能避免99%的乱码问题。如果遇到老系统只支持GBK那就在数据交换的边界做转换内部还是用UTF-8。4. 图像的存储像素、颜色与压缩4.1 像素图像的最小单位你在手机屏幕上放大一张照片放大到一定程度会看到一个个小方块每个方块有固定的颜色这些小方块就是像素。图像在计算机中就是由这些像素组成的网格每个像素记录一个颜色值。颜色怎么用二进制表示最常见的是RGB模型用红、绿、蓝三个分量来表示颜色每个分量通常用8位二进制表示范围是0到255。比如纯红色是(255, 0, 0)纯白色是(255, 255, 255)纯黑色是(0, 0, 0)。三个8位分量加起来是24位也就是3个字节能表示1677万多种颜色这已经超过了人眼能分辨的范围。一张1920x1080的照片有207万个像素每个像素3个字节总共约6MB。这是未压缩的大小。但你在手机里拍的照片通常只有2到3MB因为经过了压缩。4.2 有损压缩与无损压缩JPEG和PNG的区别图像压缩分两种无损压缩和有损压缩。无损压缩解压后能完全恢复原始数据PNG和GIF属于这一类。有损压缩会丢弃一些人眼不敏感的信息换取更高的压缩率JPEG是典型代表。JPEG的压缩原理利用了人眼的两个特性第一人眼对亮度变化比对颜色变化更敏感第二人眼对高频细节比如细密的纹理不如对低频轮廓敏感。所以JPEG会把图像从RGB转换成YCbCr色彩空间降低颜色分量的分辨率然后用离散余弦变换DCT把图像从空间域转换到频率域丢弃高频信息最后用霍夫曼编码压缩。PNG则使用DEFLATE算法做无损压缩适合存储图标、截图、线条图这类需要精确还原的图像。PNG还支持透明通道Alpha通道这是JPEG不具备的。格式压缩方式透明支持适用场景JPEG有损不支持照片、复杂图像PNG无损支持图标、截图、线条图GIF无损支持1位简单动画WebP两者都支持支持网页图像BMP无压缩不支持原始位图4.3 实操用Python读取图像并查看像素值如果你想亲手验证图像在计算机中的存储方式可以用Python的Pillow库from PIL import Image img Image.open(photo.jpg) print(img.size) # 输出图像尺寸比如(1920, 1080) print(img.mode) # 输出颜色模式比如RGB # 读取某个像素的颜色值 pixel img.getpixel((100, 200)) print(pixel) # 输出比如(255, 128, 0) # 转换成灰度图 gray img.convert(L) gray.save(photo_gray.jpg)这段代码打开一张图片读取指定位置的像素值然后转换成灰度图。灰度图每个像素只用一个字节表示亮度从0黑到255白存储大小只有RGB的三分之一。提示如果你在做图像处理相关的开发理解像素的存储格式非常关键。比如OpenCV默认使用BGR顺序而Pillow使用RGB顺序搞混了会导致颜色显示异常。5. 音频的存储采样、量化与编码5.1 声音的本质与数字化声音本质上是空气的振动是一种连续的模拟信号。要让计算机存储声音就必须把连续信号变成离散的数字信号这个过程叫模数转换ADC。具体分两步采样和量化。采样是按固定时间间隔记录声音的振幅。采样率越高记录越精确。CD音质的采样率是44100Hz意思是每秒采样44100次。为什么是44100这是根据奈奎斯特采样定理要还原最高20000Hz的声音人耳听觉上限采样率至少要40000Hz44100是一个工程上的折中值。量化是把采样得到的振幅值转换成二进制数。比如用16位二进制表示振幅范围是-32768到32767能表示65536个不同的振幅等级。采样率越高、量化位数越多音质越好但文件也越大。5.2 常见音频格式与压缩原理未压缩的音频数据量很大。一首4分钟的CD音质歌曲44100Hz采样率、16位量化、双声道数据量是44100 × 16 × 2 × 240 338,688,000位 ≈ 40MB所以需要压缩。MP3是最常见的有损音频压缩格式它利用了人耳的听觉掩蔽效应一个强音会掩盖附近频率的弱音人耳听不到被掩盖的声音所以这部分数据可以丢弃。MP3把音频分成多个频段根据心理声学模型决定哪些频段可以压缩得更狠哪些需要保留更多细节。FLAC是无损音频压缩解压后能完全还原原始数据文件大小通常是WAV的50%到70%。AAC是MP3的继任者在相同码率下音质更好被广泛用于流媒体和视频伴音。5.3 实操用Python分析音频波形用Python的librosa库可以读取音频文件并查看波形import librosa import numpy as np # 读取音频文件 y, sr librosa.load(audio.mp3, srNone) print(f采样率: {sr}) print(f时长: {len(y)/sr:.2f}秒) print(f采样点数: {len(y)}) # 查看前10个采样点的振幅值 print(y[:10])这段代码读取音频文件输出采样率、时长和采样点数量。y数组里存的就是每个采样点的振幅值这些值在存储时会被量化成16位或24位整数。注意音频处理中经常遇到采样率不匹配的问题。比如把44100Hz的音频直接放到48000Hz的环境里播放声音会变调。解决方法是重采样用librosa.resample或者scipy.signal.resample都可以。6. 视频的存储帧、编码与容器6.1 视频就是快速播放的图片视频的原理很简单把一系列图片按一定速度连续播放利用人眼的视觉暂留效应看起来就是动态画面。每一张图片叫一帧每秒播放的帧数叫帧率。电影通常是24帧/秒电视是25或30帧/秒游戏追求60帧/秒甚至更高。如果视频不压缩数据量会大到无法接受。一部1080p、30帧/秒、时长2小时的电影每帧1920x1080像素、3字节总数据量是1920 × 1080 × 3 × 30 × 7200 ≈ 1.3TB所以视频必须压缩。视频压缩的核心思想是帧间预测相邻帧之间通常只有少量像素发生变化没必要每帧都完整存储。编码器会把视频分成I帧关键帧完整存储、P帧前向预测帧只存与前一帧的差异、B帧双向预测帧参考前后帧。这样能大幅减少数据量。6.2 常见视频编码与容器格式H.264是目前最广泛使用的视频编码标准压缩效率高兼容性好。H.265也叫HEVC压缩效率比H.264高50%但专利授权复杂普及速度较慢。AV1是新一代开源编码免专利费被越来越多的流媒体平台采用。容器格式是另一回事。MP4、MKV、AVI都是容器它们决定了视频、音频、字幕等数据怎么打包在一起。一个MP4文件里可能装着H.264编码的视频和AAC编码的音频。容器和编码是分开的概念搞混了容易出问题。容器格式常见视频编码常见音频编码特点MP4H.264/H.265AAC兼容性好流媒体首选MKV几乎都支持几乎都支持灵活适合本地播放AVI老旧编码MP3/PCM过时不推荐WebMVP8/VP9/AV1Vorbis/Opus网页友好开源6.3 实操用FFmpeg查看和转换视频信息FFmpeg是视频处理的神器查看视频信息ffprobe -v quiet -print_format json -show_format -show_streams input.mp4这个命令会输出视频的编码格式、分辨率、帧率、码率、时长等详细信息。转换视频编码ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4-crf 23控制视频质量数值越小质量越高文件越大。18到28是比较常用的范围。-b:a 128k设置音频码率为128kbps。提示视频转码非常消耗CPU如果经常做这个操作建议用硬件加速。NVIDIA显卡可以用-c:v h264_nvencIntel核显可以用-c:v h264_qsv速度能快好几倍。7. 显示环节从显存到屏幕7.1 显卡、显存与帧缓冲存储说完了接下来是显示。计算机把图像数据存好后要把它送到屏幕上。这个过程由显卡完成。显卡里有一块显存专门用来存放即将显示的图像数据。这块区域叫帧缓冲。帧缓冲里存的是每个像素的颜色值和我们在第4节讲的图像存储格式一样。显卡的显示控制器不断读取帧缓冲把数据转换成显示器能理解的信号通过HDMI、DisplayPort等接口发送出去。显示器收到信号后控制每个像素的亮度和颜色最终呈现出画面。帧率就是帧缓冲更新的速度。如果显卡渲染一帧需要16.6毫秒那帧率就是60帧/秒。如果渲染时间超过16.6毫秒帧率就会下降画面看起来就卡顿。7.2 分辨率、刷新率与色彩深度分辨率是屏幕上像素的数量比如1920x1080表示横向1920个像素、纵向1080个像素。分辨率越高画面越细腻但显卡的渲染压力也越大。刷新率是屏幕每秒更新画面的次数单位是Hz。60Hz表示每秒刷新60次。高刷新率屏幕144Hz、240Hz在游戏和动画中能提供更流畅的视觉体验。色彩深度是每个像素用多少位表示颜色。24位色8位红、8位绿、8位蓝能表示1677万种颜色这是目前的主流。专业领域会用30位色甚至36位色能表示更多颜色但需要显卡和显示器都支持。7.3 常见显示问题与排查思路显示环节出问题表现通常很直观黑屏、花屏、颜色异常、分辨率不对。排查思路可以按以下顺序检查连接线HDMI、DisplayPort线松动或损坏是常见原因换根线试试。检查显卡驱动驱动版本过旧或不兼容会导致显示异常更新到最新版。检查分辨率设置分辨率设置超出显示器支持范围会导致黑屏进安全模式调回来。检查显存占用显存不足会导致花屏或卡顿关闭一些占用显存的程序。检查显示器本身把显示器接到另一台电脑上确认是不是显示器硬件问题。注意如果你在Linux系统下遇到显示问题可以查看/var/log/Xorg.0.log日志文件里面会记录显示初始化的详细信息对排查问题很有帮助。8. 常见问题与排查技巧实录8.1 乱码问题速查表现象可能原因解决方法中文显示为问号编码不支持中文改用UTF-8或GBK中文显示为方块字体缺失安装中文字体中文显示为乱码编码不一致统一编码为UTF-8网页中文乱码页面编码声明错误检查meta标签的charset数据库中文乱码数据库字符集不对设置utf8mb48.2 图像显示异常排查图像显示异常通常有三种表现颜色不对、图像模糊、图像无法显示。颜色不对多半是色彩空间搞混了比如把BGR当成RGB。图像模糊可能是缩放算法的问题用双线性插值还是最近邻插值效果差别很大。图像无法显示可能是文件损坏或格式不支持用file命令检查文件类型用图像查看器打开试试。8.3 音频播放异常排查音频播放异常包括杂音、断断续续、无声。杂音通常是采样率不匹配或位深不匹配。断断续续可能是缓冲区设置太小增大缓冲区能缓解。无声可能是声道映射错误检查一下是单声道还是立体声左右声道有没有接反。8.4 视频播放异常排查视频播放异常包括卡顿、音画不同步、花屏。卡顿可能是解码器性能不足试试硬件加速。音画不同步可能是时间戳问题用FFmpeg重新封装一下。花屏通常是编码数据损坏重新下载或转码。提示遇到多媒体问题时FFmpeg和MediaInfo是两个必备工具。FFmpeg能转码、分析、修复MediaInfo能查看文件的详细参数。这两个工具能解决大部分常见问题。9. 我个人的一些经验体会搞明白信息在计算机中的存储和显示原理之后我看待日常使用的设备有了完全不同的视角。以前觉得理所当然的事情现在能看到背后的二进制逻辑。比如为什么JPEG不适合存截图因为截图里有大量锐利边缘JPEG的DCT变换会把边缘弄模糊。为什么视频会议有时候会卡因为网络带宽不够编码器降低了码率画面就糊了。在实际工作中这些知识帮我省了很多时间。有一次同事发来一个CSV文件打开全是乱码我用file命令一看是GBK编码用iconv转成UTF-8就正常了。还有一次做视频处理发现转码后的视频颜色偏暗查了半天发现是色彩空间转换的问题加了一个-pix_fmt yuv420p参数就解决了。如果你也想深入理解这些我的建议是动手做实验。用Python读取一张图片的像素值用FFmpeg转码一段视频用iconv转换一个文件的编码。这些操作都不难但能让你对二进制世界有直观的感受。理论结合实践理解才会深刻。最后分享一个小技巧如果你不确定一个文件的编码或格式不要猜用工具查。file命令、ffprobe、MediaInfo都是免费的能给你准确的信息。猜错了浪费时间查一下几秒钟的事。
返回列表