簡體   English   中英

在Pygame.mixer中防止聲音結束時“彈出”

[英]Prevent “popping” at end of sound in Pygame.mixer

這已經解決了 - 請參見底部的解決方案。

在使用pygame.mixer時,每次聲音播放完畢(無論是在頻道中排隊,還是排隊但仍然通過頻道播放,或通過Sound.play()直接播放),都可以聽到聲音“砰砰”的聲音。 有什么方法可以防止這種情況嗎?

示例代碼:

import math
import pygame
import array

pygame.mixer.init()

rawArr=[]
for i in range(41000):
    freq1=int(math.sin(i/220.0*math.pi*2)*32767.0)
    if i>40900: freq1=int(freq1*(41000-i)/100.0) #Solution - see Final Solution
    rawArr.append(freq1)

sndArr=array.array('h',rawArr)

snd=pygame.mixer.Sound(sndArr)

snd.play()

更新:淡出聲音會導致無明顯差異。 通過使用mixer.fadeout(fadeTime)Sound.fadeout(fadeTime)Sound.play(0,maxTime,fadeTime) fadeTime=1,10,100,200,1000maxTime=0,1,10,100,1000

更新2: mixer.stop()mixer.pause()都不會刪除彈出聲音。

更新3:通過緩慢減小音量來實現手動淡出是有效的,具有足夠慢的淡入淡出時間,但是對於小於約0.1秒的淡入淡出時間它是無效的。 此外,在淡入淡出時間期間,存在一系列較小的“咔嗒聲”,其雖然比原始的更安靜,但仍然可聽見並且比原始的“砰砰”更多。 測試代碼,附加到原始代碼的末尾:

while snd.get_volume():
     snd.set_volume(snd.get_volume()-0.005)
     pygame.time.wait(5)

最終解決方案:感謝用戶msw,能夠通過在原始音頻數據中實現手動淡出來刪除“彈出”。 if i>40900: freq1=int(freq1*(41000-i)/100.0)被添加到生成循環中 - 這個大約0.0024秒的淡入淡出時間幾乎是在“彈出”發生之前可以使用的最短時間。 示例代碼已使用固定代碼進行更新。

這被稱為“噪音的恐懼音頻懸崖”。

當你有一個高於0的數字信號並且你突然切斷它時,波形必然會下降到0.當處理模擬信號的人會告訴你時,數字懸崖(原則上)所有頻率都存在於某個幅度。 這種過渡聽起來像是一個“流行”的聲音。

幾乎所有音頻都被掌握,以便在樣本結束時幅度逐漸變為零。 如果您的樣品沒有此特性,請在播放時將樣品淡化為零。 正如OP所指出的,即使2.5毫秒的淡入淡出也足以避免流行音樂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM