【问题标题】:java: how to read RTSP stream frame by framejava:如何逐帧读取RTSP流
【发布时间】:2019-05-21 15:57:38
【问题描述】:

出于性能原因,我放弃了 Python-Opnecv/FFmpeg 解决方案,转而使用 Java。

但令我惊讶的是,我无法像在 Python 中那样找到任何更好、更完整的解决方案。我尝试使用 vlcj,但它再次提供了更多的命令行界面。我找不到任何用于读取和分析所有帧的回调机制。

我也尝试使用 Java 套接字,但除了与 Ip Camera 通过 RTSP 流式传输 h264 视频建立连接之外,什么也做不了。

注意:它将在服务器环境中运行,因此我们不想显示任何帧,我们只需要在帧上运行某些其他操作即可。

请指引我正确的方向。

【问题讨论】:

  • vlcj 根本不是“更多的命令行界面”,我什至不确定在这种情况下这意味着什么,它确实提供了一个回调获取每个视频帧。
  • 对不起@caprica,这是因为我对 vlcj 完全缺乏了解。如果您能指导我找到正确的使用示例或逐帧访问回调的文档,我将非常乐意使用它。
  • @caprica 我的评论来自这个 SO 答案:stackoverflow.com/a/14584151
  • 这里有两件事,首先,如果您希望能够导航到特定框架,则没有直接的 API 可以做到这一点。如果您想在流播放时获得带有视频帧数据的回调,您可以这样做。因此,如果 vlcj 是否合适,这完全取决于您要尝试做什么。

标签: java rtsp-client


【解决方案1】:

如果您想在媒体播放时访问视频帧缓冲区,您有多种选择。

我假设您使用的是 vlcj 4.x+,在撰写本文时它是最新的。

首先,您可以使用EmbeddedMediaPlayerCallbackVideoSurface

您可以使用MediaPlayerFactory 创建您的视频界面。

当您创建视频表面时,它需要您提供的 RenderCallback 实现。

照常创建嵌入式媒体播放器,并调用mediaPlayer.setVideoSurface() 设置您的视频表面。

正是这个渲染回调实现类将被 VLC 以原生内存支持的ByteBuffer 形式的原始视频帧数据回调。然后您可以对这个字节缓冲区中的数据进行分析。

第二种方法是查看 CallbackMediaPlayerComponent 类 - 该类旨在让您轻松获得一个开箱即用的工作媒体播放器,并为您提供一种仅插入的方式您要自定义的位。在这种情况下,您插入渲染回调实现来进行分析。

在 github 项目页面的 vlcj 源代码中有示例,它们显示了所有这些。其中一个示例处理此缓冲区以将视频动态转换为灰度,但显然您可以对帧数据做任何您想做的事情。

该方法名为“onDisplay()”,但如果您只对执行某些分析感兴趣,则不必在任何地方实际显示视频。

如果您想访问视频帧数据,这就是 vlcj 所能提供的范围。

【讨论】:

  • 感谢 caprica 的详细回答,但它将在服务器环境中运行,因此我们不想显示任何框架,我们只需要在框架上运行某些其他操作。 DirectMediaPlayer 似乎是正确的选择,请告诉我如何使用它。
  • 没有必要用这样的方法显示一个框架。我没有什么要补充的,如果你不喜欢那是你的特权的答案。
  • 我没有对你无礼,我只是说需要什么,因为在所有示例中我都是需要提及的 videoSurface,但现在我设法绕过它,我真的很感谢你的答案。
猜你喜欢
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2015-08-24
  • 1970-01-01
相关资源
最近更新 更多