飞思卡尔 I.MX6Q-vpu视频编解码

专栏说明

        本专栏针对飞思卡尔I.MX6Q芯片产品开发,主要为视频的采集(V4L2)、视频编解码(VPU)、视频格式转化(IPU)、H264封装为MP4、QT5的移植和显示。

        飞思卡尔I.MX6Q-LTIB安装配置

        飞思卡尔 I.MX6Q-vpu视频编解码

        飞思卡尔 I.MX6Q-ipu视频流格式转换

        飞思卡尔 I.MX6Q-封装H246为MP4

        飞思卡尔 I.MX6Q-高分辨率(1080P)视频采集编码

        飞思卡尔I.MX6Q-QT5的移植

        飞思卡尔 I.MX6Q-摄像头采集QT5显示和分辨率适配

前言

     对于使用飞思卡尔的vpu进行硬件编解码,你需要配置出你linux下LTIB环境,导出imx-test中的mxc_vpu_test源码,这方面的内容在之前文档已经说明,可以去查看,这篇文章主要介绍视频采集以及编解码,对于摄像头设备主要有两种,一种是USB摄像头,另一种是摄像头模组,例如:ov5640;本文主要分析这两种视频采集后再编解码。

一、摄像头模组ov5640视频采集编解码

        如果你是买着天嵌的开发板,那么这方面的驱动都已经有了,如果你是自己编译的内核或者没这个驱动,那么你需要手动去加载,下面这些都需要去加载:

insmod ipu_prp_enc.ko
insmod ipu_bg_overlay_sdc.ko
insmod ipu_fg_overlay_sdc.ko
insmod ipu_csi_enc.ko
insmod ov5642_camera.ko
insmod mxc_v4l2_capture.ko

加载完成后,就可以直接用mxc_vpu_test编译出来的mxc_vpu_test.out去进行编解码:

./mxc_vpu_test.out  -E "-o vpu.h264   -f 2 -w 640 -h 480" //摄像头采集后编码
./mxc_vpu_test.out -D "-i  vpu.h264 -f 2  -u 1  -w 640 -h 480"//解码

对于mxc_vpu_test.out更多的功能,你可以使用mxc_vpu_test.out -help去查看,或者直接去看源码。

mxc_vpu_test源码下载:mxc_vpu_test源码

mxc_vpu_test需要的vpu-lib源码下载:vpu-lib源码库

mxc_vpu_test需要的ipu-lib源码库下载:ipu-lib源码

二、USB摄像头视频采集编解码

        对于usb摄像头,只要你的ARM板支持usb摄像头,就会在/dev/下产生设备video*,这就是usb摄像头设备,你可以直接对它操作,对于usb摄像头难的不是驱动,而是飞思卡尔官方代码mxc_vpu_test是不支持usb摄像头的,所以你需要去修改源码来实现对usb摄像头的支持,对于代码的修改,主要有两点:修改v4l2代码适合usb摄像头、把摄像头采集的数据YUV422转为420(NV12)。

1、v4l2代码的修改

       由于 飞思卡尔官方代码是针对摄像头模组写的,所以当用usb摄像头采集时,有些关于摄像头的一些信息是读不出来的,例如:ioctl(cap_fd, VIDIOC_DBG_G_CHIP_IDENT, &chip),读取摄像头设备名就都不出来,其实这也很简单,把那些读不出的出错的代码直接屏蔽就可以了,还有个关键的参数一定的改 fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV,大部分usb摄像头是只支持这种格式的,所以得这样写,不然就会出错,对于v4l2摄像头采集的代码,网上很多,随便找个改改也是可以的,这里也提供了一个简单的测试程序;
采集代码例子下载: V4L2摄像头采集代码

2、输出格式YUV422转为420(NV12)

        这是本文中最为重要的部分,也是最难的部分,其实飞思卡尔不仅仅提供了vpu接口对视频编解码,同时也提供了ipu接口对视频图像进行处理,这里我就是使用它的ipu接口实现了YUV422转为420(NV12)的转化,更多IPU使用,可以查看专栏博客:飞思卡尔 I.MX6Q-ipu视频流格式转换

ipu实现YUV格式转化例子下载: IPU格式转化例子

得到代码后,就可以把ipu代码嵌入到mxc_vpu_test代码中,在这里你需要注意两点:

   (1)、得到一帧数据就需要转化;

   (2)、转化后赋给vpu解码的帧数据要正确;

在这里我贴出主要代码供参考:

memcpy(inbuf,cap_buffers[v4l2_buf.index].start,cap_buffers[v4l2_buf.index].length);
    // Perform the rotation 
ret = ioctl(fd_ipu, IPU_QUEUE_TASK, &task);		
if (ret < 0) {		
    printf("ioct IPU_QUEUE_TASK fail\n");		
    goto err2;		
}
			
fb[src_fbid].myIndex = enc->src_fbid + v4l2_buf.index;
//fb[src_fbid].bufY = cap_buffers[v4l2_buf.index].offset;
fb[src_fbid].bufY = task.output.paddr;

    关键就是这里的代码,关于之前那些直接照搬就可以了,当然整个可以实现的代码工程我也提供出来了;

整个USB采集VPU编码工程下载:IMX6Q-usb采集-vpu编码测试例子

总结:这文章主要是imx6Q的视频采集和vpu编解码,主要分析的是usb摄像头的采集和编解码,因为这方面的资料比较少,如果你还有什么难题可以直接给我留言,关于对于mxc_vpu_test程序分离和单独编译,可以查看后面的文章。

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ProYuan28

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

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

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

打赏作者

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

抵扣说明:

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

余额充值