Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv Gstreamer appsrc馈送1610x996映像时出现无效缓冲区大小错误_Opencv_Gstreamer_Nvidia - Fatal编程技术网

Opencv Gstreamer appsrc馈送1610x996映像时出现无效缓冲区大小错误

Opencv Gstreamer appsrc馈送1610x996映像时出现无效缓冲区大小错误,opencv,gstreamer,nvidia,Opencv,Gstreamer,Nvidia,我正在尝试使用以下管道为nvidia h264编码器(NVVIDCOV)OpenCv Mat提供数据: #define CAPS_APPSRC "video/x-raw, format=(string)I420,width=(int)1610, height=(int)996, framerate=25/1" #define CAPS_NVCONV "video/x-raw(memory:NVMM)" #define CAPS_OMX "video/x-h264, stream-format=(

我正在尝试使用以下管道为nvidia h264编码器(NVVIDCOV)OpenCv Mat提供数据:

#define CAPS_APPSRC "video/x-raw, format=(string)I420,width=(int)1610, height=(int)996, framerate=25/1"
#define CAPS_NVCONV "video/x-raw(memory:NVMM)"
#define CAPS_OMX "video/x-h264, stream-format=(string)byte-stream"
descr = g_strdup_printf ("appsrc name=src_name ! " CAPS_APPSRC " ! omxh264enc ! " CAPS_OMX " ! h264parse ! flvmux ! filesink location=test.mp4");
将1610x996 BGR的Mat帧大小转换为I420

cvtColor(g_frame,frame420,CV_BGR2YUV_I420);
g_帧为1610x996

frame420显示为1610x1494[(1610x1494*1.5)=2405340]

在颜色转换后的appsrc回调中,我分配了一个新的缓冲区并复制Mat数据,如下所示:

    size = frame420.step * frame420.rows;

    buffer = gst_buffer_new_allocate (NULL, size, NULL);
    gst_buffer_map(buffer,&info,GST_MAP_WRITE);

    memcpy(info.data,frame420.ptr(),size);
    gst_buffer_unmap(buffer,&info);
GST_BUFFER_PTS (buffer) = timestamp;
    GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 25);
    timestamp += GST_BUFFER_DURATION (buffer);
    g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
然后将缓冲区按如下方式馈送到appsrc:

    size = frame420.step * frame420.rows;

    buffer = gst_buffer_new_allocate (NULL, size, NULL);
    gst_buffer_map(buffer,&info,GST_MAP_WRITE);

    memcpy(info.data,frame420.ptr(),size);
    gst_buffer_unmap(buffer,&info);
GST_BUFFER_PTS (buffer) = timestamp;
    GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 25);
    timestamp += GST_BUFFER_DURATION (buffer);
    g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
但当我运行管道时,它会给出以下错误:

0:00:00.079123916  4112   0x2ac400 ERROR                default video-frame.c:149:gst_video_frame_map_id: invalid buffer size 2405340 < 2410320
0:00:00.079192404  4112   0x2ac400 ERROR            omxvideoenc /dvs/git/dirty/git-master_linux/external/gstreamer/gst-omx/omx/gstomxvideoenc.c:1778:gst_omx_video_enc_fill_buffer:<omxh264enc-omxh264enc0> Invalid input buffer size
0:00:00.079123916 4112 0x2ac400错误默认视频帧。c:149:gst_视频_帧_映射_id:无效缓冲区大小2405340<2410320
0:00:00.079192404 4112 0x2ac400错误omxvideoenc/dvs/git/dirty/git-master\u linux/external/gstreamer/gst omx/omx/gstomxvideo\u enc fill\u缓冲区:输入缓冲区大小无效
在错误“2405340&2410320”中提到的缓冲区大小中,2405340是可以理解的,因为它是我的数据大小,并且正在作为输入馈送。2410320来自哪里

为什么会发生这种情况


现在,如果我只是将缓冲区大小调整为1600x996,同样的管道也可以正常工作。它也适用于任何标准分辨率,例如1280x720等

,因为I420是4:2:0子采样格式-为什么缓冲区大小不是“宽度*高度*3/2”?除此之外,编码器可能对输入有一些格式限制,比如宽度和高度可以除以8/16/32?步幅/行字节值?实际上是“宽度*高度*3/2”。也许你对输入限制的看法是对的。既然I420是一种4:2:0的子采样格式,为什么缓冲区大小不是“宽度*高度*3/2”?除此之外,编码器可能对输入有一些格式限制,比如宽度和高度可以除以8/16/32?步幅/行字节值?实际上是“宽度*高度*3/2”。关于输入限制,也许你是对的。