ARTICLE DETAIL

资讯详情

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

图像像素格式与视频编码方式详解:从采样到压缩的完整技术链路

图像像素格式与视频编码方式详解:从采样到压缩的完整技术链路 1. 从一张照片说起像素到底负责存储什么信息先说个反直觉的事实你在屏幕上看到的所谓图像其实并不存在于屏幕之外。相机的传感器、手机的摄像头、监控探头它们记录下来的从一开始就不是一张图而是一堆离散的、有坐标的亮度采样点——这正是像素诞生的原因。我记得第一次接触数字图像的时候满脑子都是照片不就是一张图吗后来被老师一句话点醒图是给人看的像素是给机器算的。这句话我到现在做图像相关的项目都还在用。拿一张最普通的手机照片举例1200万像素意味着什么意味着CMOS感光元件把取景范围划分成了一块块细小的网格每个格子里记录一个数值——这个数值代表该位置的亮度和颜色。全副画面就是由这些格子的数字按顺序拼出来的网格越密就能越精细地还原真实世界的细节。这里有个特别容易混淆的点像素不是物理实体它是逻辑采样点。你放大一张照片看到的是一个个色块的齿状边缘专业上管这叫马赛克效应。但暗含的问题是像素没有大小只有位置和数值。一张6000×4000的照片在27英寸显示器上看和在6英寸手机屏上看像素本身没有任何变化变的是像素密度每英寸像素数PPI。这就引出了第一个高频概念分辨率不仅仅取决于像素总数还取决于像素密度和观看距离的组合。为什么很多人吐槽手机1亿像素不如相机2400万像素清楚就是因为单像素物理面积决定了进光量像素堆得太密而传感器面积没变每个感光单元能接收的光子就少了于是出现噪点、动态范围下降。这是我实测过很多次的现象也是后面聊像素格式和编码时必须记住的前提像素不是越多越好信息量才是关键。从技术实现角度看一个像素的数值通常需要多个通道来表示。最常见的存储方式是RGB三通道每个通道各占若干比特比如8位意味着单个通道有0到255共256级三通道组合起来就是约1677万种颜色。这些通道数据加上宽高坐标就构成了数字图像的底层结构。不过真实的工程世界不会这么单纯。你在网上搜图像、像素、像素格式、视频、视频编码方式详解这个主题大概率是因为碰到了某个具体问题比如为什么视频文件比图片大那么多为什么H.265编码的视频在某些播放器里黑屏为什么用RGB采集的视频在后期软件里偏色。这些问题归根结底都出在像素格式和编码方式的逻辑没有理顺上。接下来一层一层拆。2. 像素格式的取舍RGB、YUV与色彩深度的工程权衡2.1 RGB是给显示用的YUV是给存储传输用的RGB是最直观的彩色模型——红绿蓝三原色按比例混合出目标颜色。电脑显示器、手机屏幕、HDMI信号输出端基本都工作在RGB体系里。但RGB有一个天然缺陷三个通道的权重几乎相等导致存储和传输效率偏低。试想一下一段1080p视频60帧每秒如果每像素用RGB各8位存储不压缩的情况下每秒的数据量是1920×1080×3×8×60约2.98Gbps——这个数字意味着什么普通千兆网卡都扛不住更别说当时的存储和无线信号了。所以工程师们想出了一个聪明的折中方案把亮度和颜色信息分开存放这就是YUV分量颜色编码体系。其中的Y是亮度LumaUV是色度Chroma。人眼对亮度的敏感度远高于颜色细节所以可以对UV通道做采样率降级而肉眼几乎察觉不到差异。这就是所谓的色度抽样或色度下采样。这就回答了无数人困惑的问题为什么视频剪辑里看到的素材对比原图经常颜色饱和度下降因为片子为了压缩率把UV通道的分辨率砍了一半甚至更多视觉上色边变得模糊但从文件体积上省了大量空间。2.2 色度抽样格式与色彩深度4:4:4、4:2:2、4:2:0经常能看到视频参数里写4:2:0 8bit这类标识很多新人一脸懵。其实这三个数字规定了Y、Cb、Cr三个通道的抽样比例关系以第一组数字为基准参考行方向第二组代表奇数行的UV抽样比第三组代表偶数行的UV抽样比。具体来说格式Y抽样Cb/Cr抽样常见应用场景4:4:4每个像素每个像素电影级调色、高质量CG渲染、字幕图形叠层4:2:2每1个像素水平方向每行每2个像素抽样1个广播电视、专业摄像机记录、后期抠像4:2:0每1个像素在水平和垂直方向都是每2个像素采1个民用视频、在线视频、手机拍摄、直播推流实测计算一下1080p 60帧 8bit YUV 4:2:0的原始码率大约是1920×1080×82×4×60 约1.49Gbps相比RGB节省了一半。如果再考虑到肉眼几乎感知不到颜色细节损失这笔买卖做得太值了。色彩深度则是另一回事。8bit能显示每通道256级10bit则提升到1024级看似差距只有4倍但在渐变天空中8bit会产生肉眼可见的色带断层10bit肉眼就不会出现明显色阶断裂。这也是新出的HEIF图像格式和HEVC视频都在往10bit HDR方向走的核心原因。这里要给一个我从工作中总结出的经验如果你做视频剪辑采集素材尽量选4:2:2甚至4:4:4但最终交付可以用4:2:0。后期抠像、调色、加字幕需要更多色彩信息而播放端主流设备大多不支持完整色彩采样4:2:0足够。用4:2:0素材做抠像边缘会发虚绿色溢出严重这是无数后期踩过的坑。2.3 为什么空域滤波处理不了含周期噪声的图像这个知识点跟像素格式有点关系。很多人搜图像超分辨率重建或基于改进canny的亚像素边缘提取时会顺带看到空域滤波为什么不能处理周期噪声的问题。周期噪声比如扫描产生的条纹干扰在空域里表现为规律性重复的亮暗变化。空域滤波均值、高斯、中值等本质是局部的卷积运算它们做的是局部平均或局部排序对于孤立噪点有效可周期噪声的频率分布几乎覆盖整幅图像局部滤波对这种全图性、规律性的干扰无能为力——你削掉噪声的值同时也抹掉了图像本身的细节纹理结果模糊了一片还是能看到条纹。正确做法是把图像变换到频域识别并剔除对应噪声频率的峰值再反变换回空域。这类问题日后做图像修复或重建时会造成严重干扰。3. 视频的本质是按时序排列的像素帧帧率、隔行与时间戳的坑3.1 帧率是时间方向的分辨率图像是空间上的像素阵列视频就是给这些像素阵列加了一根时间轴。帧率fpsframes per second本质上就是时间方向上的采样率它和空间分辨率一样有高低差别也受到带宽和存储的限制。24fps是电影工业约定俗成的标准30fps是早期电视广播为了避免交流电频率干扰而定的60fps是体育赛事和游戏追求流畅度的主流120fps则用于高帧率试验项目和未来虚拟现实场景。很多人以为帧率越高越清晰其实是一个认知误区——帧率越高运动画面越平滑但单帧清晰度并没有提升反之如果帧率低了快速运动物体就会出现肉眼可见的卡顿和拖影这是时间采样不足的表现。我在做视频推拉流监控系统时对帧率的理解变得非常具体。摄像头输出25fps画面有运动目标时如果带宽不够系统往往会靠降低帧率来保分辨率结果就是出现走一步跳两步的幻灯效果。这时候宁可把分辨率从1080p降到720p也要保持25fps因为监控场景里捕捉运动轨迹的连续性远比单帧细节重要。3.2 隔行扫描与逐行扫描的历史包袱老电视时代有个概念叫隔行扫描i比如1080i。早期显像管刷新率有限为了在有限带宽里提高视觉刷新感把一帧分成奇数场和偶数场交替刷新人眼的视觉暂留效应会把它脑补成完整画面。听起来聪明实际处理起来非常难受——画面快速运动时奇偶场的时间差会导致水平边沿出现锯齿也就是梳齿纹。现代视频系统基本都采用逐行扫描p比如1080p50、1080p60。编码、剪辑、显示环节都把它当完整帧处理干净利落。但网上很多老片源或低端采集设备还在输出隔行信号你说推流效果怎么都不对首先要查的其实是这个i和p的坑。以前做直播的时候接过一路老式采集卡的信号画面一运动就满屏锯齿查了好久才发现是设备把1080i的sign做为1080p送进来了解出来当然有问题。3.3 时间戳、B帧与封装格式之间的微妙关系在编码中有一类帧叫B帧双向预测帧它能参考前向和后向的帧压缩效率很高。但B帧引入了处理延迟因为解码一帧B帧需要等它后面被参考的帧先解码。这反映在工程层面就是两个典型问题一是封装格式选错导致音画不同步。常见容器MP4、MKV、TS对时间戳的处理逻辑不一样。MP4依赖编辑框Edit Box管理起始时间MKV用浮点时间戳TS用PCR/PTS系统。混流工具没弄明白这些输出就是越来越对不上的经典事故。我做车载视频记录项目的时候遇到过多次因为把TS格式的H.265流直接改后缀为MP4导致时间戳错乱的现象——容器不只是装数据它本身参与了时间轴的定义。二是在线直播不能用带大量B帧的闭式GOP结构。拉流端需要实时性B帧带来的几帧延迟在本地播放无所谓在直播里就是几百毫秒甚至秒级的画面滞后。低延迟推流一般要求关闭B帧用纯IPPP结构来换时间一致性。4. 编码方式的核心思路空间冗余、时间冗余与码率控制4.1 视频为什么能压到那么小讨论完像素和帧终于到编码环节。原始视频的码率巨大前面算过1080p60 8bit 4:2:0的原始数据约1.49Gbps。假设一部90分钟的片子不压缩的体积是1.49×5400÷8 ≈ 1TB完全没法工程使用。所以必须靠压缩编码。编码压缩大概针对两种冗余空间冗余图像相邻像素之间的颜色和亮度高度相关纯色天空里大片的像素数值相同或接近。编码器不会每像素存一遍而是用变换量化的方式把像素块转换到频域丢弃高频细节再用熵编码表示。这就是DCT离散余弦变换的基本思想。注意量化这一步是有损的也是画质损失的根本来源。时间冗余连续帧之间有大量相同内容比如静态背景比如缓慢移动的物体。编码器通过运动估计找参考块只记录这个块从上一帧的某个位置平移了多少的运动矢量和残差帧与帧之间的信息量会大幅度下降。这就是I帧关键帧、P帧前向预测帧、B帧双向预测帧出现的意义。做一个简单估算一个I帧可能占几百KBP帧可能几十KBB帧更小大概几KB到几十KB。一个GOP两个I帧之间的帧组里I帧是体积大头遇到画面高速变化的场景P帧和B帧找不到好的参考块体积会暴涨这就是为什么视频编码后的码率是动态的而不是恒定不变的。4.2 常见的视频编码标准对比网上搜编码方式相关的资料扑面的词无非是H.264、H.265/HEVC、VP9、AV1。编码标准全称发布时间vs H.264压缩率授权专利情况典型场景H.264/AVCMPEG-4 Part 102003基准专利池授权直播、蓝光、网页视频、监控H.265/HEVCMPEG-H Part 22013同等质量下约节省50%码率专利池复杂授权费争议大4K超高清、HEIF图片、部分在线视频VP9Google2013接近HEVC无授权费YouTube、WebRTC、Chrome系浏览器AV1AOM联盟2018比HEVC再节省约30%开放专利声明流媒体平台高端档、HDR片源实际使用中H.264依然占据统治地位原因是它的生态太成熟了——硬解支持极其广泛老设备、新设备、浏览器、播放器基本通吃。H.265压缩率确实好但专利授权混乱导致很多硬件平台并不愿意内置解码器。你在网上看到B站充电视频解码免费Windows HEVC视频扩展之类的话题本质就是解码器授权费被分摊到终端用户头上的连锁反应。我用H.265做过几个月的监控录像归档确实能把存储量压到H.264的一半以下但回放软件不兼容、转码耗时增长、CPU占用率高这些现实问题也让体验大打折扣。AV1是流媒体圈的新方向压缩率最好但编码极其耗时目前主要用于点播类平台的高端档。如果做低延迟直播现阶段老老实实选H.264最稳妥。4.3 码率控制模式CBR、VBR与CRF压缩率说了这么多实际编码参数里真正决定最终文件长啥样的是码率控制方式。CBR恒定码率全程保持码率基本恒定。适合网络传输类场景比如直播上行推流带宽预算好估算。缺点是复杂画面时质量不足简单画面时浪费码率。VBR可变码率按画面复杂度动态分配码率。适合本地存储归档、点播文件目标是一致质量但最终文件大小不好预测。CRF恒定质量这是x264/x265里我最常用的模式。CRF值越低画质越好一般推荐18到23之间CRF18属于视觉无损级别23是较好的默认值28以上开始明显劣化。CRF的优点是设置简单质量恒定缺点也是码率不可控。曾做过一个车载视频项目需求是连续录制8小时SD卡固定容量128GB要求画质尽可能高。这种场景我选CBR模式先按总预算算出平均码率上限再用CBR控制峰值避免某段快速移动画面把存储撑爆。如果是个人做视频配字幕、压抖音素材CRF18到22是最省心的选择。5. 工程选型里的高频误区格式、编码与兼容性的实战建议做视频相关项目久了会发现许多听起来高大上的技术名词落地时栽在小细节上。这里把自己踩过的坑和调优经验整理成一个可以直接抄作业的清单。第一H.265不是万能的。很多新人在做视频网站或App时上来就选HEVC理由是省带宽。但如果你的目标设备是安卓中低端机、老款电视盒子、某些浏览器内核HEVC硬解支持率其实没那么乐观软件解码导致发热卡顿已是家常便饭。建议选型路径PC端Web平台优先H.264或AV1移动端iOS可以选HEVC系统自带硬解Android需要先摸清目标机型的支持情况再做多码率备选方案。实测中我用H.265做过的视频在某个主流品牌电视盒子上黑屏最后不得不转H.264多花了一天压缩时间。第二像素格式与编码器要匹配。刚才说过4:2:0是经济选择但如果你做的是屏幕录制、UI动画或者字幕叠层处理4:2:0会造成文字边缘发虚因为颜色信息被下采样了。这类内容要选4:4:4编码序列或用无损模式。以前给客户做录屏教程压出来字幕全是彩边那时才发现问题出在片源本身的采样格式上而不是码率不够。第三GOP结构对实时性影响极大。直播场景要严格控制GOP长度和帧类型排列。常规长GOP结构会增加延迟我看过很多自建的推流方案默认编码器参数没调GOP设置了250帧意味着每10秒才一个关键帧拉流端要么等关键帧到达才能出画面要么丢帧等下一个I帧这就是直播黑屏几秒的直接原因。建议直播推流设置关键帧间隔为2秒左右或者用纯IPPP结构去B帧把延迟压到可接受范围。第四注意色度信息不要被二次处理破坏。视频处理链路里有一个隐蔽问题素材到输出中间经过多次滤镜、缩放、降噪处理时处理引擎如果不是在高精度色彩空间比如10bit或RGB下工作每次处理都可能产生轻微的色彩偏移或抠像边缘劣化。我一般建议中间处理过程保留更多信息最后交付阶段再压缩成最终格式。这跟调色时先做色彩校正、后做风格化是一个道理信息越完整后期的容错空间越大。第五音频和字幕也要放在编码全局里考虑。视频编码不仅是视频轨的事。音频编码格式AAC、Opus、FLAC、字幕轨道的兼容性都会影响最终成品的可用性。MP4容器对字幕轨道的支持向来一般SRT字幕外挂是家常便饭MKV比较宽容但很多人喜欢直接改扩展名不重新封装结果播放器解码报错。多花一分钟检查容器规范往往比花一小时调编码参数更见效。第六车载视频、监控录像这类长期录制的场景要额外关注时间戳和文件分片策略。连续录制会产生海量小文件如果按标准MP4一段一段存录制周期内文件封装耗时会造成丢帧。做法是先按原始码流格式写入TS或裸流文件等录制结束后再做后处理封装。很多行车记录仪内部就是这么设计的。这一段经验我在做车载录像项目时反复验证过非常重要。6. 合成一张图从像素到编码的完整链路最后用一条模拟的工程任务把整篇文章串起来。假设你要开发一款带有拍照和视频上传功能的App用户会在手机上拍照、录像并上传到云端。照片链路是这样的手机摄像头传感器采集RAW拜耳阵列数据ISP图像信号处理器将它去马赛克、去噪、白平衡、色彩校正转成RGB。编码到JFIF/JPEG时内部会把RGB转成YUV 4:2:0再对Y和UV分别做DCT变换和量化利用哈夫曼编码压缩成jpeg文件。如果想要更高效的图片格式可以改用HEIF容器里存HEVC intra帧体积约只有JPEG的一半这也就是现在手机默认图片格式从JPEG转向HEIF的根本原因。视频链路则更复杂相机传感器输出的像素帧经过ISP处理后进入视频编码器。编码器将每一帧分割成宏块16×16像素或CTU块做帧内预测或帧间运动估计得出预测残差然后对残差做DCT、量化、熵编码最后封装进MP4/TS容器加上音频轨和元数据形成最终视频文件。上传到云端后服务端再通过转码集群把它转出多个分辨率、多种编码格式的版本比如H.264 1080p、H.265 720p、AV1低码率版配合CDN分发给不同设备。这个过程中任何一个环节的像素格式选错、帧率不对、码率控制失策都可能导致用户端看到卡顿、模糊、花屏或者声音对不上嘴型。所以你会发现从图像到像素从像素格式到视频再到视频编码方式其实是一条完整的数据流水线。每个环节的取舍都直接决定最终体验而理解这些底层逻辑就是做图像和视频工程的人最值钱的基本功。别急着追新概念把像素、采样格式、帧结构、编码器原理这几件事吃透大部分疑难杂症自己就能定位了。
返回列表