Android LibVLC,在没有 TextureView 的情况下拍摄 RTSP 流的快照

Android LibVLC, take snapshot of RTSP stream without TextureView

考虑使用 libVLC for Android, based on the official recommended way

我顺利完成了 compilation process(但花了一些时间)。

我想要快照功能,但我发现了一些非常古老(2-3 年前)的帖子,其中指出此功能是 still not available (2016) at least "not out of the box' by this thread (2014)。

快照功能在其他平台上可用。

还有一些 它们从 SurfaceView 切换到 TextureView。

但是我更喜欢坚持使用 SurfaceView,因为 TextureView 会带来一些性能缺陷(根据此 topic)。

也在 official android page 上写着:

在API24及更高版本中,建议实现SurfaceView而不是TextureView。

2014年基于我之前提到的thread快照功能只有2个依赖:

在查看 VideoLAN 的 "VLC-Android" 存储库时,有一个 file 负责构建 libVLC。

第 396 行,sout 模块似乎默认启用。

在编译之前,我在 vlc/contrib/src/ffmpeg/rules.mak 中启用了 png 作为编码器,正如论坛中指出的那样。

但是在org.videolan.libvlc.MediaPlayer和org.videolan.libvlc.VLCVideoLayout中仍然没有快照相关的功能。

问题是如何在不使用 TextureView 的情况下使用 libVLC 在 Android 上创建快照(到文件或缓冲区)?

更新 1:

事实 1: 在 Android 上找到了它不可用的原因。在 VLC 的核心源代码树中,文件 lib/video.c 的第 145 行有一个带有大量 FIXME 警告的快照功能:

/* FIXME: This is not atomic. All parameters should be passed at once
 * (obviously _not_ with var_*()). Also, the libvlc object should not be
 * used for the callbacks: that breaks badly if there are concurrent
 * media players in the instance. */
var_Create( p_vout, "snapshot-width", VLC_VAR_INTEGER );
var_SetInteger( p_vout, "snapshot-width", i_width);
var_Create( p_vout, "snapshot-height", VLC_VAR_INTEGER );
var_SetInteger( p_vout, "snapshot-height", i_height );
var_Create( p_vout, "snapshot-path", VLC_VAR_STRING );
var_SetString( p_vout, "snapshot-path", psz_filepath );
var_Create( p_vout, "snapshot-format", VLC_VAR_STRING );
var_SetString( p_vout, "snapshot-format", "png" );
var_TriggerCallback( p_vout, "video-snapshot" );
vlc_object_release( p_vout );  

事实2: 我想用这个去另一个方向。如果snapshot功能不能用(而且用起来也不明智),我想到了一些应急方案:

  1. VLC 中有一个名为 scene. This produce still images of the video to a specific path. I tried using this, but video-filters are 的视频过滤器。所以这次尝试失败了。

  2. 我也尝试从 MediaPlayer 执行此操作(通过 Media.addOption),但视频过滤器也无法在 Android 的 MediaPlayer 级别更改。

  3. 然后我尝试将过滤器配置作为参数传递给 libVLC 初始化,最后它成功了,但是每次我需要屏幕截图时创建一个新的 libVLC 实例都不会有效。

解决此问题的几种方法...

祝你好运。