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

时间:2016-01-07 17:45:06

标签: c# winforms vlc libvlc

我从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日,格林威治标准时间-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方法内的实现应获取新的音量信息);
    • 结果:音频以之前播放的音量再次播放。设置音量不再有效。
  7. 我正在对 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();
    }
    

    有什么想法吗?

3 个答案:

答案 0 :(得分: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;
}

这似乎适用于文件和流。

答案 1 :(得分:0)

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

myVlcControl.Audio.Volume = volume;

并向MediaChanged事件添加基本功能,以验证该卷始终是否正确。此外,最好从0到200添加滑块,默认为40 - > ValueChanged事件 - > 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;
}

答案 2 :(得分:0)

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

Range.FormulaLocal