使用 NAudio 播放卡顿
Posted
技术标签:
【中文标题】使用 NAudio 播放卡顿【英文标题】:Playback Stutters using NAudio 【发布时间】:2019-06-26 18:14:21 【问题描述】:当我播放音频文件 (Wave) 时,我在这里结结巴巴。
我尝试更改链接在一起的 ISampleProviders 的实例化顺序。
公共属性 FilePath() As String 得到 返回 m_FilePath 结束获取
Set(ByVal New_FilePath As String)
Try
Dim nCount As Integer = 0
Dim retval As Integer = 0
If New_FilePath.Length = 0 Then
DisposeInputResources()
m_FilePath = ""
ChangeStatus_Controls(False)
Exit Property
End If
PositionTrackBar.Value = 0
m_Position = 0
m_LastPosition = 0
durationLabel.Text = ConvertTime(0)
m_FilePath = New_FilePath
DisposeInputResources()
AudioFileReader1 = New AudioFileReader(FilePath)
playerStatus = PhilipsStatus.stopped
SpeedControl = New VarispeedSampleProvider(AudioFileReader1, 100, New SoundTouchProfile(False, False))
SpeedControl.PlaybackRate = 1
AutomaticGainControl = New SoftLimiter(SpeedControl)
AutomaticGainControl.Boost.CurrentValue = fileAmplificationTrackBar.Value / 2
'AudioFileReader1 = New AudioFileReader(FilePath)
'Equalizer1 = New EqualizerClass(AudioFileReader1, bands)
'SpeedControl = New VarispeedSampleProvider(Equalizer1, 100, New SoundTouchProfile(False, False))
'SpeedControl.PlaybackRate = 1
'VolumeSampleProvider1 = New VolumeSampleProvider(SpeedControl)
audioLengthLabel.Text = ConvertTime(AudioFileReader1.TotalTime.TotalSeconds)
AudioFileReader1.CurrentTime = TimeSpan.Zero
If WaveOut1 IsNot Nothing Then WaveOut1.Stop()
WaveOut1 = New WaveOutEvent()
WaveOut1.Init(AutomaticGainControl)
Thread.Sleep(1000)
nCount = 60
Volume = m_Volume
Speed = m_Speed
Position = 0
PressStopKey()
Dim sWAVFileName As String = Nothing
If Path.GetExtension(New_FilePath).ToUpper() = ".DSS" Then
sWAVFileName = Path.ChangeExtension(New_FilePath, "WAV")
'I assume that ConvertDSSToWAV() has already been called to convert the .DSS to .WAV if necessary
New_FilePath = sWAVFileName
m_FilePath = sWAVFileName
End If
PositionTrackBar.Maximum = AudioFileReader1.TotalTime.TotalSeconds
PositionTrackBar.Minimum = 0
PositionTrackBar.LargeChange = PositionTrackBar.Maximum * 0.1
If PositionTrackBar.LargeChange = 0 Then PositionTrackBar.LargeChange = 1
PositionTrackBar.SmallChange = PositionTrackBar.Maximum * 0.01
If PositionTrackBar.SmallChange = 0 Then PositionTrackBar.SmallChange = 1
PositionTrackBar.TickFrequency = PositionTrackBar.SmallChange
ChangeStatus_Controls(True)
Catch ex As Exception
MessageBox.Show("Property Set FilePath(New_FilePath= " & New_FilePath & ")" & vbCrLf & ex.Message, "FootPedalsControl", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Set
End Property
在此代码中,我将 ISampleProvider 链接起来,并在每次加载新文件时将它们传递给 WaveOut.Init。我先停止 WaveOut。
期待流畅的聆听体验(听写)。 实际结果:播放卡顿。
【问题讨论】:
这个 C# 看起来有点可疑 ;-) 它可以正常工作,但播放有时会卡顿。可疑是什么意思? 这是VB
:-) .....我只是在开玩笑。一般来说,这是一个很难回答的问题,因为设置很难复制。
哦,哈哈!我忘了这部分代码是VB。我的其余代码是 C#。感谢 Mark Heath,我确实解决了这个问题。我找到了他多年前写的一篇文章。几个月前我读过这篇文章,但随着这些事情的发展,你总是在第一遍就完全理解它们。谢谢你的尝试!感谢 Mark Heath 对这一领域的奉献!
有没有办法可以将此问题标记为已回答。顺便说一句,如果有人想知道我做了什么,这就是答案。每次停止播放时我都会破坏信号链,并在下一次播放时重新创建它。
【参考方案1】:
这解决了我的问题:每次停止播放时,我都会破坏信号链。当再次开始播放时,我会重建信号链。
【讨论】:
以上是关于使用 NAudio 播放卡顿的主要内容,如果未能解决你的问题,请参考以下文章
NAudio:如何在使用 AudioFileReader 和 WaveOutEvent 更改播放位置时准确获取当前播放位置