当前位置: 首页 > news >正文

Gstreamer学习3----灌数据给管线之appsrc

参考资料

Basic tutorial 8: Short-cutting the pipeline

gstreamer向appsrc发送帧画面的代码_gst appsrc可变帧率-CSDN博客

在官网教程Basic tutorial 8: Short-cutting the pipeline

里面,讲了一个例子,push音频数据给管线,视频的例子更加直观一些,

主要步骤:

注册一个回调,

 g_signal_connect(appsrc, "need-data", G_CALLBACK(cb_need_data), NULL);

回调方法中,设置数据,再push进处理流程中

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

这个g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);是个同步阻塞方法,因为ret作为入参,记录执行的情况。

#include <gst/gst.h>
#define VIDEO_WIDTH   384
#define VIDEO_HEIGHT  288
#define VIDEO_FORMAT  "RGB16"
#define PIXEL_SIZE    2static void cb_need_data(GstElement* appsrc, guint unused_size, gpointer user_data)
{static gboolean white = FALSE;static GstClockTime timestamp = 0;GstBuffer* buffer;guint size;GstFlowReturn ret;g_print("cb_need_data called\n");static unsigned char color = 0;size = VIDEO_WIDTH * VIDEO_HEIGHT * PIXEL_SIZE;buffer = gst_buffer_new_allocate(NULL, size, NULL);/* this makes the image black/white */// gst_buffer_memset(buffer, 0, white ? 0xFF : 0x00, size);gst_buffer_memset(buffer, 0, color, size);color += 10;// white = !white;GST_BUFFER_PTS(buffer) = timestamp;GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 2);timestamp += GST_BUFFER_DURATION(buffer);g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);gst_buffer_unref(buffer);if (ret != GST_FLOW_OK){/* something wrong, stop pushing *///  g_main_loop_quit(loop);}
}gint main(gint argc, gchar* argv[])
{GstElement* pipeline, * appsrc, * conv, * videosink;GMainLoop* loop;/* init GStreamer */gst_init(NULL, NULL);loop = g_main_loop_new(NULL, FALSE);/* setup pipeline */pipeline = gst_pipeline_new("pipeline");appsrc = gst_element_factory_make("appsrc", "source");conv = gst_element_factory_make("videoconvert", "conv");videosink = gst_element_factory_make("autovideosink", "videosink");/* setup */g_object_set(G_OBJECT(appsrc), "caps",gst_caps_new_simple("video/x-raw","format", G_TYPE_STRING, VIDEO_FORMAT,"width", G_TYPE_INT, VIDEO_WIDTH,"height", G_TYPE_INT, VIDEO_HEIGHT,"framerate", GST_TYPE_FRACTION, 0, 1,NULL), NULL);gst_bin_add_many(GST_BIN(pipeline), appsrc, conv, videosink, NULL);gst_element_link_many(appsrc, conv, videosink, NULL);/* setup appsrc */g_object_set(G_OBJECT(appsrc),"stream-type", 0,"format", GST_FORMAT_TIME, NULL);g_signal_connect(appsrc, "need-data", G_CALLBACK(cb_need_data), NULL);/* play */gst_element_set_state(pipeline, GST_STATE_PLAYING);g_main_loop_run(loop);/* clean up */gst_element_set_state(pipeline, GST_STATE_NULL);gst_object_unref(GST_OBJECT(pipeline));g_main_loop_unref(loop);return 0;
}

可以看到颜色变化的画面

http://www.lryc.cn/news/374225.html

相关文章:

  • 【深度学习量化交易1】一个金融小白尝试量化交易的设想、畅享和遐想
  • 【0基础学爬虫】爬虫基础之自动化工具 DrissionPage 的使用
  • c++_0基础_讲解7 练习
  • docker一些常用命令以及镜像构建完后部署到K8s上
  • 在typora中利用正则表达式,批量处理图片
  • 构建LangChain应用程序的示例代码:33、如何在LangChain框架中使用HumanInputChatModel来模拟人工输入的聊天模型教程
  • 虚拟机使用桥接模式网络配置
  • 韩顺平0基础学java——第24天
  • leecode N皇后
  • 2024050802-重学 Java 设计模式《实战模板模式》
  • UNIAPP-ADB无线调试
  • 【stm32-新建工程】
  • 写点什么吧,作为STM32系列的开篇……
  • 代码随想录算法训练营第十天| 232.用栈实现队列|225. 用队列实现栈|20. 有效的括号|1047. 删除字符串中的所有相邻重复项
  • Pulsar 社区周报 | No.2024-06-07 | Apache Pulsar 新分支 3.3 版本发布
  • Go源码--sync库(3):sync.Pool(2)
  • Go如何在本地引用以及发布并引用自定义工具包
  • 使用了代理IP怎么还会被封?代理IP到底有没有效果
  • 在WSL2的Ubuntu中安装和使用Docker/Podman
  • 【WEEK16】Learning Objectives and Summaries【Spring Boot】【English Version】
  • AI大模型会让搜索引擎成为历史吗?
  • SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则
  • Java IO:byte[]、char[]、String三种对象的转换
  • Elasticsearch:简化数据流的数据生命周期管理
  • Verilog综合出来的图
  • KT-H6测距模块标品,测距范围1500m,demo报价1000RMB,批量报价500RMB
  • C数据结构:排序
  • 【Python】在 Pandas 中使用 AdaBoost 进行分类
  • 持续总结中!2024年面试必问 20 道并发编程面试题(九)
  • Linux:线程池