如何将帧缓冲区获取的YUV I420格式帧处理为可播放的原始码流
带步长偏移的I420帧缓冲区转标准可播放YUV流操作方法
问题原因
你直接存储的帧缓冲区原始数据默认带硬件对齐的填充字节,播放器所需的标准原始I420流要求三个平面无填充、连续紧凑排列,两者格式不匹配就会出现颜色错乱、画面错位的问题。
单帧处理步骤
你需要按如下规则逐帧提取有效字节,拼接后就是可直接播放的标准YUV流:
- 先定义参数变量,方便后续逻辑复用:
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字节数组中的起始下标
- 提取Y平面有效数据
Y平面共height行,每行取前width个有效字节:
遍历行号n(0 ≤ n < height),有效数据起始位置为offset_y + n * stride_y,连续取width个字节写入输出流。 - 提取U平面有效数据
I420格式下U平面的宽高均为Y平面的1/2,共height/2行,每行取前width/2个有效字节:
遍历行号n(0 ≤ n < height/2),有效数据起始位置为offset_u + n * stride_u,连续取width/2个字节写入输出流。 - 提取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
相关产品推荐
相关产品推荐

