Vlc.DotNet-无法在播放音频之前设置音量

Luc*_*oss 5 c# vlc winforms libvlc

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

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

例如,如果我执行以下代码行,则将音量设置为40后,在调试时,音量仍为-1:

myVlcControl.Play(new FileInfo(FileName));
myVlcControl.Audio.Volume = 40; 
Run Code Online (Sandbox Code Playgroud)

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

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

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

我已经尝试解决此问题两天了。不幸的是,我的编码技能甚至没有使这个项目的幕后人员离开。我已经在Github的“问题”页面上发布了此问题,但是由于自11月以来仍然有一些问题没有得到答复,因此我决定尝试使用StackOverflow。希望这里有人使用Vlc.DotNet并为我的问题提供了解决方案。

话虽如此:

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

谢谢!

[2016年1月8日,格林尼治标准时间2上午11:50编辑]

Github上的higankanshi用户回答了我以下问题:

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

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

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

不幸的是,由于某些原因,在播放音频之前设置音量仅在首次打开应用程序时起作用。停止音频,更改音量并再次播放之后,音量不再更改-仅在播放时更改。

以下是产生结果的步骤:

  1. 执行应用程序;
  2. 在播放音频文件之前在运行时更改音量;
  3. 播放音频文件;
    • 结果:音频以指定的音量成功播放!=)
  4. 按停止;
  5. 再次更改音量;
  6. 再次按Play(此时,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();
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Mar*_*raj 4

我找到了工作解决方案:

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;
}
Run Code Online (Sandbox Code Playgroud)

这似乎适用于文件和流。