java - java:如何逐帧读取RTSP流
问题描述
出于性能原因,我放弃了 Python-Opnecv/FFmpeg 解决方案,转而使用 Java。
但令我惊讶的是,我无法像在 Python 中那样找到更好、更完整的解决方案。我尝试使用 vlcj,但它再次提供了更多的命令行界面。我找不到任何用于读取和分析所有帧的回调机制。
我也尝试使用 Java Sockets,但除了通过 RTSP与Ip Camera流式传输h264视频建立连接外,我什么也做不了。
注意:它将在服务器环境中运行,因此我们不想显示任何框架,我们只需要在框架上运行某些其他操作。
请指导我正确的方向。
解决方案
如果您想在媒体播放时访问视频帧缓冲区,您有几个选择。
我假设您使用的是 vlcj 4.x+,它在撰写本文时是最新的。
首先,您可以将 aEmbeddedMediaPlayer
与 a 一起使用CallbackVideoSurface
。
您可以使用MediaPlayerFactory
来创建视频表面。
创建视频表面时,它需要RenderCallback
您提供的实现。
像往常一样创建嵌入式媒体播放器,并调用mediaPlayer.setVideoSurface()
以设置您的视频表面。
正是这个渲染回调实现类将由 VLC 以原ByteBuffer
生内存支持的形式使用原始视频帧数据进行回调。然后,您可以对此字节缓冲区中的数据进行分析。
第二种方法是查看CallbackMediaPlayerComponent
课程 - 该课程旨在让您轻松获得开箱即用的工作媒体播放器,并为您提供一种仅插入您想要自定义的位的方法. 在这种情况下,您插入渲染回调实现来进行分析。
github 项目页面上的 vlcj 源代码中的示例显示了所有这些。其中一个示例处理此缓冲区以将视频动态转换为灰度,但显然您可以对帧数据执行任何操作。
该方法名为“onDisplay()”,但如果您只对执行某些分析感兴趣,则不必在任何地方实际显示视频。
如果您想访问视频帧数据,这就是 vlcj 可以提供的范围。
推荐阅读
- tkinter - 在 ttk 中配置所有按钮,所以 takefocus = 0
- python - 如何使用 python/pandas/numpy 将 sql 表从行旋转到列
- c# - 如何在 C# 中获取对象的键(键值)
- facebook - Facebook聊天插件加载时自动滚动页面到顶部
- python-3.x - 如何一次使用custome FilterProxyModel 和 QtCore.Qt.EditRole?
- asp.net - ASP.NET MVC AJAX POST 500 内部服务器错误
- javascript - 不同的模板没有在烧瓶python中呈现
- javascript - react native android初始请求需要太长时间
- android - 将多个edittext值转换为arraylist
- python - 从 Python 中删除此标题列。不知道它来自哪里