Position tracking and seeking

到目前为止,我们已经了解了如何创建pipeline 来进行媒体处理以及如何使其运行。大多数应用程序开发人员会对向用户提供有关媒体进度的反馈感兴趣。例如,媒体播放器会想要显示一个显示歌曲进度的滑块,通常还有一个指示流长度的标签。转码应用程序需要显示任务完成百分比的进度条。 GStreamer 内置支持使用称为querying的概念来完成所有这些工作。由于seeking 非常相似,因此也将在此处讨论。seeking 是使用事件的概念来完成的。

查询:获取流的位置或长度

查询定义为请求与进度跟踪相关的特定流属性。这包括获取流的时长(如果可用)或获取当前位置。可以以各种格式检索这些流属性,例如时间、音频采样、视频帧或字节。最常用的函数是 gst_element_query (),尽管也提供了一些方便的封装(例如 gst_element_query_position () 和 gst_element_query_duration ())。您通常可以直接查询pipeline,它会为您计算内部细节,例如要查询的element。

在内部,查询将被发送到sinks,然后向后 “转发(dispatched)”,直到一个element 可以处理它;该结果将被发送回函数调用者。通常情况下,这就是demuxer,尽管有实时源(live sources)(来自网络摄像头),但它本身就是源。

#include <gst/gst.h>static gboolean
cb_print_position (GstElement *pipeline)
{gint64 pos, len;if (gst_element_query_position (pipeline, GST_FORMAT_TIME, &pos)&& gst_element_query_duration (pipeline, GST_FORMAT_TIME, &len)) {g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",GST_TIME_ARGS (pos), GST_TIME_ARGS (len));}/* call me again */return TRUE;
}gint
main (gint   argc,gchar *argv[])
{GstElement *pipeline;[..]/* run pipeline */g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline);g_main_loop_run (loop);[..]}

事件:seeking(以及更多)

事件的工作原理与查询非常相似。例如,dispatching对于事件的工作原理完全相同(并且也有相同的限制),并且它们可以类似地发送到顶层pipeline ,它会为你解决所有问题。尽管应用程序和elements 可以通过事件进行交互的方式还有很多,但我们在这里只重点seeking。这是使用seek-event完成的。一个seek-event包含一个播放速率、一个seek 的偏移格式(它是要遵循的偏移单位,例如时间、音频采样、视频帧或字节),一组可选的与seeking-related相关的标志(例如,内部缓冲区是否应该被刷新),一种seek 方法(指示相对于给定的偏移量)和 seek 偏移量。第一个偏移量 (cur) 是要寻找的新位置,而第二个偏移量 (stop) 是可选的,它指定流应该停止的位置。通常只指定 GST_SEEK_TYPE_NONE 和 -1 作为 end_method 和 end offset 就可以了。seek 的行为也包含在 gst_element_seek() 中。

static void
seek_to_time (GstElement *pipeline,gint64      time_nanoseconds)
{if (!gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,GST_SEEK_TYPE_SET, time_nanoseconds,GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {g_print ("Seek failed!\n");}
}

当pipeline 处于 PAUSED 或 PLAYING 状态时,应该使用 GST_SEEK_FLAG_FLUSH 进行搜索。pipeline 将自动进入预卷状态,直到查找后的新数据将导致pipeline再次预卷。pipeline预卷后,它将返回到执行查找时所处的状态(暂停或播放)。您可以使用 gst_element_get_state() 等待(阻塞)完成 或者等待ASYNC_DONE 消息出现在总线上。

没有 GST_SEEK_FLAG_FLUSH 标志的seek应该只在pipeline处于 PLAYING 状态时进行。在 PAUSED 状态下执行non-flushing seek可能会死锁,因为pipeline的流线程可能在sinks中被阻塞。

重要的是要认识到,在函数 gst_element_seek () 调用完成并返回时,seek不会立即执行。根据所涉及的特定element,实际查找可能会稍后在另一个线程(流线程)中完成,并且可能需要很短的时间,直到来自新查找位置的缓冲区到达 downstream  elements ,例如sinks (如果 是 non-flushing  的seek 那么它可能需要更长的时间)。

可以在短时间内进行多次seeks,例如对滑块移动的直接响应。在seek之后,pipeline将在内部暂停(如果它正在播放),位置将在内部重新设置,demuxers 和解码器decoders 从新位置开始解码,这将一直持续到所有sinks 再次有数据。如果它原来是在播放,它也会被设置为再次播放。由于新位置在视频输出中立即可用,因此即使您的pipeline未处于播放状态,您也会看到最新帧。

Gstreamer - 位置跟踪和定位相关推荐

  1. VR 科普-位置跟踪器,鼠标定位原理

    位置跟踪器 编辑 三维空间跟踪定位器是作用于空间跟踪与定位的装置,一般与其他VR设备结合使用,如:数据头盔.立体眼镜.数据手套等,使参与者在空间上能够自由移动.旋转,不局限于固定的空间位置.操作更加灵 ...

  2. 饿了么的定位android,外卖订餐服务“饿了么”Android版应用正式上线,未来或可对每个外卖员进行位置跟踪...

    懒.宅.加班狂.不会做饭,上面这四个光荣标签,你只要能沾到一两个,你或许就能理解,现在的外卖订餐服务为何大行其道了.继iOS版应用上线之后,在线外卖订餐服务目前的龙头"饿了么"在上 ...

  3. 目标跟踪 facebook_如何关闭Facebook Messenger的位置跟踪(如果已启用)

    目标跟踪 facebook It seems like everyone is tracking our location now. Not surprisingly, Facebook Messen ...

  4. 位置信息、定位技术与位置服务

    位置是物联网信息的重要属性之一,缺少位置的感知信息是没有实用价值的,位置服务采用 定位技术 ,确定智能物体当前的地理位置,利用 地理信息系统技术 与 移动通信技术,向物联网中的智能物体提供与其位置相关 ...

  5. 【电信学】【2016.02】基于IMU的遥控车自主导航位置跟踪

    本文为奥地利维也纳科技大学(作者:Dimitar Naydenov)的学士论文,共36页. 随着人们对自动驾驶汽车的日益关注,机器人自主导航已成为科学界的一个重要课题.为了在运动环境中导航,机器人首先 ...

  6. 多传感器分布式融合算法——多传感器网络协同目标跟踪和定位

    多传感器分布式融合算法 应用: 多传感器网络协同目标跟踪及定位 原创不易,路过的各位大佬请点个赞 主要讲解算法:          多传感器集中式融合算法/分布式融合算法/序贯融合算法         ...

  7. 物联网对位置跟踪和个人安全的好处

    随着物联网技术和基于位置的传感器(如GPS)的出现,我们现在能够为个人安全解决方案提供位置跟踪功能.危险或威胁的快速援助现在可以成为一个按钮. 当您考虑个人安全时会想到什么?您可能正在考虑家门上的锁. ...

  8. 通过位置跟踪模型显示PID三个参数作用

    在自动控制中,PID(Proportion-Integrationi-Differentiation:比例-积分-微分)控制算法在近一个多世纪以来在空城控制领域中占据了主导地位.它是由苏联工程师Min ...

  9. 柔性机械臂_CSR论文精选 | 基于视觉的双连杆柔性机械臂末端位置跟踪控制

    05基于视觉的双连杆柔性机械臂末端位置跟踪控制 Umesh Kumar Sahu; Dipti Patra; Bidyadhar Subudhi 文章精读 英文标题: Vision-based tip ...

最新文章

  1. html复选框位置,html – 对齐复选框和标签
  2. opencv 使用命令行参数法显示图片
  3. Java 泛型中? super T和? extends T的区别
  4. python计算能够包含两个圆的最小圆
  5. 多线程中使用UNITY变量导致线程执行断掉却又不报错的问题
  6. asp 与 database (3)
  7. php ping主机名,PHP PING值函数
  8. el表达式与jstl的用法
  9. SpringAOP aspectJ ProceedingJoinPoint 获取当前方法
  10. 没变强是因为你太舒服(图)
  11. 杭电1231最大连续子序列
  12. JSON.parse()函数处理json格式字符串方法
  13. 汽车电子电气架构EEA演变
  14. UVAOJ 10098 Generating Fast
  15. pt-archiver归档数据 源库和目标库是否会出现不一致
  16. 第五卷《鏖战雁门(下)》第47章《抉择》
  17. 基于单幅图像的2D转3D算法研究
  18. STM32CubeMX HAL F103 BKP备份寄存器使用
  19. 团队任务3每日立会(2018-10-26)
  20. 仅3w报价B站up主竟带来1200w播放!品牌高性价比B站投放标杆!

热门文章

  1. 使用ffmpeg对视频进行画面裁剪
  2. 使用xlsxwriter简单的将截图插入excel表格中
  3. 哈工大李治军老师操作系统笔记【10】:内核级线程实现(Learning OS Concepts By Coding Them !)
  4. ROS机器人程序设计(原书第2版)补充资料 (零) 源代码、资料和印刷错误修订等 2017年02月22日更新
  5. 【偶遇小bug】浏览器无法翻译此网页解决
  6. android+蓝牙遥控器,一种通过蓝牙遥控安卓设备的方法与流程
  7. 为什么别人不把你当回事(经典)
  8. dsf5.0 有确认按钮的弹框
  9. 中介者(Mediator)
  10. 仿网易云音乐的滑动冲突处理效果