当前位置: 首页 > 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;

相关文章:

  • Camunda Spin
  • 【ASP.NET Core 基础知识】--MVC框架--Models和数据绑定
  • 记忆泊车PNC模块架构设计说明书
  • Mysql的in与exits
  • Emoji表情大全
  • C# Guid生成唯一值用例
  • 修改Echarts图表的标题和副标题的内容
  • 鸿蒙HarmonyOS兼容JS的类Web开发
  • 无重复字符的最长字串
  • 行为型设计模式——责任链模式
  • mysql-bin日志清理,并设置expire_logs_days时间,mysql占用空间过大问题
  • Java人脸识别
  • 常用注解/代码解释(仅个人使用)
  • 深入浅出Android dmabuf_dump工具
  • WXUI 基于uni-app x开发的高性能混合UI库
  • 10个最佳ES6特性 ES7与ES8的特性
  • javascript数组去重/查找/插入/删除
  • LeetCode29.两数相除 JavaScript
  • leetcode386. Lexicographical Numbers
  • nginx 配置多 域名 + 多 https
  • oldjun 检测网站的经验
  • Python3爬取英雄联盟英雄皮肤大图
  • Twitter赢在开放,三年创造奇迹
  • 关于Flux,Vuex,Redux的思考
  • 关于字符编码你应该知道的事情
  • 解决iview多表头动态更改列元素发生的错误
  • 聚类分析——Kmeans
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用API自动生成工具优化前端工作流
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 线上 python http server profile 实践
  • 小李飞刀:SQL题目刷起来!
  • 一些css基础学习笔记
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # 数据结构
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (6)STL算法之转换
  • (pojstep1.1.2)2654(直叙式模拟)
  • (学习日记)2024.01.09
  • (转)jQuery 基础
  • (轉貼) UML中文FAQ (OO) (UML)
  • ***测试-HTTP方法
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net Application的目录
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 读取 JSON格式的数据
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET关于 跳过SSL中遇到的问题
  • .NET业务框架的构建