nvidia xavier nx平台nvv4l2camerasrc支持GRAY8格式问题调试
1. 前言
nvidia相机插件“nvv4l2camerasrc”目前只支持UYVY格式
然而使用的相机是GRAY8格式,需要扩展nvv4l2camerasrc格式
2. 参考12_camera_v4l2_cuda
尝试运行样例来捕获帧,并将其移植到nvv4l2camerasrc插件
sample如下:
/usr/src/jetson_multimedia_api/samples/12_camera_v4l2_cuda
3. 丢帧问题
目前能够使用' v4l2src ' gstreamer插件捕获帧。
但是性能有些问题,导致帧丢失。
已经确定帧丢失发生在我的管道的开始,所以基本上是在源。
希望通过使用' nvv4l2camerasrc '插件,可以利用NVMM缓冲区有一些性能提高,也能够增加v4l2设备在插件中使用的队列缓冲区大小。
(1)在运行中检查是否能达到目标帧数:
gst-launch-1.0 v4l2src ! video/x-raw,format=GRAY8,width=_W_,height=_H_,framerate=_FR_ ! nvvidconv ! video/x-raw(memory:NVMM),format=I420 ! fpsdisplaysink text-overlay=0 video-sink=fakesink sync=0 -v
如果能在管道中获得足够的性能,可能不需要定制nvv4l2camerasrc。
自定义消除了一个从CPU缓冲区到NVMM缓冲区的内存副本。
如果想减少CPU负载,可以试一试。
(2)采集异常log
Setting pipeline to PAUSED …
Pipeline is live and does not need PREROLL …
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0: sync = false
Setting pipeline to PLAYING …
New clock: GstSystemClock
/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-raw, format=(string)GRAY8, width=(int)4208, height=(int)3120, framerate=(fraction)26/1, colorimetry=(string)2:4:7:1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, format=(string)GRAY8, width=(int)4208, height=(int)3120, framerate=(fraction)26/1, colorimetry=(string)2:4:7:1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/Gstnvvconv:nvvconv0.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)4208, height=(int)3120, framerate=(fraction)26/1, interlace-mode=(string)progressive, format=(string)NV12
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)4208, height=(int)3120, framerate=(fraction)26/1, interlace-mode=(string)progressive, format=(string)NV12
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = video/x-raw(memory:NVMM), width=(int)4208, height=(int)3120, framerate=(fraction)26/1, interlace-mode=(string)progressive, format=(string)NV12
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-raw(memory:NVMM), width=(int)4208, height=(int)3120, framerate=(fraction)26/1, interlace-mode=(string)progressive, format=(string)NV12
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink: caps = video/x-raw(memory:NVMM), width=(int)4208, height=(int)3120, framerate=(fraction)26/1, interlace-mode=(string)progressive, format=(string)NV12
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = video/x-raw(memory:NVMM), width=(int)4208, height=(int)3120, framerate=(fraction)26/1, interlace-mode=(string)progressive, format=(string)NV12
/GstPipeline:pipeline0/Gstnvvconv:nvvconv0.GstPad:sink: caps = video/x-raw, format=(string)GRAY8, width=(int)4208, height=(int)3120, framerate=(fraction)26/1, colorimetry=(string)2:4:7:1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, format=(string)GRAY8, width=(int)4208, height=(int)3120, framerate=(fraction)26/1, colorimetry=(string)2:4:7:1, interlace-mode=(string)progressive
gst_nvvconv_transform: NvBufferTransform not supported
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.
Additional debug info:
gstbasesrc.c(3055): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming stopped, reason error (-5)
Execution ended after 0:00:00.141547135
Setting pipeline to PAUSED …
Setting pipeline to READY …
Setting pipeline to NULL …
Freeing pipeline …
(3)更换视频格式
I420替换NV12。
用I420可以采集视频,但不是预期的26帧,而是21帧。
可能是从GRAY8到I420发生了格式转换导致的。
源代码是4208x312026fps。
由于分辨率高于4K,建议定制nvv4l2camerasrc插件。
4. 运行定制nvv4l2camerasrc
修改了插件以支持GRAY8格式。
然而,我遇到了一些奇怪的性能问题
gst-launch-1.0 v4l2src ! "video/x-raw, format=(string)GRAY8, width=(int)4208, height=(int)3120, framerate=(fraction)26/1" ! fpsdisplaysink video-sink=fakesink text-overlay=false -e -v
帧率是正常的26fps。
gst-launch-1.0 nvv4l2camerasrc bufapi-version=true ! "video/x-raw(memory:NVMM), format=(string)GRAY8, width=(int)4208, height=(int)3120, framerate=(fraction)26/1" ! fpsdisplaysink video-sink=fakesink text-overlay=false -e -v
只有2fps。
5. 运行12_camera_v4l2_cuda sample
试试12_camera_v4l2_cuda
看看运行示例时能否达到目标帧率
得到了下面的图像,帧率只有10fps。
6. 格式转换问题
根据文档nvvidconv插件应该支持从GRAY8(NVMM)到I420(NVMM)的转换。
然而,当我使用管道做这个转换,总是报以下问题
st_nvvconv_transform: NvBufferTransform not supported
12_camera_v4l2_cudaby GRAY8到I420的转换默认如下:
if (-1 == NvBufferTransform(ctx->g_buff[v4l2_buf.index].dmabuff_fd, ctx->render_dmabuf_fd,
&transParams))
ERROR_RETURN("Failed to convert the buffer");
if (ctx->cam_pixfmt == V4L2_PIX_FMT_GREY) {
if(!nvbuff_do_clearchroma(ctx->render_dmabuf_fd))
ERROR_RETURN("Failed to clear chroma");
}
调用NvBufferGetParams()来获取pitch,width,height。
看起来分辨率4208x3120,硬件缓冲区没有相同的间距和宽度,
所以帧没有捕获和放入缓冲区正确。
这是否意味着DMA不能用于此分辨率的v4l2相机?
if (ctx->cam_pixfmt == V4L2_PIX_FMT_GREY &&
params.pitch[0] != params.width[0])
ctx->capture_dmabuf = false;
对于我使用的分辨率,我得到
witdh = 4208
height = 3120
pitch = 4352
所以在我的例子中,它不使用DMA。为什么会这样呢?
通过手动修改宽度为4224在Raw2NvBuffer调用。所以显然宽度是64的倍数?为什么会这样呢?
无论如何,这是没有使用DMA,,因为这会导致过低的帧率。为什么会这样呢?
原因如下:
这是硬件DMA缓冲区的约束。
对于4208x3120,它的缓冲区在4352x3120中,有效数据在4208x3120中。
应该使用pitch=width分配DMA缓冲区。如果源程序只支持4208x3120,那么您将需要捕获到CPU缓冲区并调用Raw2NvBuffer。
7. 间距值设置
间距值对齐到256,所以320→512,640→768,4208→4352。
- 分享
- 举报
-
浏览量:10848次2021-05-06 16:22:01
-
2021-05-06 16:03:00
-
浏览量:8583次2021-05-14 14:43:43
-
浏览量:7907次2021-05-25 15:32:16
-
浏览量:5289次2021-07-09 15:20:08
-
浏览量:7084次2021-05-20 16:37:42
-
浏览量:9456次2021-05-26 14:17:15
-
浏览量:7417次2021-05-11 17:51:48
-
浏览量:9407次2021-04-27 17:56:41
-
2021-07-30 17:20:54
-
浏览量:5901次2021-05-28 13:52:17
-
浏览量:7447次2021-06-09 14:29:23
-
2021-07-30 17:04:37
-
浏览量:7147次2021-07-29 14:18:58
-
浏览量:5249次2021-05-10 17:48:42
-
浏览量:7087次2021-05-11 17:04:57
-
浏览量:6225次2021-07-09 15:17:28
-
浏览量:5201次2021-07-09 15:23:33
-
浏览量:7481次2021-05-20 17:08:14
-
178篇
- nvidia xavier nx平台禁用组合UART的问题
- 最强Nfan打造NVIDIA主题飞机翱翔天际
- 化身视频UP主!ShadowPlay和Fraps谁更适合?
- NVIDIA RTX和AI助力Studio 4D实现交互式可视化图像
- 最新发布 | 托管型边缘 AI 服务平台 NVIDIA Fleet Command, 为企业扩展边缘
- 颠覆游戏体验!NVIDIA至尊装备亮相腾讯游戏嘉年华
- 九大游戏赛事巅峰对决!NGF 2014招募正式开始
- Jetson Xavier平台 MIPI接口采集FPGA 图像视频 (2)驱动调试
- 巅峰对决一较高下!NGF 2014九大游戏冠军产生
- GeForce GTX 800M系列笔记本显卡发布
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
free-jdx
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明