2015-09-07 4 views
4

Это было решено - см. Решение внизу.Предотвращение «выскакивания» в конце звука в 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,1000 и maxTime=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) 

окончательное решение: Спасибо пользователю МТО, был в состоянии удалить «выскакивают» путем внедрения ручного FadeOut в пределах исходных аудиоданных. if i>40900: freq1=int(freq1*(41000-i)/100.0) был добавлен в цикл генерации - это примерно 0,0024 секунды, когда время затухания было примерно самым коротким, которое можно было использовать до появления «popping». Код примера обновлен с помощью фиксированного кода.

+0

Я подозреваю, что плохая звуковая карта или flaky водитель. Я не думаю, что это ваш код. Попробуйте на другой машине. – msw

+0

@msw У меня не было никаких проблем с аудио на других программах, но я буду тестировать их на другой машине, когда у меня будет такая возможность. Возможно, Python и мой драйвер плохо взаимодействуют. – Larkeith

+2

Что произойдет, если вы сыграете эти звуки в чем-то отличном от pygame? Если звуковой файл заканчивается высокой амплитудой, то для его точного воспроизведения требуется «спрыгнуть с утеса», когда он перейдет от 32767 до 0. Этот переход приводит к быстрому всплеску всех частот или «поп». Даже те песни, которые заканчиваются внезапно, осваиваются с угасанием хвоста именно по этой причине. Возможно, вам будет полезно сначала погасить свои собственные звуки с помощью реального аудиоредактора (например, Audactiy). – msw

ответ

3

Это известно как «ужасный звуковой обрыв шума».

Если у вас есть цифровой сигнал, который выше 0, и вы резко отключите его, сигнал должен упасть до 0. Как говорят люди, имеющие отношение к аналоговым сигналам, цифровой скала имеет (в принципе) все частоты присутствуют при некоторой амплитуде. Этот переход звучит как «поп» к тому времени, когда он доходит до динамиков.

Практически весь звук осваивается так, что амплитуда исчезает до нуля к тому времени, когда образец заканчивается. Если ваш образец не имеет этой характеристики, затухайте образец до нуля при воспроизведении. Как отмечал ОП, даже 2,5-миллисекундного затухания может быть достаточно, чтобы избежать поп-музыки.

+1

На самом деле «ужасный звуковой обрыв шума» - это термин, который я никогда не видел и не слышал, поэтому «известен как« я имею в виду », который известен как в моем сознании, а теперь, возможно, и ваш». – msw

Смежные вопросы