当前位置: 首页 > news >正文

ffmpeg写YUV420文件碰到阶梯型横线或者条纹状画面的原因和解决办法

版权声明:本文为CSDN博主「文三~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/asdasfdgdhh/article/details/112831581

看到了,转载,留着备份一下

阶梯型横线:


条纹状画面:


 

出现阶梯型横线的原因是:对FFmpeg中AVFrame中width与linesize的关系不明确
因为存在字节对齐,所以linesize和width的大小可能会不同
假如按照64字节对齐,width=720。那么linesize=768。其中48位多余的用0x00补齐。这48位就是阶梯型横线出现的原因。

下边的方法写就可能会出现阶梯型横线。为什么是可能呢。因为如果width正好是64的倍数,那么width=linesize,就不会出现补齐的0x00。

   y_size = pInCodecCtx->width * pInCodecCtx->height; fwrite(pFrame->data[0], 1, y_size, fp);fwrite(pFrame->data[1], 1, y_size/4, fp);fwrite(pFrame->data[2], 1, y_size/4, fp);

下边两种写法都可以:

写法一(有时候也不行):

   fwrite(frame->data[0], 1, frame->linesize[0] * frame->height, out_yuv);fwrite(frame->data[1], 1, frame->linesize[1] * frame->height / 2, out_yuv);fwrite(frame->data[2], 1, frame->linesize[2] * frame->height / 2, out_yuv);

正确写法二:

FILE* out_yuv = fopen("C:/Users/zhou/Desktop/Mpeg2decoder/1.yuv","wb+");
AVFrame* frame = frameYUV;
frame->height = frameYUV->height;
frame->width = frameYUV->width;int picSize = frame->height *frame->width;int newSize = picSize * 1.5;//申请内存unsigned char *buf = new unsigned char[newSize];int a=0,i;for (i=0; i<frame->height; i++){memcpy(buf+a,frame->data[0] + i * frame->linesize[0], frame->width);a+=frame->width;}for (i=0; i<frame->height/2; i++){memcpy(buf+a,frame->data[1] + i * frame->linesize[1], frame->width/2);a+=frame->width/2;}for (i=0; i<frame->height/2; i++){memcpy(buf+a,frame->data[2] + i * frame->linesize[2], frame->width/2);a+=frame->width/2;}fwrite(buf, 1, newSize, out_yuv);delete buf;buf = nullptr;

http://www.lryc.cn/news/280529.html

相关文章:

  • 案例:新闻数据加载
  • 数学的雨伞下:理解世界的乐趣
  • 补充 vue3用户管理权限(路由控制)
  • C++ 深度优先搜索DFS || 模版题:排列数字
  • 计算机找不到msvcp120.dll如何解决?总结五个可靠的教程
  • 法线变换矩阵的推导
  • React.Children.map 和 js 的 map 有什么区别?
  • 13.Kubernetes部署Go应用完整流程:从Dockerfile到Ingress发布完整流程
  • 叉车车载终端定制_基于MT6762安卓核心板的车载终端设备方案
  • 【CSS】保持元素宽高比
  • 使用 Docker 和 Diffusers 快速上手 Stable Video Diffusion 图生视频大模型
  • C++ namespace高级用法
  • 如何允许远程访问 MySQL
  • PostgreSQL认证考试PGCA、PGCE、PGCM
  • Matlab深度学习进行波形分割(二)
  • Markdown高级用法——mermaid
  • cf919Div2C题题目总结
  • Pandas实战100例 | 案例 4: 数据选择和索引 - 选择特定的列和行
  • Netty-Netty实现自己的通信框架
  • 【算法刷题】总结规律 算法题目第2讲 [234] 回文链表,因为深浅拷贝引出的bug
  • RabbitMQ如何保证消息不丢失?
  • Random的使用
  • 通过反射修改MultipartFile类文件名
  • Macos下修改Python版本
  • 多种采购方式下,数智化招标采购系统建设解决方案
  • Java选择排序
  • [足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-1 坐标系与概念基准
  • 【金猿人物展】DataPipelineCEO陈诚:赋能数据应用,发挥未来生产力
  • 4D 毫米波雷达:智驾普及的新路径(二)
  • element plus自定义组件表单校验