GStreamer Basic tutorial 学习笔记(八)

简化流水线

目标:使用GStreamer构建的流水线不需要完全关闭。数据可以在任何时间以各种方式注入到流水线中,或者从流水线中提取出来。

appsrc可以以多种模式工作:在拉取模式(pull mode)下,它在每次需要数据时,从应用程序请求数据。在推送模式(push mode)下,应用程序以自己的速度推送数据。此外,在推送模式下,当已提供足够的数据时,应用程序可以选择在推送函数中被阻塞,或者可以监听enough-dataneed-data来控制数据的流动。此示例实现了后一种方法。关于其他方法的信息可以在appsrc的文档中找到。

缓冲区(Buffers)

定义:数据通过GStreamer流水线的块传输被称为缓冲区。

说明:Source pads产生缓冲区,这些缓冲区由Sink pads消费;GStreamer获取这些缓冲区并将它们从一个元素传递到另一个元素。

缓冲区只是表示一单位数据,不要假设所有缓冲区的大小相同,或者代表相同的时间量。也不要假设如果一个缓冲区进入一个元素,将会有一个缓冲区出来。元素可以自由处理接收到的缓冲区。GstBuffers也可以包含多个实际内存缓冲区。通过使用GstMemory对象抽象出实际的内存缓冲区,并且一个GstBuffer可以包含多个GstMemory对象。

每个缓冲区都附带有时间戳和持续时间,用于描述何时对缓冲区的内容进行解码、渲染或显示。时间戳是一个非常复杂和微妙的问题,但这种简化的视角应该足够了解。

例如:filesrc(读取文件的GStreamer元素)产生的缓冲区具有“ANY” caps,并且没有时间戳信息。在解复用(demuxing)之后(见基础教程3:动态流水线),缓冲区可以有一些特定的caps,例如“video/x-h264”。在解码之后,每个缓冲区将包含一个单独的带有原始caps的视频帧(例如,“video/x-raw-yuv”),并且具有非常精确的时间戳,指示该帧应该何时显示。

注意事项

本章的部分函数调用了-lgstaudio-1.0动态链接库,请写入CMakelist.txt里。

函数与知识点

  1. appsrc 介绍:将应用程序数据注入到GStreamer流水线中的元素是appsrc

  2. appsink 介绍:用于将GStreamer数据提取回应用程序的对应元素是appsink

  3. GstCaps *gst_caps_from_string (const gchar * string) 功能:将字符串表示的 caps 转换为 GstCaps

  4. new-sample 介绍:在接收到缓冲区时触发。需要通过emit-signals属性启用信号发射,因为默认情况下它是禁用的。

  5. emit-signals 介绍:发出 new-prerollnew-sample 信号。类型:gboolean。默认值:false

  6. guint g_idle_add (GSourceFunc function, gpointer data) 功能:将一个函数添加到默认主循环中,当没有更高优先级的事件等待时,该函数将被调用。该函数被赋予默认的空闲优先级,即G_PRIORITY_DEFAULT_IDLE。如果函数返回FALSE,则会自动将其从事件源列表中移除,并且不会再次调用。

  7. gboolean g_source_remove (guint tag) 功能:从默认主上下文中删除具有给定IDGSource。对于添加到非默认主上下文的源,必须使用g_source_destroy()

    说明:GSourceIDg_source_get_id()给出,或者将由以下函数返回:g_source_attach()、g_idle_add()、g_idle_add_full()、g_timeout_add()、g_timeout_add_full()、g_child_watch_add()、g_child_watch_add_full()、g_io_add_watch()、g_io_add_watch_full()

  8. gst_buffer_new_and_alloc() 功能:创建一个给定大小的新缓冲区。

  9. GST_BUFFER_TIMESTAMP 功能:获取缓冲区的时间戳,以纳秒(ns)做单位

  10. GST_BUFFER_DURATION 功能:获取缓冲区中数据的持续时间,以纳秒为单位(作为GstClockTime)。

  11. guint64 gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom) 功能:按有理数 num / denom 缩放 val,避免溢出和下溢,并且不会丢失精度。

    说明:如果 valnum 都大于 G_MAXUINT32,则此函数可能非常慢。
    参数:val - 要缩放的数字;num - 缩放比例的分子;denom - 缩放比例的分母

  12. gboolean gst_buffer_map (GstBuffer * buffer, GstMapInfo * info, GstMapFlags flags) 功能:使用缓冲区中所有合并内存块的GstMapInfo填充info

    cleanup:在使用后,info中的内存应使用gst_buffer_unmap取消映射。

  13. GstFlowReturn gst_app_src_push_buffer (GstAppSrc * appsrc, GstBuffer * buffer) 功能:将一个缓冲区添加到appsrc元素将推送到其source pad的缓冲区队列中。此函数接管缓冲区的所有权。

    说明:当block属性为TRUE时,此函数可以阻塞,直到队列中有可用的空闲空间。

  14. push-buffer 功能:appsrc的信号之一。将一个缓冲区添加到appsrc元素将推送到其源pad的缓冲区队列中。

    说明:此函数不会接管缓冲区的所有权,但它会引用该缓冲区,因此在调用此函数后可以随时解引用该缓冲区。

    例如:g_signal_emit_by_name (data->app_source, "push-buffer", buffer, &ret);

    cleanup:gst_buffer_unref()

  15. pull-sample 功能:sink的信号之一。这个函数会阻塞直到样本或EOS可用,或者appsink元素被设置为READY/NULL状态。

    说明:只有当appsink处于PLAYING状态时,此函数才会返回样本。所有已渲染的样本都将放入一个队列中,以便应用程序可以以自己的速度提取样本。

    注意:

    1. 当应用程序无法快速提取样本时,排队的样本可能会消耗大量内存,尤其是在处理原始视频帧时。可以使用“drop”和“max-buffers”属性来控制队列的行为。
    2. 如果在任何缓冲区之前接收到EOS事件,则此函数返回NULL。使用gst_app_sink_is_eos()来检查EOS条件。

    例如:g_signal_emit_by_name (appsink, "pull-sample", &ret);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答你的问题。关于通过UDP传输音视频,我了解一些相关的知识,下面是一些学习笔记: 1. gstreamer是一个流媒体框架,用于创建、处理和播放多媒体流。它支持多种音视频格式,可以通过插件扩展功能。 2. 通过gstreamer可以使用UDP协议传输音视频数据。UDP协议是一种无连接的协议,不保证数据传输的可靠性和顺序性,但是传输效率高。 3. 首先需要创建一个gstreamer的pipeline,包括音视频源、编码器、UDP发送端等组件。例如: ``` gst-launch-1.0 -v filesrc location=test.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000 ``` 这个pipeline的作用是从test.mp4文件读取音视频流,解码后使用x264编码器进行压缩,然后使用rtph264pay将数据打包成RTP数据包,最后通过udpsink发送到指定的IP地址和端口。 4. 接收端需要创建一个gstreamer的pipeline,包括UDP接收端、解包器、解码器等组件。例如: ``` gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! autovideosink ``` 这个pipeline的作用是从UDP端口5000接收音视频数据,使用rtpjitterbuffer解决网络抖动问题,使用rtph264depay将RTP数据包解包成原始的H.264数据流,然后使用avdec_h264解码器进行解码,最后使用autovideosink播放视频。 5. 在实际使用过程中,还需要考虑数据的带宽限制、网络延迟等问题,以保证音视频传输的效果。 希望这些笔记能对你有帮助。如果你还有其他问题,可以继续问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值