1 播放速度
GStreamer提供了两种改变播放速度的机制:步进事件(Step Events
)和搜索事件(Seek Events
)。步进事件允许跳过一定量的媒体,并改变随后的播放速度(只能为正值)。搜索事件还允许跳转到流中的任何位置,并设置正向和负向的播放速度。
1.1 改变播放速度
步进事件 :是一种更方便的改变播放速度的方式,因为创建它们所需的参数较少;但是,它们也有一些缺点,因此本教程使用搜索事件代替步进事件。步进事件只影响到sink
(在管道的末端),因此只有在管道的其余部分能够支持以不同的速度运行时才起作用,而搜索事件会通过整个管道传播,因此每个元素都可以对其做出反应。步进事件的优点是它们的执行速度要快得多。步进事件也无法改变播放方向。
要使用这些事件,需要创建它们,并将其传递到管道中,其中它们向上传播,直到达到可以处理它们的元素。如果将事件传递到像playbin这样的容器元素中,它将简单地将事件传递给其所有的sink
,这将导致执行多次搜索。常见的做法是通过video-sink
或audio-sink
属性检索playbin
的一个sink
,并直接将事件馈送到sink
中。
1.2 逐帧播放视频
逐帧播放是一种允许逐帧播放视频的技术。它通过暂停管道,然后发送步进事件来跳过每一帧。
2 函数与知识点
GstEvent *gst_event_new_seek (gdouble rate, GstFormat format, GstSeekFlags flags, GstSeekType start_type, gint64 start, GstSeekType stop_type, gint64 stop)
功能:为给定的参数分配一个新的seek事件。
说明:seek事件配置了从start到stop以rate给定的速度进行的管线播放,也称为播放段。起始和停止值以format表示。
速率为1.0表示正常播放速率,2.0表示加倍速度。负值表示倒播。不允许速率为0.0的情况,而应该通过将管线暂停来实现。
管道具有默认的播放段配置,其起始位置为0,停止位置为-1,速率为1.0。可以使用GST_QUERY_SEGMENT查询当前配置的播放段。
start_type和stop_type指定如何调整播放段中当前配置的起始和停止字段。调整可以相对于最后配置的值进行。GST_SEEK_TYPE_NONE表示位置不应更新。
当速率为正数且已更新起始位置时,播放将从新配置的起始位置开始。
对于负数的速率,播放将从新配置的停止位置(如果有的话)开始。如果更新了停止位置,则对于负数的速率,它必须与-1(#GST_CLOCK_TIME_NONE)不同。
不能相对于当前播放位置进行搜索,要实现这一点,需要将管道暂停,使用GST_QUERY_POSITION查询当前播放位置,并使用GST_SEEK_TYPE_SET将播放段的当前位置更新为所需位置。
参数:
rate - 新的播放速率
format - 寻求值的格式
flags - 可选的寻求标志
start_type - 新的起始位置的类型和标志
start - 新起始位置的值
stop_type - 新停止位置的类型和标志
stop - 新停止位置的值gboolean gst_element_send_event (GstElement * element, GstEvent * event)
功能:向元素发送事件。如果元素没有实现事件处理程序,事件将被推送到下游事件的任意链接的sink pad
,或者向上游事件的任意链接的source pad
。
cleanup:这个函数接管了提供的事件,所以如果你想在此调用之后重用事件,你应该使用gst_event_ref()
。GstEvent *gst_event_new_step (GstFormat format, guint64 amount, gdouble rate, gboolean flush, gboolean intermediate)
功能:创建一个新的步进事件。步进事件的目的是指示sink
跳过指定量(以format
表示)的媒体。它可用于逐帧播放视频或进行快速技巧模式。
说明:不允许使用小于等于0.0
的速率。如果要实现rate = 0.0
的效果,请暂停管道,如果要实现rate < 0.0
的效果,请使用seek
事件来首先反转播放方向。
flush
标志将在开始步进操作之前清除管道中的任何待处理数据