首页 > 解决方案 > java:如何逐帧读取RTSP流

问题描述

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

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

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

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

请指导我正确的方向。

标签: javartsp-client

解决方案


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

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

首先,您可以将 aEmbeddedMediaPlayer与 a 一起使用CallbackVideoSurface

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

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

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

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

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

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

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

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


推荐阅读