Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 使来自livestream的视频帧在多个客户端之间可识别_Video_Ffmpeg_Video Streaming_Live Streaming - Fatal编程技术网

Video 使来自livestream的视频帧在多个客户端之间可识别

Video 使来自livestream的视频帧在多个客户端之间可识别,video,ffmpeg,video-streaming,live-streaming,Video,Ffmpeg,Video Streaming,Live Streaming,我需要将一个视频流从一个实时源分发到多个客户机,并要求每个帧在所有客户机上都是可识别的 我已经对这个话题做了研究,我已经找到了一个可能的解决方案,我可以和大家分享。我的解决方案似乎不太理想,这是我第一次使用视频流,所以我想看看是否有人知道更好的方法 我需要能够识别视频流中的特定帧的原因是,流式客户端需要能够谈论每个客户端在其视频流中识别的事件之间的时间差 一个简单的例子 我想启用以下交互: 两个客户端应用程序Dewey和Stevie连接到流媒体服务器 杜威显示流,史蒂维将其保存到磁盘 杜威确定

我需要将一个视频流从一个实时源分发到多个客户机,并要求每个帧在所有客户机上都是可识别的

我已经对这个话题做了研究,我已经找到了一个可能的解决方案,我可以和大家分享。我的解决方案似乎不太理想,这是我第一次使用视频流,所以我想看看是否有人知道更好的方法

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

一个简单的例子 我想启用以下交互:

  • 两个客户端应用程序Dewey和Stevie连接到流媒体服务器
  • 杜威显示流,史蒂维将其保存到磁盘
  • 杜威确定了史蒂夫感兴趣的特定视频帧,因此他想告诉史蒂夫
  • 杜威从视频帧中提取一些识别信息,并将其发送给史蒂维
  • Stevie使用识别信息从当前保存的livestream副本中提取相同的帧
杜威无法直接将视频帧发送给史蒂夫,因为马尔科姆和里斯也想告诉他具体的视频帧,而史蒂夫对他们发现的时间差感兴趣

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


拥有帧编号似乎也很有好处,比如增加帧计数器,而不是任意时间戳,这些时间戳会增加一些可能不同的偏移量。对于我的应用程序,我还必须参考相邻帧,并且从帧编号计算时间差似乎更容易,而不是相反。

取决于格式。例如,MPEG传输流使用(PCR)。要开始,使用
ffplay
可以获得帧的(PTS)和帧计数。我不确定帧数是否有用,因为它取决于播放开始时间

ffplay-i-vf showinfo


PCR值将在某个时刻结束,因此您也必须对此进行解释。

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

又快又脏

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

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

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

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

4) 您可以向服务器添加一些额外的API,客户端可以在服务器上给您一个散列,然后在帧映射中查找它并返回相应的递增帧号

5) 在客户机上,如果您想知道递增的帧编号,您可以计算帧的散列,询问服务器API关于帧散列的信息,然后它将递增的帧编号发回给您

在这个设计中,您只需在视频编解码器的某个地方添加哈希功能,并在另一个地方添加其他所有内容

干净的设计

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


请参阅RFC 2326–第3.6章正常播放时间和第3.7章绝对播放时间,了解此方法。

幸运的话。我们正试图解决同样的问题。我们正在研究的一种方法是如何破解闭路字幕,以便在客户端之间提供更好的同步,但这也有问题。非常感谢你的帮助。谢谢我已经发布了一个关于我们在这个主题上所做的设计工作的解决方案。如果这取决于播放开始时间,那真的没有什么帮助,但非常感谢。