我正在尝试使用 LibVLCSharp 播放本地媒体文件并在其上叠加节拍器声音。这是我一直使用的代码的简化版本:
private LibVLC libVlc;
private MediaPlayer mediaPlayer;
async Task Open()
{
libVlc = new LibVLC();
Core.Initialize();
Media media = new(libVlc, new Uri(MEDIA_FILE_PATH));
await media.Parse();
mediaPlayer = new MediaPlayer(media);
}
async Task Play()
{
PeriodicTimer metronomeTimer = new(METRONOME_TIMER_INTERVAL);
mediaPlayer.Play();
for (int i = 0; i < 10; i++)
{
PlayMetronomeSound();
await metronomeTimer.WaitForNextTickAsync();
}
}
这段代码工作正常,但是节拍器声音和 LibVLC 播放的媒体之间有一点延迟。如果我订阅
mediaPlayer.Playing
事件,我会看到该事件在 mediaPlayer.Play()
调用后大约 150 毫秒被触发。我想,它在那段时间缓冲媒体?
如果是这样的话,有没有办法在
Open()
方法中预先缓冲媒体以避免Play()
中的延迟?
我能找到的唯一解决方法是在
mediaPlayer.Play()
方法中调用 Open()
,然后在 mediaPlayer.Pause()
事件处理程序中调用 mediaPlayer.Playing
,然后使用 mediaPlayer.SeekTo(TimeSpan.Zero)
查找开头。在这种情况下,第二次调用 mediaPlayer.Play()
会立即开始播放,并且不会再出现同步问题,但这对我来说就像是黑客攻击。
您可以尝试以下自定义 libvlc 选项
--start-paused
(在 libvlc 构造函数中)或 :start-paused
作为 Media.AddOption
参数。这可能会产生您想要的结果。
另外,为什么不在
PlayMetronomeSound
事件触发时调用 Playing
?