ZBLOG

ffmepg解码以后的帧AVFrame数据格式为NV12,给出一段代码,把AVFrame的像素数据转为rbg格式

以下是将AVFrame的像素数据从NV12格式转换为RGB24格式的示例代码:

  1. void NV12ToRGB(AVFrame *frame, uint8_t *buffer) {
  2. int width = frame->width;
  3. int height = frame->height;
  4. uint8_t *y = frame->data[0];
  5. uint8_t *u = frame->data[1];
  6. uint8_t *v = frame->data[2];
  7. int stride_y = frame->linesize[0];
  8. int stride_u = frame->linesize[1];
  9. for (int j=0; j<height; j++) {
  10. for (int i=0; i<width; i++) {
  11. int Y = y[j*stride_y + i];
  12. int U = u[(j/2)*stride_u + 2*(i/2)];
  13. int V = v[(j/2)*stride_u + 2*(i/2)+1];
  14. // Convert YUV to RGB
  15. buffer[j*width*3 + i*3] = clip((298*(Y-16) + 409*(V-128) + 128)>>8);
  16. buffer[j*width*3 + i*3+1] = clip((298*(Y-16) - 100*(U-128) - 208*(V-128) + 128)>>8);
  17. buffer[j*width*3 + i*3+2] = clip((298*(Y-16) + 516*(U-128) + 128)>>8);
  18. }
  19. }
  20. }
  21. uint8_t clip(int value)
  22. {
  23. if(value > 255)
  24. return (uint8_t)255;
  25. else if(value < 0)
  26. return (uint8_t)0;
  27. else
  28. return (uint8_t)value;
  29. }

其中,NV12 是一种常见的 YUV420 格式,是先排列所有的Y分量(亮度),再把U、V 分量交替排列。在转换过程中,需要将 U、V 每个像素点内插至它周围的四个像素点,才能进行 RGB 转换。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=1601

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?