【发布时间】:2022-12-31 19:46:46
【问题描述】:
我正在尝试循环播放音频文件(此示例重复 3 次)。音频文件很短。只是有人说“你好,世界”。
import pygame
def wait_for_player():
while pygame.mixer.music.get_busy():
continue
def play_file(filename):
pygame.init()
pygame.mixer.music.load(filename)
for i in range(3):
pygame.mixer.music.play()
wait_for_player()
if __name__ == '__main__':
play_file('hello_world.mp3')
我听到的声音是这样的:
"Hello, world"
"o, world"
"o, world"
也就是说,在随后的重播中,音频会在开头被短暂剪辑。在不同的设备上,相同的代码和相同的音频文件听起来像这样:
"o, world"
"Hello, world"
"Hello, world"
这些设备中的每一个都使用蓝牙——一个在 Raspberry Pi 上,另一个在 Windows 笔记本电脑上。我在其他几台没有蓝牙的设备上再次尝试,每次都能正确播放音频。所以可能是蓝牙问题。
我尝试在“你好”之前填充一两秒的静音,但它没有任何区别(除了间隔每次播放之间的时间 - 音频仍然被剪辑,因为它没有填充静音)。
我的下一步是添加一段(希望如此)难以察觉的音频来“启动泵”,但我宁愿使用有效的代码也不愿使用变通方法。我能以编程方式做些什么来确保每次都能播放整个声音吗?
预计到达时间:这是我的解决方法。我将 this gist 复制到 tone.py 中。它环绕着 mixer.Sound,使演奏音符变得容易。下面修改后的代码以低音量播放低频音符。这足以“启动泵”,它现在适用于所有设备。这仍然是一种解决方法,所以希望有人能给出更好的答案——但如果必须的话,我可以接受这个。
from time import sleep
import pygame
from tone import Note
def wait_for_player():
while pygame.mixer.music.get_busy():
continue
def play_file(filename):
pygame.init()
Note(0.08, volume=0.01).play(-1)
sleep(1)
pygame.mixer.music.load(filename)
pygame.mixer.music.play(loops=3)
wait_for_player()
if __name__ == '__main__':
play_file('hello_world.mp3')
【问题讨论】:
-
你看到
pygame.mixer.music.play有一个循环参数了吗?你可以试试pygame.mixer.music.play(loops=3)。 pygame.org/docs/ref/music.html#pygame.mixer.music.play -
@Flursch 我不知道这个 - 谢谢!虽然它没有解决问题,但使代码更漂亮 :-) 按照您喜欢的文档,我还了解到
pygame.mixer.music.play(-1)永远循环(这实际上是我想做的) -
旁注:您可以在代码开头的
while循环中添加一些延迟以节省资源。
标签: python audio pygame raspberry-pi bluetooth