ARM上的Gstreamer gst\ U缓冲区\池\获取\缓冲区功能速度较慢

ARM上的Gstreamer gst\ U缓冲区\池\获取\缓冲区功能速度较慢,gstreamer,arm64,Gstreamer,Arm64,我的Gstreamer版本是1.17,使用来自的指令交叉编译 这是我的gstreamer管道 appsrc name=framesrc0 do-timestamp=true format=time ! video/x-raw,width=640,height=480,framerate=30/1,format=NV12 ! queue ! x264enc ! queue ! h264parse ! mpegtsmux ! filesink name=mysink location=./myfil

我的Gstreamer版本是1.17,使用来自的指令交叉编译

这是我的gstreamer管道

appsrc name=framesrc0 do-timestamp=true format=time ! video/x-raw,width=640,height=480,framerate=30/1,format=NV12 ! queue ! x264enc ! queue ! h264parse ! mpegtsmux ! filesink name=mysink location=./myfile.ts 
我使用下面的函数(640*480*1.5=460800字节)将NV12帧馈送到appsrc


当我运行管道时,我看到函数gst\u buffer\u pool\u acquire\u buffer的时间在20ms到60ms之间。有人能指出我的方法是否有问题吗?我错过什么了吗

我发现了问题所在。我的管道没有调整,不能达到30fps,缓冲池的缓冲区已经用完。默认情况下,gst_buffer_pool_acquire_buffer()函数将一直阻塞,直到释放任何缓冲区,从而导致延迟。希望这对某人有所帮助。我发现了问题所在。我的管道没有调整,不能达到30fps,缓冲池的缓冲区已经用完。默认情况下,gst_buffer_pool_acquire_buffer()函数将一直阻塞,直到释放任何缓冲区,从而导致延迟。希望这对别人有帮助。
bool BelGst::FeedData0(uint8_t *buf, uint32_t len)
{
    GstFlowReturn ret;
    GstBuffer *buffer;
    GstMapInfo info;
    timespec ts_beg, ts_end;
    uint32_t time_ms;

    clock_gettime(CLOCK_MONOTONIC, &ts_beg);
    ret = gst_buffer_pool_acquire_buffer (pool0, &buffer, NULL);
    if (G_UNLIKELY (ret != GST_FLOW_OK)) {
        cout <<  "BufferPool pool0 failed" << endl;
        return FALSE;
    }
    clock_gettime(CLOCK_MONOTONIC, &ts_end);

    time_ms = (ts_end.tv_sec - ts_beg.tv_sec)*1000 + (ts_end.tv_nsec - ts_beg.tv_nsec) / 1e6;

    cout << "Buffer pool acquire time = " << time_ms << "ms" << endl;

    /* Set its timestamp and duration */
    GST_BUFFER_TIMESTAMP(buffer) = timestamp0;
    GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale(1, GST_SECOND, 30);
    GST_BUFFER_OFFSET(buffer) = offset0++; 

    timestamp0 += GST_BUFFER_DURATION(buffer);

    gst_buffer_map(buffer, &info, GST_MAP_WRITE);
    memcpy(info.data, buf, len);
    gst_buffer_unmap(buffer, &info);

    g_signal_emit_by_name(app_source0, "push-buffer", buffer, &ret);

    gst_buffer_unref(buffer);

    return TRUE;
}
void BufferPoolSetup(GstBufferPool *&pool)
{
    GstStructure *config;
    int size, min, max;
    GstCaps *caps;

    pool = gst_buffer_pool_new();

    /* get config structure */
    config = gst_buffer_pool_get_config(pool);

    size = 640*480*1.5;
    min = 1;
    max = 4;

    caps = gst_caps_from_string("video/x-raw");

    /* set caps, size, minimum and maximum buffers in the pool */
    gst_buffer_pool_config_set_params (config, caps, size, min, max);
    gst_caps_unref(caps);

    gst_buffer_pool_set_config (pool, config);

    /* and activate */
    gst_buffer_pool_set_active (pool, TRUE);

    return;
}