【问题标题】:Vlc.DotNet - Not able to set the volume before playing an audioVlc.DotNet - 在播放音频之前无法设置音量
【发布时间】:2017-08-07 03:55:35
【问题描述】:

我从 Github 下载了 Vlc.DotNet 项目,并一直在为其 Sample Forms 应用程序添加更多功能。一切都很好,除了事情:我注意到每次我启动应用程序并播放音频时,音频听起来就像它的音量是 100%(或大约)——即使我将它设置为较低的值。

我尝试在播放音频之前设置音量,但没有成功。 如果我调试代码,我会看到音量始终设置为 -1。

比如我执行下面这几行代码,设置音量为40后,调试的时候音量还是-1:

myVlcControl.Play(new FileInfo(FileName));
myVlcControl.Audio.Volume = 40; 

更改上述行的顺序也不起作用。

有趣的是,当音频已经在播放并且我更改音量时,它成功更改为 NumericUpDown 上的选择值。下面的代码是发生这种情况的事件:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    myVlcControl.Audio.Volume = (int)numericUpDown1.Value;
}

我已经尝试解决这个问题两天了。不幸的是,我的编码技能甚至不及这个项目背后的人。我已经在 Github 上的问题页面上发布了这个问题,但由于自 11 月以来有问题没有回复,我决定尝试 StackOverflow。希望这里有人使用 Vlc.DotNet 并为我的问题提供解决方案。

话虽如此:

  • 有人有同样的问题吗?
  • 有人知道怎么解决吗?
  • 有什么建议吗?

谢谢!

[编辑于 2016 年 1 月 8 日上午 11:50 GMT-2]

Github 上的用户 higankanshi 回复我如下:

我发现了问题。 您应该使用 LibVlc 2.2.0(或更高版本)。 Vlc.DotNet 正在使用 LibVlc 2.1.5

然后,我进行了一些测试,得出以下结论:

你是对的。使用 LibVlc 2.2.0 我可以在播放前设置音量。

不幸的是,由于某种原因,在播放音频之前设置音量仅在第一次打开应用程序时有效。停止音频、改变音量并再次播放后,音量不再改变 - 仅在播放时改变。

以下是有结果的步骤:

  1. 执行应用程序;
  2. 在播放音频文件之前在运行时更改音量;
  3. 播放音频文件;
    • 结果:音频以指定音量播放,成功! =)
  4. 按下停止;
  5. 再次改变音量;
  6. 再次按播放(此时play方法内部的实现应该得到新的音量信息);
    • 结果:音频以之前播放的音量再次播放。设置音量不再起作用。

我正在 Vlc.DotNet.Forms.Samples - CLR 4 - .Net 4.5 项目上进行测试。我对项目所做的更改是:

  • 添加了 NumericUpDown 控件,以便我可以在运行时更改音量;
  • 将ValueChanged事件与NumericUpDown控件相关联,这样每次改变值时,都会将新值传递给VlcControl;
  • 创建了一个 Play() 函数,该函数总是在播放音频之前获取最后一个音量值;

我的代码如下:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    myVlcControl.Audio.Volume = (int)numericUpDown1.Value;
}

private void Play()
{
    myVlcControl.Audio.Volume = (int)numericUpDown1.Value;
    myVlcControl.Play(new FileInfo(FileName));
}

private void OnButtonPlayClicked(object sender, EventArgs e)
{
    Play();
}

private void OnButtonStopClicked(object sender, EventArgs e)
{
    myVlcControl.Stop();
}

private void OnButtonPauseClicked(object sender, EventArgs e)
{
    myVlcControl.Pause();
}

有什么想法吗?

【问题讨论】:

  • 这是已知的错误。 15-20年后可能会修复。 VLC 是一个很好的程序,但要达到 1.0 版本需要 10 多年的时间。
  • @i486,感谢您的评论。但是,如果这是一个 LibVcl 已知的 bug,怎么不影响 VLC 播放器呢?
  • @i486,我的意思是:我在 VLC 播放器本身上没有得到相同的行为。这只发生在我的应用程序中。
  • 不知道这个。但是我在开始播放后延迟了“设置音量”。 VLC 的另一个主要问题是兼容性——它们经常更改 API,如果您开发了某些东西,则必须创建新版本。即使在 COM/ActiveX 中也有变化。
  • @Lucas Loss,你有没有想过解决这个问题?在尝试了以下所有解决方法后,我遇到了您所描述的相同行为。

标签: c# winforms vlc libvlc


【解决方案1】:

我找到了可行的解决方案:

int volume { get; set; }

public Constructor(){
    InitializeComponent();
    myVlcControl.VideoOutChanged += myVlcControl_VideoOutChanged;
}

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    this.volume = (int)numericUpDown1.Value;
    myVlcControl.Audio.Volume = volume;
}

void vlcPlayer_VideoOutChanged(object sender, VlcMediaPlayerVideoOutChangedEventArgs e)
{
    myVlcControl.Audio.Volume = volume;
}

这似乎对文件和流都有效。

【讨论】:

  • 感谢您的意见。不幸的是,它没有用。在我的原始帖子中注意,有一步一步地重现问题。我将在这里再次解释:假设您正在以 100% 的音量收听。然后按 STOP 并将音量更改为 40%。然后按 PLAY,它仍然会以 100% 播放。然后单击 numericUpDown 并将音量更改为 39% 或 41%。您会注意到声音直接从 100% 跳到您选择的音量。如果这对您的环境没有帮助,请告诉我。
  • 是的,你是 100% 正确的,我也有这个问题。但是我的解决方案在我的应用程序中解决了这个问题。我正在使用 VLC 2.2.2。如果这对您不起作用,那么您可以尝试创建 myVlcControl.TimeChanged 委托,其实现与 VideoOutChanged 中的实现相同。但是,您会在点击播放按钮时注意到令人不快的声音峰值。
【解决方案2】:

这将如何工作。默认 40,如果您需要在播放开始时更改音量:

myVlcControl.Audio.Volume = volume;

并向 MediaChanged 事件添加基本功能,以验证音量是否始终正确。此外,添加 0-200 的滑块可能是个好主意,默认为 40 -> ValueChanged event -> volume = volumeSlider.Value;

private static int volume = 40;
private void volume_changer(int vol)
{
    volume = vol;
}
private void preview_Player_MediaChanged(object sender, Vlc.DotNet.Core.VlcMediaPlayerMediaChangedEventArgs e)
{
    preview_Player.Audio.Volume = volume;
}

【讨论】:

    【解决方案3】:

    我的工作解决方案与上面解释的 Marcin Bigorge 相同。

    vlcControl.TimeChanged += vlcControl_VideoOutChanged;
    
    private void vlcControl_VideoOutChanged(object sender, VlcMediaPlayerTimeChangedEventArgs e)
    {
        vlcControl.Audio.Volume = volume;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多