gpt4 book ai didi

python - 如何在python中连续和异步播放不同的声音?

转载 作者:行者123 更新时间:2023-12-03 00:24:50 30 4
gpt4 key购买 nike

具体来说,我需要在while循环中播放声音,以便快速执行。并且音频需要单独播放。我尝试了各种功能/库:playsound,winsound,vlc。但是他们都不满足我的需求。

要么声音重叠,要么我需要等待声音结束才能继续下一行代码,这会阻塞整个过程,使程序运行时出现难以忍受的滞后。

Playsound,Winsound,VLC中的事项:
playsound:具有阻止选项,但将阻止进程(block = True)或与声音重叠(block = False)。

winsound:使用SND_ASYNC选项,说我有音频A和音频B(需要在音频A之后播放),如果播放了音频B,则音频A将立即停止。

vlc:[000001ba245794d0] mmdevice音频输出错误:无法初始化COM(错误0x80010106),这有点怪异,在Google上找不到任何有用的信息。对于我和其他人来说,这种方法似乎不是一个好的选择。我仅将其用于is_playing()函数,就可以将下一个声音放入队列中。

有什么建议吗?谢谢!

最佳答案

如果您只是在播放声音并中断播放之前的声音,那么winsound会执行以下操作:

import winsound
from time import sleep

winsound.PlaySound("sound.wav", winsound.SND_ASYNC | winsound.SND_FILENAME)
sleep(1)
winsound.PlaySound("sound.wav", winsound.SND_ASYNC | winsound.SND_FILENAME)
sleep(3)

在此示例中(假设 sound.wav超过一秒钟),声音将开始播放,在1秒钟后被中断并再次开始播放。第二个 sleep可以避免脚本在声音停止之前结束(停止脚本可以停止声音)。

如果您想让声音排队播放,然后代码继续运行:
import threading
import queue
import winsound
from time import sleep

q = queue.Queue()


def thread_function():
while True:
sound = q.get()
if sound is None:
break
winsound.PlaySound(sound, winsound.SND_FILENAME)


if __name__ == "__main__":
t = threading.Thread(target=thread_function)
t.start()
q.put("sound.wav")
print('One...')
sleep(1)
q.put("sound.wav")
print('Two...')
sleep(1)
q.put("sound.wav")
print('Three...')
q.put(None)
t.join()

这个简单的示例将线程开始播放的声音排队,然后在播放时,将下一个声音排队,然后将三分之一排队。您会注意到,声音依次播放,并且仅当声音完整播放时程序才停止(并且线程由于队列末尾的 None而停止)。

如果您希望将一种声音播放到另一种声音上并且将它们混合在一起,则无法使用 winsound,但可以使用 pyglet这样的库。

例如:
import pyglet


window = pyglet.window.Window()
effect = pyglet.resource.media('sound.wav', streaming=False)


@window.event
def on_key_press(symbol, modifiers):
effect.play()


@window.event
def on_draw():
window.clear()


if __name__ == "__main__":
pyglet.app.run()

本示例打开一个窗口,每按一次键,它将立即播放声音,而不会中断以前的声音。当您关闭窗口时,程序立即结束。

关于python - 如何在python中连续和异步播放不同的声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61200617/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com