3,向appsrc发送数据,push模式

appsrc也支持push模式。

简单来说,就是你主动地把数据“填充”或者说是“发送”到appsrc里面。例如你自己创建一个thread,每间隔3秒往appsrc里面填充一次数据。我看了网上的一些demo,基本上都是通过pull模式的callback来做的, push模式相关的demo也比较不好找。

这种场景,我举个例子,比如你用ffmpeg获取到了一些h264的帧数据,想要自己主动地push到appsrc里面。

在上篇文章里的代码基础上做一些改动,核心就是填充数据以后,调用一下g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);  上篇文章里的pull模式里的 // g_signal_connect (appsrc, "need-data", G_CALLBACK (cb_need_data), NULL); 可以放心注释掉了

还有另外一个API:gst_app_src_push_buffer,区别在于buffer的owner关系,具体可以查看官方API文档。

g_signal_emit_by_name() does not take ownership of the buffer (meaning: you have to unref it afterwards), while gst_app_src_push_buffer() does.

// 启动一个线程来调用,写的有点随意,仅当demo用
void* doWork(void *userdata) {
	while (TRUE) {
		printf("dowork ===! \n");

		static gboolean white = FALSE;
		static GstClockTime timestamp = 0;
		GstBuffer *buffer;
		guint size;
		GstFlowReturn ret;

		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);

		white = !white;

		GST_BUFFER_PTS (buffer) = timestamp;
        // 需要注意一下时间戳
		GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int(3, GST_SECOND,
				1);

		timestamp += GST_BUFFER_DURATION(buffer);

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

		if (ret != GST_FLOW_OK) {
			g_printf("ret not ok! \n");
			/* something wrong, stop pushing */
			// g_main_loop_quit (loop);
		} else {
			g_printf("ret ok! \n");
		}
		
        // 测试每次间隔3秒填充一次
		g_usleep(3000000);
	}
}

 

Start a thread and from that thread push buffers to appsrc as fast as possible.

Enjoy it !

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于使用 ZeroMQ(zmq)的 Pull-Push 模式,你可以通过以下步骤实现数据的发送和接收: 1. 启动 Push 端和 Pull 端,分别创建 socket,并绑定到对应的地址上。 ```c++ // Push 端 zmq::context_t context(1); zmq::socket_t push_socket(context, ZMQ_PUSH); push_socket.bind("tcp://*:5555"); // Pull 端 zmq::context_t context(1); zmq::socket_t pull_socket(context, ZMQ_PULL); pull_socket.bind("tcp://*:5556"); ``` 2. 在 Push 端,使用 `zmq::send()` 函数发送数据。注意,该函数需要传入一个 `zmq::message_t` 类型的消息对象,该对象可以通过 `zmq::message_t(const void* data, size_t size)` 构造函数来创建。 ```c++ // Push发送数据 std::vector<std::string> msgs = {"Hello", "world", "!"}; for (const auto& msg : msgs) { zmq::message_t message(msg.size()); memcpy(message.data(), msg.c_str(), msg.size()); push_socket.send(message); } ``` 3. 在 Pull 端,使用 `zmq::recv()` 函数接收数据。该函数会返回一个 `zmq::message_t` 类型的消息对象,其中包含接收到的数据。 ```c++ // Pull 端接收数据 while (true) { zmq::message_t message; pull_socket.recv(&message); std::string msg(static_cast<char*>(message.data()), message.size()); std::cout << "Received message: " << msg << std::endl; } ``` 以上就是使用 ZeroMQ 实现 Pull-Push 模式数据发送和接收的基本步骤。需要注意的是,在实际使用中,还需要对数据进行序列化和反序列化操作,以确保数据可以正确传输。同时,在循环接收数据时,需要根据具体的业务需求来判断何时退出循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值