摄像头V4L2获取的YUY2格式转YUV420格式
摄像头取出格式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格式相关推荐
- 图片格式之YUV420 转RGB格式(含代码)
在数字图像处理种YUV格式也是我们经常遇到,与RGB一样也是一种编码格式,开始主要用于电视系统以及模拟视频领域.YUV,分为三个分量,"Y"表示明亮度(Luminance或Luma ...
- V4L2获取usb视频流测试代码
Video4Linux2(Video for Linux Two, 简称V4L2)是Linux中关于视频设备的驱动框架,为上层访问底层的视频设备提供统一接口.V4L2主要支持三类设备:视频输入输出设备 ...
- Linux应用开发【第七章】摄像头V4L2编程应用开发
文章目录 7 摄像头V4L2编程应用开发 7.1 V4L2简介 7.2 V4L2视频采集原理 7.3 V4L2程序实现流程 7.4 V4L2程序实例 7.4.1 打开设备 7.4.2 查询设备属性 7 ...
- YUY2(YUYV)转YUV420源码分析
视频监控,用到ARM11的H.264硬件编码器,由于其要求输入的视频为YUV420格式,所以需要对自己USB摄像头输出的YUY2格式进行转换. YUY2与YUV422内部排列形式一样!理论性分析,可参 ...
- Linux下通过v4l2获取视频设备名、支持的编解码及视频size列表实现
早些时候给出了在Windows下通过dshow获取视频设备信息的实现,包括获取视频设备名.获取每种视频设备支持的编解码格式列表.每种编解码格式支持的video size列表,见:https://blo ...
- android 摄像头参数,获取Android设备上的详细的摄像头信息
原标题:获取Android设备上的详细的摄像头信息 如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头 ...
- 海思开发板中的YUV420格式解析
一.什么是YUV YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间. YUV主要是用于优化彩色视频信号的传输,使其与早期的黑白电视机相容 ...
- SQL获取当前时间| 日期| SQL时间格式| SQL时间截取| getdate()用法
SQL 获取当前时间 | 日期 | SQL 时间格式 | SQL 时间截取 | getdate() 用法 1. 当前系统日期.时间 select getdate() 输出:2011-01-06 13: ...
- 视频图像数据处理八:将rgb视频图像转换为yuv420格式视频图像
文章目录 转换公式 需要注意 函数代码 测试用例 下载 本文介绍了将rgb视频图像转换为yuv420格式视频图像的方法,附有详细的代码和图像示例.文中rgb24和yuv420文件需要使用yuv/rgb ...
最新文章
- 同为Java开发:有了这些Java项目经历,面大厂稳了!
- 2018年6月PMP考试小结-计划和执行收获知识和证书
- CTFshow 命令执行 web46
- Python正则表达式,简单20个用例学习
- 荣耀智慧屏功能曝光 首发华为鸿蒙OS,荣耀智慧屏功能曝光:首发华为鸿蒙OS,全场景智慧体验...
- 线程安全-常用的模式
- Mac安装mysql8.x最简洁的步骤,避免采坑
- python中的 同步与异步 互斥锁 和 死锁
- java ajax 返回乱码,解决使用$.ajax的时候得到返回乱码
- Process Monitor工具找网吧广告
- vuepress-theme-reco@1.x 解决博客首页 与 仓库README不兼容问题
- 《软件技术学研会-技术培训》第0章 操作系统安装
- java计算机毕业设计学生学籍信息管理系统源码+mysql数据库+lw文档+系统+调试部署
- 服务器如何 建立远程连接?
- 2023美国大学生数学建模竞赛资料及思路
- Odoo产品分析 (三) -- 人力资源板块(5) -- 出勤(1)
- Sweetviz:让你只需三行代码实现Python探索性数据分析
- 永信至诚发起亿元创投基金 主投网络安全创业者
- 四、从数字中发现规律?
- Android 12.0 rom定制专栏系列解读