【问题标题】:Make video frames from a livestream identifiable across multiple clients使来自实时流的视频帧可跨多个客户端识别
【发布时间】:2015-07-08 11:58:55
【问题描述】:

我需要将来自实时源的视频流分发给多个客户端,并要求每个帧都可在所有客户端中识别。

我已经对该主题进行了研究,并得出了一个可以分享的可能解决方案。我的解决方案似乎不太理想,这是我第一次使用视频流,所以我想看看是否有人知道更好的方法。

我需要能够识别视频流中的特定帧的原因是流式传输客户端需要能够谈论它们每个人在其视频流中识别的事件之间的时间差异。

一个小例子

我想启用以下交互:

  • 两个客户端应用程序 Dewey 和 Stevie 连接到流媒体服务器
  • Dewey 显示流,Stevie 将其保存到磁盘
  • Dewey 确定了 Stevie 感兴趣的特定视频帧,因此他想将这件事告诉 Stevie
  • Dewey 从视频帧中提取一些识别信息并将其发送给 Stevie
  • Stevie 使用识别信息从他当前保存的直播副本中提取相同的帧

Dewey 无法直接将帧发送给 Stevie,因为 Malcolm 和 Reese 也想告诉他有关特定视频帧的信息,而 Stevie 对他们的发现之间的时间差感兴趣。

建议的解决方案

我找到的解决方案是使用ffserver 广播 RTP 流并使用 RTCP 数据包中的时间戳来识别帧。这些时间戳通常用于同步音频和视频,而不是提供跨多个客户端的共享时间线,这就是为什么我怀疑这是解决我的问题的最佳方法。

拥有帧号似乎也是有益的,例如增加帧计数器而不是任意时间戳,后者增加了一些可能不同的偏移量,因为对于我的应用程序,我还必须参考相邻帧,并且似乎更容易计算与帧的时间差数字,而不是相反。

【问题讨论】:

  • 一切顺利。我们正在尝试解决同样的问题。我们正在研究的一种方法是如何破解隐藏式字幕以在客户端之间提供更好的同步,但这也存在问题。非常感谢您的帮助。谢谢!
  • 我已经发布了我们在该主题上所做的设计工作的解决方案。

标签: video ffmpeg video-streaming live-streaming


【解决方案1】:

取决于格式。例如,MPEG 传输流使用Program Clock Reference (PCR)。为了让您开始,使用ffplay,您可以获得帧的Presentation Time Stamp (PTS) 和帧计数。我不确定帧数是否会有所帮助,因为它取决于播放开始时间。

ffplay -i <input stream> -vf showinfo

PCR 值会在某个时候折回,因此您也必须考虑到这一点。

【讨论】:

  • 如果它取决于播放开始时间,可悲的是它并没有真正的帮助,但是谢谢。
【解决方案2】:

我们最终没有完成该项目,遗憾的是我无法提供任何源代码,但我们从概念上开发了两个解决方案,可能对解决相同问题的其他人有用。
第一个解决方案是实现预期目标的最小努力解决方案,而第二个解决方案是一个更灵活的设计,它利用 RTCP 来支持各种视频格式。

又快又脏

您从 MJPEG 流的现有实现或一些具有自包含帧的类似相当简单的视频编解码器开始,并在该格式下放置一个无损传输层(如 TCP 或 HTTP)。

1) 您在视频编解码器实现中添加了一个函数,该函数可以从帧的图像数据中生成哈希值,例如 SHA1。

2) 你添加一个(持久的)Map 到你的服务器实现,我们称之为 framemap,它将你的哈希值作为键,并返回一个整数作为它的值。

3) 当您在服务器上将视频编码为输出格式时,计算每一帧的哈希值并将其放入 framemap 中,并使用一个递增的整数来标识该帧。

4) 你添​​加一些额外的 API 到你的服务器,客户端可以给你一个哈希,然后你在 framemap 中查找它并返回相应的增加的帧号。

5) 在客户端,如果您想知道递增的帧号,则计算帧的哈希值,向服务器 API 询问帧哈希值,然后它会将递增的帧号发回给您。

在此设计中,您只需在视频编解码器的某处添加散列功能,并将其他所有内容添加到其他位置。

简洁的设计

这依赖于 RTP 协议和它的 RTCP 控制流。 每个 RTP 数据包都有一个时间戳,表示包含的帧的预期呈现时间,但它的起始值是随机的,因此您需要查看 RTCP 控制流,它会为您提供服务器的 NTP 时间戳和相应的呈现时间.由此,您应该能够根据服务器的 NTP 时钟计算出相当精确的时间戳。我们试图向 VLC 添加支持此功能的功能,但结果证明这相当困难,因为 VLC 有一个相当复杂的代码库,可以将来自不同地方的大量代码汇集在一起​​。所以也许你想在这里扩展一个更简单的实现,这取决于你的要求。

查看 RFC 2326 – 第 3.6 章正常播放时间和第 3.7 章绝对播放时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2017-08-12
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多