0

我正在尝试将 LibVLCSharp 集成到使用 MonoGame 构建的游戏引擎中。

我已经使用它渲染并获得了不错的结果

_mediaPlayer.SetVideoFormat("RGBA", _width, _height, stride);
_mediaPlayer.SetVideoCallbacks(LockCb, null, DisplayCb);

不幸的是,它还不够好。到目前为止,我一直在使用另一个名为 Theora Playback Library ( https://www.cateia.com/libtheoraplayer/wiki/index.php?title=Main_Page ) 的视频库。有了它,我们可以获得非常流畅的视频播放,但我们正试图将我们的引擎移动到 64 位,而这个库没有这种能力。

查看 TPL 的源代码,我看到它正在将视频帧解码为 I420 缓冲区,然后将它们转换为 RGBA。我想看看用 LibVLCSharp 做同样的事情是否会提高播放性能,但我遇到了障碍。

I420 帧的缓冲区需要 3 个图片缓冲区,但 LibVLCVideoFormatCb 的委托签名似乎不允许您定义它。

libVLC 文档说线条和间距都是表格,应该允许您为每个图片缓冲区设置间距和线条

pitches:每个像素平面的扫描线间距表(以字节为单位)(该表由 LibVLC 分配)[OUT]

行:每个平面的扫描线计数表 [OUT]

但是在 LibVLCSharp 中,音高和线条都是 uint,所以当我需要设置 3 时,我只能设置 1 值。

public delegate uint LibVLCVideoFormatCb(
  ref IntPtr opaque,
  IntPtr chroma,
  ref uint width,
  ref uint height,
  ref uint pitches,
  ref uint lines);

有没有办法用现有的签名来定义 I420 缓冲区的格式,或者有没有另一种方法可以完全获取我不做的每一帧的解码 I420 帧数据?

4

1 回答 1

1

请随时在我们的 Discord 上讨论或联系 GitLab。MonoGame 集成肯定在我们的路线图上,我们很乐意得到您的贡献!

话虽如此,关于你的问题。

LibVLC 3(当前稳定版本,用于本地库和 C# 绑定)提供此 API 用于自定义渲染。但是,正如您所见,由于 CPU 复制(无硬件支持),它的性能并不理想。

在 LibVLC 4(本机库和 C# 绑定都可用的预览版)中,添加了一个新 API,它允许通过自定义渲染获得最佳性能。

文档在这里https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html#gafae363ba4c4655780b0403e00159be56它目前支持 Direct3D9、Direct3D11、OpenGL 和 OpenGLES。我相信 Direct3D12 和 Vulkan 也在路线图上。

有关此新 LibVLC API 的实施示例,请参阅 Windows 的 Unity 集成 (D3D11) https://code.videolan.org/videolan/vlc-unity/-/blob/master/PluginSource/RenderAPI_D3D11.cpp

于 2021-02-09T02:39:08.267 回答