使用SetVideoFormatCallbacks与I420色度



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

我已经得到了它渲染和得到体面的结果使用

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

不幸的是,它还不够好。到目前为止,我一直在使用另一个名为Theora播放库(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音调和线条都是单位,所以我只能设置1值,当我需要设置3。

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。一夫一妻制的整合肯定在我们的路线图上,我们希望有你的贡献!

话虽如此,我还是要回答你的问题。

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的实现示例,请参阅Unity集成的Windows (D3D11) https://code.videolan.org/videolan/vlc-unity/-/blob/master/PluginSource/RenderAPI_D3D11.cpp

最新更新