gstreamer - Gstreamer gst_buffer_pool_acquire_buffer 函数在 ARM 上很慢
问题描述
我的 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
我使用以下函数将 NV12 帧提供给 appsrc(640*480*1.5 = 460800 字节)
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;
}
当我运行管道时,我看到函数 gst_buffer_pool_acquire_buffer 占用了 20 毫秒到 60 毫秒之间的时间。有人可以指出我的方法是否有问题吗?我错过了什么吗?
解决方案
推荐阅读
- php - 如何使用 WooCommerce 短代码作为 PHP 代码
- sql - 取消透视数据时如何保留索引(SQL Server)
- c# - 检查两个字符串是否包含相同的单词但顺序不同
- mysql - MYSQL - 平均生日最多的一天
- neural-network - 我的神经网络中每个时期的时间是 0 秒
- r - 使用多个点而不是随机采样来插值密度
- junit5 - JUnit 5 和 Arguments.of() 函数
- office-js - 初始化 Office JS Excel 加载项时出错
- angular - Angular 9:通知“不相关”组件采取的行动
- r - 为什么在 for 循环中从 lm 模型中提取系数时会出现 NA 和意外结果?