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。

cpp 复制代码
   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);

下边两种写法都可以:

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

cpp 复制代码
   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);

正确写法二:

cpp 复制代码
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;
相关推荐
VidDown4 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
常州晟凯电子科技17 小时前
8路CVBS/AHD合成一路视频无线传输系统评测
音视频·视频编解码
智能直播1 天前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
智能直播1 天前
RK3528 V4L2 框架 UVC 接口自动获取 H.264 / MJPEG / YUYV 格式:从内核采集到硬解分发
java·网络·实时音视频·视频编解码·h.264
八月的雨季 最後的冰吻2 天前
FFmepg-- 42-ffplay.c 线程安全机制深度分析
c语言·安全·ffmpeg
开开心心就好3 天前
把手机变成电脑麦克风,WiFi连接就能用
智能手机·ffmpeg·计算机外设·电脑·word·音视频
@嵌入式扫地僧3 天前
FFmpeg 解码 H.264 流提取 SEI 用户数据实战
ffmpeg·h.264·流媒体开发·sei 解析·自定义 sei
VimorphTech3 天前
ffmpeg.wasm 实战:浏览器提取视频音频,如何处理进度、取消和资源释放?
ffmpeg
小小龙学IT3 天前
FFmpeg 开源多媒体处理框架深度解析:从命令行到 libav* 全家桶
c语言·ffmpeg·开源
常州晟凯电子科技3 天前
多对一无线视频传输系统评测
音视频·视频编解码