java:如何逐帧读取RTSP流

java: how to read RTSP stream frame by frame

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

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

我也尝试过使用 Java 套接字,但除了与 Ip Camerah264[= 建立连接外,什么也做不了24=] RTSP 视频。

注意:在服务器环境中会运行宁,所以我们不想显示任何框架,我们只需要运行确定帧上的其他操作。

请指导我正确的方向。

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

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

首先,您可以使用 EmbeddedMediaPlayerCallbackVideoSurface

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

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

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

VLC 将使用本机内存支持的 ByteBuffer 形式的原始视频帧数据回调此渲染回调实现 class。然后您可以对该字节缓冲区中的数据进行分析。

第二种方法是查看 CallbackMediaPlayerComponent class - 这个 class 旨在让您轻松获得 out-of-the-box 可用的媒体播放器并为您提供了一种仅插入要自定义的位的方法。在这种情况下,您插入渲染回调实现来进行分析。

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

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

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