当前位置: 首页 > 工具软件 > Mixer > 使用案例 >

pygame中的mixer(含music)模块

赵炯
2023-12-01

目录

功能

方法详解

控制播放

pygame.mixer.init()

pygame.mixer.pre_init()

pygame.mixer.quit()

pygame.mixer.get_init()

pygame.mixer.stop()

pygame.mixer.pause()

pygame.mixer.unpause()

pygame.mixer.fadeout()

pygame.mixer.set_num_channels()

pygame.mixer.get_num_channels()

pygame.mixer.set_reserved()

pygame.mixer.find_channel()

pygame.mixer.get_busy()

pygame.mixer.get_sdl_mixer_version()

pygame.mixer.Sound

pygame.mixer.Sound.play()

pygame.mixer.Sound.stop()

pygame.mixer.Sound.fadeout()

pygame.mixer.Sound.set_volume()

pygame.mixer.Sound.get_volume()

pygame.mixer.Sound.get_num_channels()

pygame.mixer.Sound.get_length()

pygame.mixer.Sound.get_raw()

pygame.mixer.Channel

pygame.mixer.Channel.play()

pygame.mixer.Channel.stop()

pygame.mixer.Channel.pause()

pygame.mixer.Channel.unpause()

pygame.mixer.Channel.fadeout()

pygame.mixer.Channel.set_volume()

pygame.mixer.Channel.get_volume()

pygame.mixer.Channel.get_busy()

pygame.mixer.Channel.get_sound()

pygame.mixer.Channel.queue()

pygame.mixer.Channel.get_queue()

pygame.mixer.Channel.set_endevent()

pygame.mixer.Channel.get_endevent()

pygame.mixer.music

pygame.mixer.music.load()

pygame.mixer.music.unload()

pygame.mixer.music.play()

pygame.mixer.music.rewind()

pygame.mixer.music.stop()

pygame.mixer.music.pause()

pygame.mixer.music.unpause()

pygame.mixer.music.fadeout()

pygame.mixer.music.set_volume()

pygame.mixer.music.get_volume()

pygame.mixer.music.get_busy()

pygame.mixer.music.set_pos()

pygame.mixer.music.get_pos()

pygame.mixer.music.queue()

pygame.mixer.music.set_endevent()

pygame.mixer.music.get_endevent()


功能

此模块包含用于加载声音对象和控制播放的类,以及一个用于播放音乐的的流媒体频道。混音器模块是可选的,取决于SDL_mixer。程序需要测试 pygame.mixer可用并在使用前初始化。

  1. 混音器模块具有用于播放声音的有限数量的频道。通常程序会告诉pygame开始播放音频并自动选择可用的频道。默认值是8个同时的通道,但是复杂的程序可以更精确地控制通道的数量和使用。
  2. 所有的声音播放都在后台线程中调配。当开始播放一个Sound对象时,它将在声音继续播放时立即返回。单独一个声音对象也可以多次主动播放。
  3. 混音器模块必须像其他pygame模块一样初始化,但它有一些额外的条件:pygame.mixer.init() 函数需要几个可选参数来控制播放速率和样本大小。Pygame将默认为合理的值,但是Pygame不能执行声音重采样,因此应该初始化混音器以匹配音频资源的值。
  4. 对于较轻的延迟声音,请使用较小的缓冲区大小。默认设置是为了减少在某些计算机上发出刺耳声音的可能性。可以通过在调用pygame.mixer.init() 或 pygame.init()之前调用pygame.mixer.pre_init()。例如:pygame.mixer.pre_init(44100,-16,2, 1024)
  5. 混音器通过pygame.mixer.music模块控制音乐播放。音乐播放和常规声音播放的区别在于,音乐是流媒体播放的,而不是一次全部加载。混音系统一次只支持一个音乐流。但是注意MP3支持是有限的。在某些系统上,不支持的格式可能会使程序崩溃,例如Debian Linux,考虑改用OGG。

方法详解

控制播放

pygame.mixer.init()

功能:初始化混音器模块

属性:init(frequency=44100, size=-16, channels=2, buffer=512, devicename=None, allowedchanges=AUDIO_ALLOW_FREQUENCY_CHANGE | AUDIO_ALLOW_CHANNELS_CHANGE) -> None

初始化混音器模块以加载和播放声音。可以重写默认参数以提供特定的音频混合。可以接受关键字参数,并对于设置为零的参数有向后兼容性,即替换为默认值。【可调用 pre_init 更改】

  1. size参数表示每个音频样本使用了多少位。如果该值为负,则将使用带符号的样本值。正值表示将使用无符号音频样本。无效值引发异常。New in pygame 2:使用SDL2编译时,大小可以是32(32位浮点数)。
  2. channels参数用于指定是使用mono还是stereo:1是单声道,2是立体声。New in pygame 2:频道的数量也可以是4或6。
  3. buffer参数控制混音器中使用的内部采样数。默认值在大多数情况下都应该有效。可以降低它以减少延迟,但可能会出现声音丢失。它可以提高到更大的值以确保播放永远不会跳过,但它会对声音播放造成延迟。buffer参数大小必须是2的幂(如果不是,则四舍五入到下一个最接近的幂2)。
  4. 一些平台需要display模块初始化后初始化 pygame.mixer 模块。最高层 pygame.init() 自动处理此问题,但不能将任何参数传递给混音器初始化方法。为了解决这个问题,mixer有一个函数 pygame.mixer.pre_init()可以在使用顶层初始化之前设置正确的默认值。
  5. 当 allowedchanges=0 时,将在运行时转换示例以匹配硬件支持的内容。例如,声卡可能不支持16位声音采样,因此将在内部使用8位采样。如果提供了AUDIO_ALLOW_FORMAT_CHANGE,则请求的格式将更改为SDL2支持的最接近的格式。除了0之外,allowedchanged还接受以下常量(或同时):
    • AUDIO_ALLOW_FREQUENCY_CHANGE
    • AUDIO_ALLOW_FORMAT_CHANGE
    • AUDIO_ALLOW_CHANNELS_CHANGE
    • AUDIO_ALLOW_ANY_CHANGE

    New in pygame 2:为SDL2添加了allowedchanges。这对SDL1没有影响(即请求的格式可能总是与返回的格式不同)。 

  6. 多次调用是安全的,但是在混音器初始化之后,如果不调用 pygame.mixer.quit()无法更改播放参数。

Changed in pygame 1.8::默认缓冲区大小从1024更改为3072。The default buffersize was changed from 1024 to 3072.

Changed in pygame 1.9.1:默认缓冲区大小从3072更改为4096。

Changed in pygame 2.0.0:默认缓冲区大小从4096更改为512。默认频率从22050更改为44100。

pygame.mixer.pre_init()

功能:预设混音器初始参数

属性:pre_init(frequency=44100, size=-16, channels=2, buffer=512, devicename=None) -> None

当实际调用 pygame.mixer.init()时调用 pre_init 更改默认使用值。可以接受关键字参数。设置自定义混音器播放值的最佳方法是在顶层初始化 pygame.init()之前调用 pygame.mixer.pre_init()。具有向后兼容性,参数值0将替换为启动默认值。

Changed in pygame 1.8::默认缓冲区大小从1024更改为3072。The default buffersize was changed from 1024 to 3072.

Changed in pygame 1.9.1:默认缓冲区大小从3072更改为4096。

Changed in pygame 2.0.0:默认缓冲区大小从4096更改为512。默认频率从22050更改为44100。

pygame.mixer.quit()

功能:取消混音器初始化

属性:quit() -> None

将取消初始化pygame.mixer。如果稍后重新初始化混音器,则所有播放都将停止,并且任何加载的声音对象可能与混音器不兼容。

pygame.mixer.get_init()

功能:测试混音器是否初始化

属性:get_init() -> (frequency, format, channels)

如果混音器已初始化,则返回正在使用的播放参数。如果混音器尚未初始化,则返回None

pygame.mixer.stop()

功能:停止播放所有声道

属性:stop() -> None

pygame.mixer.pause()

功能:暂时停止所有声道的播放

属性:pause() -> None

稍后可以使用 pygame.mixer.unpause()恢复播放。

pygame.mixer.unpause()

功能:恢复暂停的声道播放

属性:unpause() -> None

pygame.mixer.fadeout()

功能:停止前将所有声音的音量淡出

属性:fadeout(time) -> None

将在时间参数(毫秒)中淡出所有活声道通道上的音量。静音后,播放将停止。

pygame.mixer.set_num_channels()

功能:设置播放频道总数

属性:set_num_channels(count) -> None

设置混音器的可用频道数。默认值为8。该值可以增加或减少。如果该值减小,则在缩减的频道上播放的声音将停止。

pygame.mixer.get_num_channels()

功能:获取当前活动的播放频道的总数【返回值】

属性:get_num_channels() -> count

pygame.mixer.set_reserved()

功能:预约自动使用的频道

属性:set_reserved(count) -> None

混音器可以预约任意数量的声道,这些声道不会自动选择以供声音播放。如果当前正在预约频道上播放声音,则不会停止。这允许应用程序为重要声音预约特定数量的频道,以保证这些声音不能被丢弃或有频道可供播放。

pygame.mixer.find_channel()

功能:查找未使用的频道

属性:find_channel(force=False) -> Channel

  1. 这将查找并返回一个不活动的通道对象。如果没有函数将返回 None。如果没有不活动的通道并且force参数为 True,则会找到运行声音最长的通道并返回该通道。
  2. 如果混音器已由 pygame.mixer.set_reserved()留了一些频道,则这些频道将不会在此处返回。

pygame.mixer.get_busy()

功能:测试混音器是否运行

属性:get_busy() -> bool

如果混音器任何频道运行,则返回True。如果混音器空闲,则返回 False

pygame.mixer.get_sdl_mixer_version()

功能:获取混音器的SDL版本

属性:

  • get_sdl_mixer_version() -> (major, minor, patch)
  • get_sdl_mixer_version(linked=True) -> (major, minor, patch)

参数:linked (bool) -- 如果为 True(默认值),则返回链接的版本号,否则返回编译的版本号。

返回值(tuple):混音器的SDL库版本号(根据linked参数选择是链接或编译)为3个整数的元组(major, minor, patch)

注意:链接的和编译的版本号应该相同。

New in pygame 2.0.0.

 

pygame.mixer.Sound

功能:从文件或缓冲区对象中创建新的声音(Sound)对象

属性:

  • Sound(filename) -> Sound
  • Sound(file=filename) -> Sound
  • Sound(buffer) -> Sound
  • Sound(buffer=buffer) -> Sound
  • Sound(object) -> Sound
  • Sound(file=object) -> Sound
  • Sound(array=object) -> Sound
  1. 从文件名、python文件对象或可读缓冲区对象加载一个新的声音缓冲。执行有限的重新采样可以帮助样本匹配混音器的初始化参数。Unicode字符串只能表示文件路径名。Python2.x字符串或Python3.x字节对象可以表示路径名或缓冲区对象。需要使用 'file' 或 'buffer' 关键字以避免歧义,否则Sound可能会猜错。如果使用了array关键字(首先检查该对象的缓冲区接口),则该对象将导出一个版本3、C级的数组接口或者导出一个新的缓冲区接口【对于Python 2.6或更高版本】。
  2. 声音对象表示了实际的声音采样数据。更改声音对象状态的方法将更改声音播放的所有实例。声音对象还导出一个数组接口和一个新的缓冲区接口【对于Python2.6或更高版本】。
  3. 声音可以从OGG音频文件或未压缩WAV未见加载。
  4. 缓冲区(buffer)将在内部复制,它与声音对象之间不会共享任何数据。目前由于数值数组,缓冲区和数组支持 sndarray.make_sound ,因此采样忽略符号和字节顺序。但是如果不正确处理符号和字节顺序,在不同的情况下可能会引发异常。此外,源样本会被截断以适应音频样本大小。

New in pygame 1.8:pygame.mixer.Sound(buffer)

New in pygame 1.9.2:pygame.mixer.Sound 关键字参数和数组接口支持

pygame.mixer.Sound.play()

功能:开始播放声音

属性:play(loops=0, maxtime=0, fade_ms=0) -> Channel

  1. 开始在可用频道(例如,计算机扬声器上)上播放声音。此方法将强制选择一个频道,因此播放可能会在必要时切断当前播放的声音。
  2. loops参数控制样本在第一次播放后重复的次数。值5表示声音将播放一次,然后重复5次,因此总共播放6次。默认值(零)表示声音不重复,因此只播放一次。如果loops设置为-1,声音将无限循环(仍然可以调用stop()来停止)。
  3. maxtime参数可控制在给定毫秒数后停止播放。
  4. fade_ms参数将使声音在给定时间内以0音量开始播放,并逐渐增加满音量。声音对象可能在完成淡入之前结束。
  5. 此方法将返回所选通道的通道对象。

pygame.mixer.Sound.stop()

功能:停止在任何活动频道上播放此声音

属性:stop() -> None

pygame.mixer.Sound.fadeout()

功能:淡出后停止播放声音

属性:fadeout(time) -> None

将在时间参数(毫秒)内淡出声音后停止播放。所有正在播放频道上的此声音都将减弱并停止。

pygame.mixer.Sound.set_volume()

功能:设置此声音的播放音量

属性:set_volume(value) -> None

设置此声音的播放音量(响度)。如果正在播放,这将立即影响声音。也会影响到以后播放的任何声音。

参数:value (float) -- 0.0到1.0(含)范围内的音量。如果值小于0.0,则不会更改音量;如果值大于1.0,则音量将设置为1.0。

pygame.mixer.Sound.get_volume()

功能:获取播放音量

属性:get_volume() -> value

返回一个从0.0到1.0的值,表示此声音的音量。

pygame.mixer.Sound.get_num_channels()

功能:计算此声音正在播放的频道数【返回值】

属性:get_num_channels() -> count

pygame.mixer.Sound.get_length()

功能:获取声音的长度【返回值(秒)】

属性:get_length() -> seconds

pygame.mixer.Sound.get_raw()

功能:获取声音样本的bytestring副本

属性:get_raw() -> bytes

以字节(对于Python3.x)或字符串对象(对于Python2.x)的形式返回一个声音对象缓冲区的副本。

New in pygame 1.9.2.

 

pygame.mixer.Channel

功能:创建一个用于控制播放的通道(Channel)对象

属性:Channel(id) -> Channel

  1. 返回一个当前通道的通道对象。id必须是从0到pygame.mixer.get_num_channels()的值。
  2. 通道对象可用于对声音的回放进行精细控制。一个频道一次只能播放一个声音对象。使用通道是完全可选的,因为pygame可以在默认情况下管理它们。

pygame.mixer.Channel.play()

功能:在特定频道播放声音

属性:play(Sound, loops=0, maxtime=0, fade_ms=0) -> None

  1. 这将开始在特定频道上播放声音。如果频道当前正在播放任何其他声音,则会停止播放。
  2. 循环(loops)参数的含义与Sound.play()中一致:第一次重复声音的次数。如果是3,声音将播放4次(第一次,然后再播放3次)。如果循环为-1,则播放将无限期重复。
  3. 类似Sound.play(),maxtime参数可用于在给定毫秒数后停止播放声音。
  4. 类似Sound.play(),fade_ms参数可以在声音中使用淡出。

pygame.mixer.Channel.stop()

功能:停止频道上的声音播放

属性:stop() -> None

停止播放后,频道可供播放新声音。

pygame.mixer.Channel.pause()

功能:暂时停止在频道上播放声音

属性:pause() -> None

以后可以使用Channel.unpause()恢复播放。

pygame.mixer.Channel.unpause()

功能:在暂停的频道上继续播放

属性:unpause() -> None

pygame.mixer.Channel.fadeout()

功能:淡出频道后停止播放

属性:fadeout(time) -> None

在给定时间参数(毫秒)内淡出声音后停止播放频道。

pygame.mixer.Channel.set_volume()

功能:设置播放频道的音量

属性:

  • set_volume(value) -> None
  • set_volume(left, right) -> None
  1. 设置播放声音的音量(响度)。当一个频道开始播放时,它的音量值被重置。因此此方法只影响当前声音。value参数介于0.0和1.0之间。
  2. 如果只传递一个参数,它将是两个扬声器的音量。如果传递了两个参数并且混音器处于立体声(stereo)模式,则第一个参数将是左扬声器的音量,第二个参数将是右扬声器的音量。(如果第二个参数为 None,则第一个参数将是两个扬声器的音量。)
  3. 如果频道播放的声音上还调用了sound.set_volume(),则将同时考虑这两个调用。例如:
    sound = pygame.mixer.Sound("s.wav")
    channel = s.play()      # Sound plays at full volume by default
    sound.set_volume(0.9)   # Now plays at 90% of full volume.
    sound.set_volume(0.6)   # Now plays at 60% (previous value replaced).
    channel.set_volume(0.5) # Now plays at 30% (0.6 * 0.5).
    

pygame.mixer.Channel.get_volume()

功能:获取播放频道的音量

属性:get_volume() -> value

返回当前播放声音的频道音量。这不考虑由Channel.set_volume()设置的立体声分离的情况,声音对象仍有与声道混合在一起的自己的音量。

pygame.mixer.Channel.get_busy()

功能:检查通道是否激活

属性:get_busy() -> bool

如果通道正在进行声音混合,则返回 True。如果通道空闲,则返回 False

pygame.mixer.Channel.get_sound()

功能:获取当前播放的声音

属性:get_sound() -> Sound

返回当前在此频道上播放的实际声音对象。如果通道空闲,则返回 None

pygame.mixer.Channel.queue()

功能:将声音对象排队以跟随当前

属性:queue(Sound) -> None

  1. 当声音在频道上排队时,它将在当前声音结束后立即开始播放。每个通道一次只能有一个声音排队。仅当当前播放自动完成时,才会播放排队的声音。可以与其他Channel.stop() 或 Channel.play()调用关联。
  2. 如果频道上没有正在播放的声音,则该声音将立即开始播放。

pygame.mixer.Channel.get_queue()

功能:返回任何正排队的声音

属性:get_queue() -> Sound

如果一个声音已经在这个频道上排队,它将被返回。一旦队列中的声音开始播放,它将不再在队列中。

pygame.mixer.Channel.set_endevent()

功能:播放停止时让频道发送事件

属性:

  • set_endevent() -> None
  • set_endevent(type) -> None
  1. 当一个频道设置了endevent时,它将在每次声音在该频道上播放完时(不仅仅是第一次)向pygame队列发送一个事件。一旦发送endevent,就使用 pygame.event.get() 索回。
  2. 注意如果调用Sound.play(n) 或Channel.play(sound,n),end event只发送一次:在声音播放“n+1”次之后(参见Sound.play详细文档)。
  3. 如果当声音仍在播放时调用了Channel.stop() 或 Channel.play(),事件将立即发布。
  4. 类型参数将是发送到队列的事件id。这可以是任何有效的事件类型,但一个最好是选择pygame.locals.USEREVENTpygame.locals.NUMEVENTS二者之一。 如果未给出类型参数,则通道将停止发送endevents。

pygame.mixer.Channel.get_endevent()

功能:获取播放停止时频道发送的事件

属性:get_endevent() -> type

返回每次频道完成声音播放时要发送的事件类型。如果没有endevent,则函数返回pygame.NOEVENT

 

pygame.mixer.music

pygame.mixer.music.load()

功能:加载音乐文件以便播放

属性:

  • load(filename) -> None
  • load(object) -> None

加载音乐文件名/文件对象并准备播放。如果音乐流已在播放,则将停止播放。但不会开始播放音乐。

pygame.mixer.music.unload()

功能:卸载当前加载的音乐以释放资源

属性:unload() -> None

New in pygame 2.0.0.

pygame.mixer.music.play()

功能:开始播放音乐流

属性:play(loops=0, start=0.0, fade_ms = 0) -> None

播放加载的音乐流。如果音乐已经播放,它将重新启动。

参数:

  • loops (int) -- (可选)重复音乐的次数。设置为5将播放五次音乐。设为-1可使音乐不确定地重复。
  • start (float) -- (可选)音乐开始播放的位置。起始位置取决于播放的音乐格式:MP3和OGG使用该位置为时间(秒)。对于MOD music,它是模式顺序号。如果无法设置起始位置,则传递起始位置将引发NotImplementedError。
  • fade_ms (int) -- (可选)使音乐在给定时间内开始以0音量播放并淡入到最大音量。片段可能在淡入完成之前结束。在PyGame2.0中添加。

pygame.mixer.music.rewind()

功能:重新启动当前音乐

属性:rewind() -> None

pygame.mixer.music.stop()

功能:停止音乐播放

属性:stop() -> None

如果当前正在播放音乐,则停止播放。不会卸载音乐。

pygame.mixer.music.pause()

功能:暂时停止音乐播放

属性:pause() -> None

暂时停止播放音乐流。可以用pygame.mixer.music.unpause()函数恢复播放。

pygame.mixer.music.unpause()

功能:继续播放暂停的音乐

属性:unpause() -> None

pygame.mixer.music.fadeout()

功能:淡出后停止播放当前音乐

属性:fadeout(time) -> None

此功能将一直阻塞,直到音乐淡出。在此期间,对 fadeout()set_volume()的调用将无效。如果使用set_endevent()设置了事件,则在音乐淡出后将调用该事件。

参数:time (int) -- 音乐音量在停止前淡出的时间(毫秒)。

pygame.mixer.music.set_volume()

功能:设置音乐音量

属性:set_volume(volume) -> None

参数:volume (float) -- 参数值应介于0.0和1.0之间。重新加载音乐时,音量将重置为满音量。

pygame.mixer.music.get_volume()

功能:获取音乐音量

属性:get_volume() -> value

返回混音器的当前音量。该值将介于0.0和1.0之间。

pygame.mixer.music.get_busy()

功能:检查音乐流是否正在播放

属性:get_busy() -> bool

当音乐流正在播放时返回True。当音乐空闲时,返回False。即使音乐暂停,它也会返回True。

pygame.mixer.music.set_pos()

功能:设置播放位置

属性:set_pos(pos) -> None

这将设置音乐文件中开始播放的位置。“pos”的意思是一个浮点数(或一个可以转换成浮点数的数字),取决于音乐格式。

  1. 对于MOD文件,pos是模块中的整数模式号。对于OGG,它是从声音开始的绝对位置,以秒为单位。对于MP3文件,它是相对于当前位置的相对位置(秒)。要在MP3文件中进行绝对定位,请首先调用rewind()
  2. 不支持其他文件格式。较新版本的SDL_mixer比早期版本具有更好的定位支持。如果特定格式不支持定位,则会引发SDLError。
  3. 函数set_pos()调用带下划线的SDL_mixer函数 Mix_SetMusicPosition

New in pygame 1.9.2.

pygame.mixer.music.get_pos()

功能:获得音乐播放时间

属性:get_pos() -> time

获取音乐播放的毫秒数。返回的时间仅表示音乐已播放的时间,不考虑任何起始位置偏移。

pygame.mixer.music.queue()

功能:将声音文件排队以跟踪当前文件

属性:queue(filename) -> None

这将加载一个声音文件并将其排队。当前声音自然结束后,排队的声音文件将立即开始。一次只能排队一个声音。在另一个声音排队时对新声音排队将导致新声音成为正在排队声音。此外,如果当前声音被停止或更改,排队的声音将丢失。以下示例将播放巴赫的音乐六次,然后播放莫扎特的音乐一次:

pygame.mixer.music.load('bach.ogg')
pygame.mixer.music.play(5)        # Plays six times, not five!
pygame.mixer.music.queue('mozart.ogg')

pygame.mixer.music.set_endevent()

功能:播放停止时让音乐发送事件

属性:

  • set_endevent() -> None
  • set_endevent(type) -> None
  1. 这将导致pygame在音乐播放完毕时发出信号(通过事件队列)。参数决定将要加入队伍的事件类型。
  2. 每次音乐结束时,事件都会排队,而不仅仅是第一次。若要停止事件排队,请在不带参数的情况下调用此方法。

pygame.mixer.music.get_endevent()

功能:获取播放停止时频道发送的事件

属性:get_endevent() -> type

返回每次音乐播放结束时要发送的事件类型。如果没有,则函数返回 pygame.NOEVENT

 

 

 

整理自:

 类似资料: