我正在尝试将 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 帧数据?