【问题标题】:embed video stream with custom meta data使用自定义元数据嵌入视频流
【发布时间】:2021-02-17 10:31:53
【问题描述】:

我有一个提供 UDP 视频流的光学系统。

来自设备规范常见问题解答:

以太网链路上提供单个元数据 (KLV) 流和带有元数据 (KLV) 的压缩视频 (H.264)。压缩视频和元数据耦合在符合 STANAG 4609 标准的同一流中。每个编码的视频流都与相关元数据一起封装在以太网 UDP/IP 上的 MPEG-TS 单个节目流中。视频和元数据通过使用时间戳进行同步。

还有其他设备可以提供有关飞机状态(速度、坐标等)的数据。此数据应与视频一起显示在客户端 GUI 显示器上。当然要和当前视频帧同步。

我想到的一种方法是将这些数据嵌入到视频流中。但我不确定是否有可能或是否应该为此目的使用其他(而非 UDP)协议。

使用这种方法是否可能/合理? ffmpeg 库适合这种情况吗? 如果不是,那么将数据与视频帧同步的其他方法是什么。 延迟至关重要。虽然带宽限制在 2-5 Mbps。


似乎可以使用 ffmpeg:AVPacket 可以使用函数 av_packet_add_side_data 提供附加数据,该函数采用预分配的缓冲区、大小和类型 AVPacketSideDataType。 但是,我现在不确定AVPacketSideDataType 中的哪个enum value 可以用于自定义用户提供的二进制数据。

类似的东西可能会满足我的需要:

How do I encode KLV packets to an H.264 video using libav*

【问题讨论】:

  • 数据应该是视频的一部分还是单独的?
  • @llogan 我认为它应该包含在视频流中,以便与相应的视频帧同步。
  • 如果你希望它在实际的视频图像中,比如像hardsubs一样“烧录”,你可以使用带有reload选项的drawtext过滤器。但也许您希望它作为单独的数据?
  • @llogan 我不希望它被绘制在实际框架上。我需要一个单独的数据。有没有办法将它作为某种元数据添加到视频流中?
  • 容器是什么?

标签: c++ ffmpeg video-streaming


【解决方案1】:

这句话听起来像是您有一个包含两个基本流的传输流(一个是 H.264 视频,另一个是 KLV 数据)。传输流通过 UDP(或 TCP,或者只是一个文件,无论您想要什么 - 它基本上独立于传输)发送。

在 Motion Imagery 手册(您可以在 https://gwg.nga.mil/misb/misp_pubs.html 从 MISB 下载),特别是在 ST 1402(您可以在 https://gwg.nga.mil/misb/st_pubs.html 找到)中讨论了实现这种事情。我避免提供直接链接,因为版本会发生变化 - 只需查找当前版本。

简短的版本是您可以在视频中嵌入时间戳(参见 ST 0603 和 ST 0604),然后将其与元数据时间戳相关联(精确时间戳,参见 ST 0601)。不过,您不想在AVPacket 级别执行此操作。相反,您需要使用 AV_FRAME_DATA_SEI_UNREGISTERED 键 (https://ffmpeg.org/doxygen/trunk/group__lavu__frame.html#ggae01fa7e427274293aacdf2adc17076bca4f2dcaee18e5ffed8ff4ab1cc3b326aa) 将辅助数据放入 AVFrame。不过,截至撰写本文时,这不在已发布的 ffmpeg 版本中 - 预计 2021 年初,或从源代码构建。

注意:如果您只想查看 UDP 数据流 - 一侧是视频,另一侧是解码的 KLV,那么您可能想查看 jMISB 查看器应用程序:https://github.com/WestRidgeSystems/jmisb 它还提供了一个编码示例(生成器示例)。免责声明:我为该项目做出了贡献。

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2020-07-31
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多