java:如何逐帧读取RTSP流
出于性能原因,我放弃了Python Opnecv/FFmpeg解决方案,转而使用Java 但令我惊讶的是,我找不到任何比Python更好、更完整的解决方案。我尝试使用vlcj,但它再次提供了更多类似于命令行的界面。我找不到任何回调机制来读取和分析所有帧 我还尝试使用Java套接字,但除了通过RTSP与Ip摄像头建立连接之外,我什么都做不了 注意:它将在服务器环境中运行,因此我们不想显示任何帧,我们只需要在帧上运行某些其他操作java:如何逐帧读取RTSP流,java,rtsp-client,Java,Rtsp Client,出于性能原因,我放弃了Python Opnecv/FFmpeg解决方案,转而使用Java 但令我惊讶的是,我找不到任何比Python更好、更完整的解决方案。我尝试使用vlcj,但它再次提供了更多类似于命令行的界面。我找不到任何回调机制来读取和分析所有帧 我还尝试使用Java套接字,但除了通过RTSP与Ip摄像头建立连接之外,我什么都做不了 注意:它将在服务器环境中运行,因此我们不想显示任何帧,我们只需要在帧上运行某些其他操作 请告诉我正确的方向。如果您想在媒体播放时访问视频帧缓冲区,您有两个选择
请告诉我正确的方向。如果您想在媒体播放时访问视频帧缓冲区,您有两个选择 我假设您使用的是vlcj 4.x+,这在撰写本文时是最新版本 首先,您可以将
EmbeddedMediaPlayer
与CallbackVideoSurface
一起使用
您可以使用MediaPlayerFactory
创建视频界面
创建视频表面时,需要提供RenderCallback
实现
正常创建嵌入式媒体播放器,并调用mediaPlayer.setVideoSurface()
设置视频表面
VLC将使用原始视频帧数据以ByteBuffer
的形式调用该渲染回调实现类,该视频帧数据由本机内存支持。然后,您可以在此字节缓冲区中对数据进行分析
第二种方法是查看CallbackMediaPlayerComponent
类-该类旨在让您非常容易地获得现成的工作媒体播放器,并提供一种只插入您想要定制的位的方法。在本例中,插入渲染回调实现以进行分析
github项目页面上的vlcj源代码中有一些示例显示了所有这些。其中一个示例处理此缓冲区以将视频动态转换为灰度,但显然,您可以对帧数据执行任何操作
该方法名为“onDisplay()”,但如果您只对执行某些分析感兴趣,则不必在任何地方实际显示视频
如果您想访问视频帧数据,这就是vlcj可以提供的范围。vlcj根本不是“更像是一个命令行界面”,我甚至不知道这在本文中意味着什么,它确实提供了一个回调来获取每个视频帧。抱歉@caprica这是因为我对vlcj的知识绝对缺乏。如果您能指导我找到帧对帧访问回调的正确用法示例或文档,我将非常乐意使用它。@caprica我的评论来自于此,所以请回答:这里有两件事,首先,如果您希望能够导航到特定帧,那么没有直接的API可以做到这一点。如果您想在播放流时获得视频帧数据的回调,可以这样做。因此,vlcj是否合适完全取决于您正在尝试做什么。感谢caprica提供的详细答案,但它将在服务器环境中运行,因此我们不想显示任何帧,我们只需要在帧上运行某些其他操作。DirectMediaPlayer似乎是正确的选择,请告诉我如何正确使用它。没有必要用这样的方法显示框架。我没有什么要补充的,如果你不喜欢这个答案,那是你的特权。我没有对你无礼,我只是说了需要说的,就像在所有需要提到的例子中一样,但现在我设法绕开了,我真的很感谢你的回答。