避免 Play() 和实际播放之间的延迟

问题描述 投票:0回答:1

我正在尝试使用 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()
会立即开始播放,并且不会再出现同步问题,但这对我来说就像是黑客攻击。

c# .net libvlc libvlcsharp
1个回答
0
投票

您可以尝试以下自定义 libvlc 选项

--start-paused
(在 libvlc 构造函数中)或
:start-paused
作为
Media.AddOption
参数。这可能会产生您想要的结果。

另外,为什么不在

PlayMetronomeSound
事件触发时调用
Playing

© www.soinside.com 2019 - 2024. All rights reserved.