You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将帧缓冲区获取的YUV I420格式帧处理为可播放的原始码流

带步长偏移的I420帧缓冲区转标准可播放YUV流操作方法

问题原因

你直接存储的帧缓冲区原始数据默认带硬件对齐的填充字节,播放器所需的标准原始I420流要求三个平面无填充、连续紧凑排列,两者格式不匹配就会出现颜色错乱、画面错位的问题。

单帧处理步骤

你需要按如下规则逐帧提取有效字节,拼接后就是可直接播放的标准YUV流:

  1. 先定义参数变量,方便后续逻辑复用:
    • width:帧宽度,即Size参数的第一个值(示例中为320)
    • height:帧高度,即Size参数的第二个值(示例中为180)
    • stride_y、stride_u、stride_v:Y/U/V三个平面每行实际占用的字节数,超出width的部分为无效填充字节
    • offset_y、offset_u、offset_v:Y/U/V三个平面在buf字节数组中的起始下标
  2. 提取Y平面有效数据
    Y平面共height行,每行取前width个有效字节:
    遍历行号n(0 ≤ n < height),有效数据起始位置为 offset_y + n * stride_y,连续取width个字节写入输出流。
  3. 提取U平面有效数据
    I420格式下U平面的宽高均为Y平面的1/2,共height/2行,每行取前width/2个有效字节:
    遍历行号n(0 ≤ n < height/2),有效数据起始位置为 offset_u + n * stride_u,连续取width/2个字节写入输出流。
  4. 提取V平面有效数据
    V平面格式和U平面完全一致,共height/2行,每行取前width/2个有效字节:
    遍历行号n(0 ≤ n < height/2),有效数据起始位置为 offset_v + n * stride_v,连续取width/2个字节写入输出流。

示例参数验证

以你给出的示例参数为例,计算可得单帧标准YUV的大小符合I420的标准规则:

  • Y平面总有效字节:180 * 320 = 57600
  • U平面总有效字节:90 * 160 = 14400
  • V平面总有效字节:90 * 160 = 14400
  • 单帧总大小:57600 + 14400 + 14400 = 86400,完全匹配标准I420单帧的width * height * 1.5的大小规则。

播放验证命令

处理完成后的多帧拼接文件可直接用FFmpeg/FFplay播放,以320x180分辨率为例,播放命令为:
ffplay -f rawvideo -pixel_format yuv420p -video_size 320x180 输出文件名.yuv

内容的提问来源于stack exchange,提问作者xieGieng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:36:05