yuv420P数据对AVFrame的赋值, 从AVFrame中取值yuv

yuv420P数据对AVFrame的赋值,

AVFrame *pict = new AVFrame;

   FILE * fyuv = fopen("G:\\352x288.yuv","rb");
  int nfilelen = ( width * height * 3 )/2;
  BYTE * pbuf = new BYTE[nfilelen];
  fread(pbuf,1,nfilelen,fyuv);
  fclose(fyuv);
 
 int size = width * height;
 
  pict->data[0] = pbuf;
  pict->data[1] = pict->data[0] + size;
  pict->data[2] = pict->data[1] + size / 4;
  pict->linesize[0] = width;
  pict->linesize[1] = width / 2;
  pict->linesize[2] = width / 2;

AVFrame * alloc_picture(enum PixelFormat pix_fmt, int width, int height)
{
 AVFrame *picture;
 uint8_t *picture_buf;
 int size;

 picture = avcodec_alloc_frame();                     if (!picture){ return NULL;} 
 size    = avpicture_get_size(pix_fmt, width, height);
 picture_buf = (uint8_t *)av_malloc(size);               if (!picture_buf) {av_free(picture); return NULL;}  
 
 avpicture_fill((AVPicture *)picture, picture_buf, pix_fmt, width, height);
 
 return picture;
}

从AVFrame中取值yuv

上面看到yuv对avFrame的复制,如果取值呢、
 

如果: pict->linesize[0] = =width; 相等;

但是如果不相等,一般  pict->linesize[0] 大于 width 16 或者一些别的,以为为了内存效率会按照固定倍数给值;

所以,一般取值的方法:

那么:

unsingd char * pbufY = new unsignd char * [  pict->linesize[0]  * pframe->height ];

memcpy( pbufY, pict->data[0] , pict->linesize[0]  * pframe->height );

同理:

u 和 v 的计算一样的方法;

然后关于显示:

设置 yuv 播放器 显示宽度为 pict->linesize[0] , 而不是 width;

当然,这是你看到图像最右边可能会有绿色的书线条,有多余的宽度值决定;

如果需要完美过去图像,你可以每行数据按照 width copy 就可以了;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chinabinlang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值