gstreamer - 从 C++ 向 gstreamer 提供视频;如何获得工作时间
问题描述
我正在尝试将 gstreamer 管道添加到我的程序中。我的程序生成了一个我希望由 gstreamer 处理的视频流。这基本上只在时间上有效:显示的每一帧之间存在巨大的延迟。同样在几秒钟后,它完全停止。
这是启动流的代码:
GstCaps *video_caps = gst_caps_new_simple("video/x-raw",
"format", G_TYPE_STRING, "RGB",
"width", G_TYPE_INT, w,
"height", G_TYPE_INT, h,
"block", G_TYPE_BOOLEAN, TRUE,
"do-timestamp", G_TYPE_BOOLEAN, TRUE,
"framerate", GST_TYPE_FRACTION, fps, 1, nullptr);
gst_app_src_set_caps(GST_APP_SRC(appsrc), video_caps);
gst_app_src_set_max_bytes((GstAppSrc *)appsrc, 1 * w * h * 3);
gst_element_set_state(gpipeline, GST_STATE_PLAYING);
然后对于我做的每一帧:
GstBuffer *buffer = gst_buffer_new_and_alloc(w * h * 3);
gst_buffer_fill(buffer, 0, my_frame, w * h * 3);
if (gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer) != GST_FLOW_OK)
log(LL_WARNING, "Problem queing frame");
完整源码:完整源码
解决方案
我认为您还需要直接设置一些 appsrc 属性,而不仅仅是大写。例如block
,anddo-timestamp
不是上限,不会在那里产生任何影响。请参阅https://github.com/floe/surface-streams/blob/master/common.cpp#L189-L207以供参考:
/* setup */
g_object_set (G_OBJECT (appsrc), "caps",
gst_caps_new_simple ("video/x-raw",
"format", G_TYPE_STRING, type,
"width", G_TYPE_INT, tw,
"height", G_TYPE_INT, th,
"framerate", GST_TYPE_FRACTION, 0, 1,
NULL), NULL);
gst_bin_add_many (GST_BIN (gpipeline), appsrc, videosink, NULL);
gst_element_link_many (appsrc, videosink, NULL);
/* setup appsrc */
g_object_set (G_OBJECT (appsrc),
"stream-type", 0, // GST_APP_STREAM_TYPE_STREAM
"format", GST_FORMAT_TIME,
"is-live", TRUE,
"block", TRUE,
"do-timestamp", TRUE,
NULL);
推荐阅读
- node.js - 从 S3 下载文件并按行数拆分
- binary - 将二进制激光雷达数据 (.bin) 转换为点云数据 (.pcd) 格式
- c# - 在子文件夹的所有文件夹中搜索指定文件的存在
- sql-server - SQL Server 中的 JDBC 接收器是否可用于跳过我的源中未提供的列?
- flutter - A按钮完成后如何执行按钮B?
- java - 循环内循环 - 显示 ArrayList
- node.js - 为什么此 AWS lambda 会导致错误:警告:回调/响应已交付
- android - 构建命令失败。或 make.exe 不是内部或外部命令、可运行程序或批处理文件
- javascript - 为什么 form.change(name, value) 不更新表单值
- java - 如何访问 JSON 对象的名称?