我在IronPython中使用NAudio混合多個音頻流來創建環境音頻。這對於某些曲目來說工作得相當好,但對於其他一些曲目(風,雨),循環播放時可能會產生刺耳的停止/開始。IronPython NAudio循環交叉淡入淡出
因爲我並不是100%確定如何在python中實現LoopStream類的例子,所以我開始在十分之一秒或更短的時間內完成位置檢查。我知道我爲什麼在那裏有空位。從那以後,我能夠弄清楚如何在python中重新創建LoopStream,並且它可以工作,但是我仍然像以前一樣在回放中存在差距。我正在嘗試將曲目的末尾逐漸淡入相同曲目的開頭,當我這樣做時,音頻完全消失。
下面的代碼:
class LoopStream(WaveStream):
def __init__(self,WaveStream,AudioStream):
self.wavestream = WaveStream
self.audiostream = AudioStream
def get_WaveFormat(self):
return self.wavestream.WaveFormat
def get_Length(self):
return self.wavestream.Length
def get_Position(self):
return self.wavestream.Position
def HasData(count):
return True
def Read(self,buf,offset,count):
read = 0
while(read < count):
required = count - read
#print(str(self.audiostream.get_chan_id()) + " reading @ " + str(self.wavestream.Position) + "/" + str(self.wavestream.Length))
pos = self.wavestream.Position
readthistime = self.wavestream.Read(buf,offset+read,required)
if pos == 0:
self.startbuf = buf
if readthistime < required:
self.wavestream.Position = 0
#print(len(buf))
#buf = buf+self.startbuf
print(len(buf))
buf = FadeOut(self,buf,offset,readthistime) + FadeIn(self,self.startbuf,0,required)
print(len(buf))
readthistime+=required
print(str(self.audiostream.get_chan_id()) + " restarting1")
elif self.wavestream.Position + required > self.wavestream.Length:
#read += readthistime
#readthistime = self.wavestream.Read(buf,self.wavestream.Position,required)
#print(str(self.audiostream.get_chan_id()) + " restarting2")
pass
if self.wavestream.Position >= self.wavestream.Length:
self.wavestream.Position = 0
buf = buf + self.startbuf
print(str(self.audiostream.get_chan_id()) + " restarting3")
read += readthistime
return read
def FadeOut(self,buf,offset,count):
sample = 0
maxfadesamples = int((self.wavestream.WaveFormat.SampleRate * 75)/1000)
fadesamples = 0
while sample < count:
multiplier = 1.0 - (fadesamples/maxfadesamples)
for i in range(0,self.wavestream.WaveFormat.Channels):
buf[offset+sample] *= multiplier
sample+=1
fadesamples+=1
if fadesamples > maxfadesamples:
for j in range(0,self.wavestream.WaveFormat.Channels):
while sample < count:
buf[offset+sample] = 0
sample+=1
def FadeOut(self,buf,offset,count):
sample = 0
maxfadesamples = int((self.wavestream.WaveFormat.SampleRate * 75)/1000)
fadesamples = 0
while sample < count:
multiplier = (fadesamples/maxfadesamples)
for i in range(0,self.wavestream.WaveFormat.Channels):
buf[offset+sample] *= multiplier
sample+=1
fadesamples+=1
ERR ..已經注意到我只是需要習慣於在這裏..添加錯誤處理語句,因爲我發佈後,立即發現了一些問題,所以我最終可能會解決自己1)淡出聲明的兩倍,因此FadeIn實際上並不存在。一旦我將FadeOut#2重命名爲FadeIn,它仍然有毛病,但因爲它陷入了無限循環。我解決了這個問題,但仍然存在問題,但我認爲它在讀取功能的其他地方出錯。 –