usb摄像头的视频进行硬件编码成h264

我们的需求是:旭日3开发板接3个摄像头,分别把采集的图像编码成h264格式。目的是后期可以查看录像。

测试过720P或者1280P的分辨率,用cpu软件编码h264,性能上达不到需求。

现在已经实现了了MIPI摄像头的硬件编码,可以使用。硬编码的接口 int32_t HB_VENC_SendFrame(VENC_CHN VeChn, VIDEO_FRAME_S *pstFrame ,int32_t s32MilliSec); 其中输入的原始数据格式VIDEO_FRAME_S。而获取MIPI摄像头的接口是intHB_VIN_GetChnFrame(uint32_t pipeId,uint32_t chnId,void*pstVideoFrame,int32_t millSec); 这里的获取到的void*pstVideoFrame 视频帧如何转换为编码接口需要的VIDEO_FRAME_S格式,已经在范例中找到。

现在需要解决的是:usb摄像头如何获取视频帧,并且如何把视频帧转换为编码接口HB_VENC_SendFrame需要的VIDEO_FRAME_S格式?从而让usb摄像头采集的视频,能够压缩成h264文件。

你好,usb 一般都是获取单帧图像,可以获取然后使用单帧图像压缩接口进行处理,ENCODER(编码模块)API | RDK X3用户手册 (horizon.cc)-
具体的示例目前手册中还没有全流程

好的,我看了下压缩接口

sp_encoder_set_frame

【函数原型】

int32_t sp_encoder_set_frame(void *obj, char *frame_buffer, int32_t size)

【功能描述】

向编码通道传入需要编码的图像帧数据,格式必须为 NV12

压缩接口是这样的,那么usb摄像头如何获取到NV12格式的图像帧?我在开发用户手册里没找到

通过v4l2 api可以获取usb图像,如果是nv12的就可以直接编码(获取原始nv12格式可以能会因为带宽原因效果差),如果是其他格式,先将图像解码,再送去编码h264

我这边几款摄像头格式都是yuv422的,试过可以用ffmpeg取到yuv422帧,也可以尝试转换为nv12格式。但是这种纯软方式性能上不知够不够。不知有没其它更快的方式

软件转换就够了,可以参考这个HorizonRDK/hobot_stereo_usb_cam (github.com)或者这个HorizonRDK/hobot_usb_cam (github.com)

我看范例里面没有yuv422到NV12的转换,我用ffmpeg把yuv422到NV12,可以编码,但是转一帧yuv422到NV12要200ms,达不到性能要求。请问有没有什么办法?

请具体一点呢,比如给个链接?

这里我建议使用模组产品,可以三路mipi支持进来,方便咱们这里推流操作

试试用这个创建buffer来转换,这个速度挺快的,7.3 系统控制 | RDK X3用户手册 (horizon.cc)的HB_SYS_Alloc

不好意思这个我没明白。转换时间主要是用在cpu耗时上吧,用这个buffer会比内存写快吗?