daxi
1
我们的需求是:旭日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文件。
地瓜橙
2
你好,usb 一般都是获取单帧图像,可以获取然后使用单帧图像压缩接口进行处理,ENCODER(编码模块)API | RDK X3用户手册 (horizon.cc)-
具体的示例目前手册中还没有全流程
daxi
3
好的,我看了下压缩接口
sp_encoder_set_frame
【函数原型】
int32_t sp_encoder_set_frame(void *obj, char *frame_buffer, int32_t size)
【功能描述】
向编码通道传入需要编码的图像帧数据,格式必须为 NV12
。
压缩接口是这样的,那么usb摄像头如何获取到NV12格式的图像帧?我在开发用户手册里没找到
Chirs
4
通过v4l2 api可以获取usb图像,如果是nv12的就可以直接编码(获取原始nv12格式可以能会因为带宽原因效果差),如果是其他格式,先将图像解码,再送去编码h264
daxi
5
我这边几款摄像头格式都是yuv422的,试过可以用ffmpeg取到yuv422帧,也可以尝试转换为nv12格式。但是这种纯软方式性能上不知够不够。不知有没其它更快的方式
Chirs
6
daxi
7
我看范例里面没有yuv422到NV12的转换,我用ffmpeg把yuv422到NV12,可以编码,但是转一帧yuv422到NV12要200ms,达不到性能要求。请问有没有什么办法?
地瓜橙
9
这里我建议使用模组产品,可以三路mipi支持进来,方便咱们这里推流操作
Chirs
10
试试用这个创建buffer来转换,这个速度挺快的,7.3 系统控制 | RDK X3用户手册 (horizon.cc)的HB_SYS_Alloc
daxi
11
不好意思这个我没明白。转换时间主要是用在cpu耗时上吧,用这个buffer会比内存写快吗?