gpt4 book ai didi

video - 使来自实时流的视频帧可跨多个客户端识别

转载 作者:行者123 更新时间:2023-12-04 23:00:24 24 4
gpt4 key购买 nike

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

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

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

一个澄清的例子

我想启用以下交互:

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

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

    建议的解决方案

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

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

    最佳答案

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

    又快又脏

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

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

    2)您将一个(持久)映射添加到您的服务器实现中,我们称之为框架映射,它将您的散列作为键,并返回一个整数作为它的值。

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

    4) 你向你的服务器添加一些额外的 API,客户端可以给你一个哈希值,你在帧映射中查找它并返回相应的递增帧号。

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

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

    干净的设计

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

    查看 RFC 2326 – 第 3.6 章正常播放时间和第 3.7 章绝对播放时间以了解这种方法。

    关于video - 使来自实时流的视频帧可跨多个客户端识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29939672/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com