【FFmpeg】是什么是未压缩的裸流?

什么是未压缩的原始数据(裸流)?

总结来说,在 FFmpeg 开发中,我们遇到的"裸流"主要有两种:

1. 视频裸流:YUV 或 RGB 像素数据
  • 概念 :你可以把视频想象成一个每秒闪过很多张图片(比如 30 张,即 30FPS)的幻灯片。原始数据就是记录这一张张图片上每一个像素点到底是什么颜色的数据。

  • RGB :最基础的表示法(红、绿、蓝)。每个像素由 R、G、B 三个数值组成,通常每个颜色占 1 字节(8 bits),所以一个像素需要 3 个字节

  • YUV (重点):在音视频开发中,裸流绝大多数是 YUV 格式(特别是 YUV420P)。

    • Y 代表明亮度(Luma,即灰度图/黑白画面)。

    • U 和 V 代表色度(Chroma,颜色信息)。

    • 为什么用 YUV? 科学家发现人眼对亮度极其敏感,但对色彩的细节相对迟钝。所以我们可以保留所有的 Y(亮度)数据,但扔掉一部分 U 和 V(色度)数据,人类肉眼根本察觉不到区别。

    • YUV420P :这是最经典的做法。它通过丢弃部分色彩数据,让平均每个像素占用的空间从 RGB 的 3 字节,骤降到了 1.5 字节 ,直接在裸流阶段就减小了一半的体积!这也是你课程第 3-04 节要专门讲 RGB → YUV 转换的原因。

2. 音频裸流:PCM 脉冲编码调制数据
  • 概念:声音在自然界是连续的模拟波浪。要在计算机里保存它,就必须在波浪上"打点"取样。PCM(Pulse Code Modulation)就是记录这些"点"的原始数据集合。

  • 三个核心参数

    1. 采样率 (Sample Rate):一秒钟打多少个点?常见的 44100Hz 意味着一秒钟采集四万四千一百个数据点。

    2. 采样位深 (Bit Depth / Sample Format) :每个点用多大的容器装?16 bit(2字节)或 32 bit(4字节)。在 FFmpeg 中常表示为 AV_SAMPLE_FMT_S16AV_SAMPLE_FMT_FLTP

    3. 声道数 (Channels):单声道还是左/右立体声?

为什么理解"裸流"如此重要?

如果你在右侧的页面里操作一下计算器,比如选择 1080P + 60帧 + YUV420P ,你会看到:1秒钟的视频裸流竟然高达 178 MB! 如果不压缩,你看一小时的电影(仅画面)需要下载约 625 GB 的数据。

这就完美解释了为什么音视频处理必须要有编码器(H.264 / AAC)。你的代码在读取了摄像头捕捉到的 YUV 裸流和麦克风捕捉的 PCM 裸流后,必须调用编码器将这庞大无比的 178 MB/s 瞬间压缩到几 MB/s,然后才能封装成 MP4 文件保存下来。

相关推荐
研究点啥好呢4 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong4 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
沫璃染墨4 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
6Hzlia5 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
计算机安禾5 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
unicrom_深圳市由你创科技5 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
无限进步_6 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio
C++ 老炮儿的技术栈6 小时前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
橘颂TA6 小时前
【笔试】算法的暴力美学——牛客 NC213140 :除2!
c++·算法·结构与算法
wsoz7 小时前
Leetcode普通数组-day5、6
c++·算法·leetcode·数组