问题描述
我正在尝试将 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]
lines:每个平面的扫描线计数表 [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 帧数据?
解决方法
请随时在我们的 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