摄像头取出格式YUY2(YUYV)

Y    U00 Y     V00 Y    U01 Y     V01 Y    U02 Y    V02 Y    U03 Y    V03
Y U10 Y V10 Y U11 Y V11 Y U12 Y V12 Y U13 Y V13
Y U20 Y V20 Y U21 Y V21 Y U22 Y V22 Y U23 Y V23
Y U30 Y V30 Y U31 Y V31 Y U32 Y V32 Y U33 Y V33

转为 NV12(YUV420)

这里的转化主要是我的电脑软件pyuv 只支持yuv420格式的预览

另一方面主要是因为 ffmpeg 中进行编码时,采用的是 AV_PIX_FMT_YUV420P.

也是需要把摄像头中的YUYV转化为 ffmpeg 支持的YUV420P格式

Y   Y   Y   Y   Y   Y   Y   Y   Y   Y   Y   Y   Y   Y   Y   Y  
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
U00 U01 U02 U03 U20 U21 U22 U23 V00 V01 V02 V03 V20 V21 V22 V23

这里转换主要为需要隔1整行取出1整行的UV数据,而不是间隔一个一个取。

可以看出丢失了一部分UV数据,只要Y数据没有丢失,图像会依然保持完整呈现。

转换代码:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
#include <sys/ioctl.h>

#define CAM_W 640
#define CAM_H 480

typedef struct{
    char y1;
    char u;
    char y2;
    char v;
}TAG_YUY2;

static int YUYV_TO_NV12(unsigned char yuyv_in[], unsigned char* out){
    TAG_YUY2 *p_yuy2;
    int yuy2_size = CAM_W*CAM_H;
    int i = 0;
    int j = 0;
    int total = CAM_W*CAM_H*2;
    int tag_size = CAM_W*CAM_H/2;
    p_yuy2 = (TAG_YUY2 *)malloc(total);
    memcpy(p_yuy2, yuyv_in, total);
    
    i=0;
    j=0;
    int n = 0;
    for(i=0; i<tag_size; i++){
        out[j++] = p_yuy2[i].y1;
        out[j++] = p_yuy2[i].y2;
    }
    int pos = 0;
    int x = 0;
    int y = 0;
    int len_x = CAM_W/2;
    for(y = 0; y < CAM_H; y+=2){ // 每2行取一次值 u
        for(x = 0; x < len_x; x++){
            out[j++] = p_yuy2[y*len_x + x].u;
        }
    }
    for(y = 0; y < CAM_H; y+=2){ // 每2行取一次值 v
        for(x = 0; x < len_x; x++){
            out[j++] = p_yuy2[y*len_x + x].v;
        }
    }
    free(p_yuy2);
    return (CAM_W*CAM_H*3/2);
}

int main(){
    int result;
    FILE *fp_yuyv = fopen("frame.yuv", "rb");
    FILE *fp_nv21 = fopen("nv21.yuv", "wb");
    
    unsigned char* buf_yuv = (unsigned char*)malloc(CAM_W*CAM_H*2);
    unsigned char* nv21 = (unsigned char*)malloc(CAM_W*CAM_H*2);

fread(buf_yuv, 1, CAM_W*CAM_H*2, fp_yuyv);

memset(nv21, 0, CAM_W*CAM_H*2);
    result = YUYV_TO_NV12(buf_yuv, nv21);

fwrite(nv21, 1, result, fp_nv21);
    
    free(buf_yuv);
    free(nv21);
    
    fclose(fp_yuyv);
    fclose(fp_nv21);
    return 0;
}

整个转换的核心是隔行采样 UV 数据, 而不是间隔1个UV单位采样。

摄像头V4L2获取的YUY2格式转YUV420格式相关推荐

  1. 图片格式之YUV420 转RGB格式(含代码)

    在数字图像处理种YUV格式也是我们经常遇到,与RGB一样也是一种编码格式,开始主要用于电视系统以及模拟视频领域.YUV,分为三个分量,"Y"表示明亮度(Luminance或Luma ...

  2. V4L2获取usb视频流测试代码

    Video4Linux2(Video for Linux Two, 简称V4L2)是Linux中关于视频设备的驱动框架,为上层访问底层的视频设备提供统一接口.V4L2主要支持三类设备:视频输入输出设备 ...

  3. Linux应用开发【第七章】摄像头V4L2编程应用开发

    文章目录 7 摄像头V4L2编程应用开发 7.1 V4L2简介 7.2 V4L2视频采集原理 7.3 V4L2程序实现流程 7.4 V4L2程序实例 7.4.1 打开设备 7.4.2 查询设备属性 7 ...

  4. YUY2(YUYV)转YUV420源码分析

    视频监控,用到ARM11的H.264硬件编码器,由于其要求输入的视频为YUV420格式,所以需要对自己USB摄像头输出的YUY2格式进行转换. YUY2与YUV422内部排列形式一样!理论性分析,可参 ...

  5. Linux下通过v4l2获取视频设备名、支持的编解码及视频size列表实现

    早些时候给出了在Windows下通过dshow获取视频设备信息的实现,包括获取视频设备名.获取每种视频设备支持的编解码格式列表.每种编解码格式支持的video size列表,见:https://blo ...

  6. android 摄像头参数,获取Android设备上的详细的摄像头信息

    原标题:获取Android设备上的详细的摄像头信息 如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头 ...

  7. 海思开发板中的YUV420格式解析

    一.什么是YUV YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间. YUV主要是用于优化彩色视频信号的传输,使其与早期的黑白电视机相容 ...

  8. SQL获取当前时间| 日期| SQL时间格式| SQL时间截取| getdate()用法

    SQL 获取当前时间 | 日期 | SQL 时间格式 | SQL 时间截取 | getdate() 用法 1. 当前系统日期.时间 select getdate() 输出:2011-01-06 13: ...

  9. 视频图像数据处理八:将rgb视频图像转换为yuv420格式视频图像

    文章目录 转换公式 需要注意 函数代码 测试用例 下载 本文介绍了将rgb视频图像转换为yuv420格式视频图像的方法,附有详细的代码和图像示例.文中rgb24和yuv420文件需要使用yuv/rgb ...

最新文章

  1. 同为Java开发:有了这些Java项目经历,面大厂稳了!
  2. 2018年6月PMP考试小结-计划和执行收获知识和证书
  3. CTFshow 命令执行 web46
  4. Python正则表达式,简单20个用例学习
  5. 荣耀智慧屏功能曝光 首发华为鸿蒙OS,荣耀智慧屏功能曝光:首发华为鸿蒙OS,全场景智慧体验...
  6. 线程安全-常用的模式
  7. Mac安装mysql8.x最简洁的步骤,避免采坑
  8. python中的 同步与异步 互斥锁 和 死锁
  9. java ajax 返回乱码,解决使用$.ajax的时候得到返回乱码
  10. Process Monitor工具找网吧广告
  11. vuepress-theme-reco@1.x 解决博客首页 与 仓库README不兼容问题
  12. 《软件技术学研会-技术培训》第0章 操作系统安装
  13. java计算机毕业设计学生学籍信息管理系统源码+mysql数据库+lw文档+系统+调试部署
  14. 服务器如何 建立远程连接?
  15. 2023美国大学生数学建模竞赛资料及思路
  16. Odoo产品分析 (三) -- 人力资源板块(5) -- 出勤(1)
  17. Sweetviz:让你只需三行代码实现Python探索性数据分析
  18. 永信至诚发起亿元创投基金 主投网络安全创业者
  19. 四、从数字中发现规律?
  20. Android 12.0 rom定制专栏系列解读

热门文章

  1. 数值计算方法(停更笔记)
  2. 桌面图标显示异常修复
  3. 支付网站服务器费用怎么记账,支付云服务器的费用怎么做账
  4. 佩奇(社会人)大学初探——联迪商用实习小结(2018-4至2018-6)
  5. Wireless access point
  6. 常见的超分辨率处理方法
  7. 计算机实验中发现的问题及解决方法,计算机实验室管理中的问题及解决办法论文...
  8. Python 视频添加音频(附代码) | Python工具
  9. 云业CMS开源企业建站系统v2.1.6源码
  10. 人生若只如初见(二)