如何在pygame中循环播放音频文件的一部分?

2024-06-26 17:43:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我让pygame播放光盘上的音频文件。例如,我可以播放这样的声音文件:

mymixer = pygame.mixer
mymixer.init()
mysound = mymixer.Sound(path_to_file)
mysound.play(-1)

但我想说的是:

^{pr2}$

稍微读一下,也许可以通过将文件作为原始数据导入并以某种方式对其进行修剪,然后使用生成的数据初始化声音(?)。在

另外,可能已经有了包装器来完成这项工作,或者pygame本身的函数,我还没有发现或理解如何使用这些函数。在


Tags: topath函数playinitpygame音频文件file
3条回答

只能使用pygame修剪对象:

sound = pygame.mixer.Sound(file='music.ogg')
raw_array = sound.get_raw()
raw_array = raw_array[100000:150000]
cut_sound = pygame.mixer.Sound(buffer=raw_array)
cut_sound.play(-1)

这将创造一个新的声音样本100000到150000。^{}方法将返回一个bytestring,您可以根据需要对其进行索引、复制或切片。在

Pygame还有一个名为^{}的内置模块,它允许您将声音转换为numpy数组,以便进行更高性能和更细粒度的编辑,以及直接访问示例而不是复制。在

你可以用vlc模型。在

如果您是windows用户,请在cmd中运行以下命令以安装vlc模型:

pip install python-vlc

初始化方法如下:

^{pr2}$

尽可能多地延迟(如2秒),然后运行以下命令停止:

my_sound.stop()

如果你想让游戏更复杂,永远不会中断游戏中的任何事情,你可以使用多线程和vlc模型定义此函数:

import vlc
import threading
import time


def play(sound: vlc.MediaPlayer, start, end):
    sound.play()
    time.sleep(end - start)     # in seconds
    sound.stop()
    return True


if __name__ == '__main__':
    my_sound = vlc.MediaPlayer(path_to_file)
    sound_thread = threading.Thread(target=play, args=([my_sound, 1, 2]))
    sound_thread.start()

要在pygame中使用相同的功能:

import pygame
import threading
import time


def play(sound, start, end):
    sound.set_pos(start)
    sound.play()
    time.sleep(end - start)     # in seconds
    sound.stop()
    return True


if __name__ == '__main__':
    music = pygame.mixer_music
    sound = music.load("file directory/sound.mp3")
    sound_thread = threading.Thread(target=play, args=([sound, 1, 2]))
    sound_thread.start()

设置位置方法的注意事项:

对于MOD文件,它是模块中的整数模式号。从一开始,从绝对位置开始。对于MP3文件,它是相对于当前位置的相对位置(以秒为单位)。在

相关问题 更多 >