目录
pygame.mixer.set_num_channels()
pygame.mixer.get_num_channels()
pygame.mixer.get_sdl_mixer_version()
pygame.mixer.Sound.set_volume()
pygame.mixer.Sound.get_volume()
pygame.mixer.Sound.get_num_channels()
pygame.mixer.Sound.get_length()
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.get_queue()
pygame.mixer.Channel.set_endevent()
pygame.mixer.Channel.get_endevent()
pygame.mixer.music.set_volume()
pygame.mixer.music.get_volume()
pygame.mixer.music.set_endevent()
pygame.mixer.music.get_endevent()
功能
此模块包含用于加载声音对象和控制播放的类,以及一个用于播放音乐的的流媒体频道。混音器模块是可选的,取决于SDL_mixer。程序需要测试 pygame.mixer
可用并在使用前初始化。
- 混音器模块具有用于播放声音的有限数量的频道。通常程序会告诉pygame开始播放音频并自动选择可用的频道。默认值是8个同时的通道,但是复杂的程序可以更精确地控制通道的数量和使用。
- 所有的声音播放都在后台线程中调配。当开始播放一个Sound对象时,它将在声音继续播放时立即返回。单独一个声音对象也可以多次主动播放。
- 混音器模块必须像其他pygame模块一样初始化,但它有一些额外的条件:
pygame.mixer.init()
函数需要几个可选参数来控制播放速率和样本大小。Pygame将默认为合理的值,但是Pygame不能执行声音重采样,因此应该初始化混音器以匹配音频资源的值。 - 对于较轻的延迟声音,请使用较小的缓冲区大小。默认设置是为了减少在某些计算机上发出刺耳声音的可能性。可以通过在调用
pygame.mixer.init()
或pygame.init()
之前调用pygame.mixer.pre_init()
。例如:pygame.mixer.pre_init(44100,-16,2, 1024)
- 混音器通过
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 更改】
- size参数表示每个音频样本使用了多少位。如果该值为负,则将使用带符号的样本值。正值表示将使用无符号音频样本。无效值引发异常。New in pygame 2:使用SDL2编译时,大小可以是32(32位浮点数)。
- channels参数用于指定是使用mono还是stereo:1是单声道,2是立体声。New in pygame 2:频道的数量也可以是4或6。
- buffer参数控制混音器中使用的内部采样数。默认值在大多数情况下都应该有效。可以降低它以减少延迟,但可能会出现声音丢失。它可以提高到更大的值以确保播放永远不会跳过,但它会对声音播放造成延迟。buffer参数大小必须是2的幂(如果不是,则四舍五入到下一个最接近的幂2)。
- 一些平台需要display模块初始化后初始化
pygame.mixer
模块。最高层pygame.init()
自动处理此问题,但不能将任何参数传递给混音器初始化方法。为了解决这个问题,mixer有一个函数pygame.mixer.pre_init()
可以在使用顶层初始化之前设置正确的默认值。 - 当 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没有影响(即请求的格式可能总是与返回的格式不同)。
- 多次调用是安全的,但是在混音器初始化之后,如果不调用
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
- 这将查找并返回一个不活动的通道对象。如果没有函数将返回
None
。如果没有不活动的通道并且force参数为True
,则会找到运行声音最长的通道并返回该通道。 - 如果混音器已由
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
- 从文件名、python文件对象或可读缓冲区对象加载一个新的声音缓冲。执行有限的重新采样可以帮助样本匹配混音器的初始化参数。Unicode字符串只能表示文件路径名。Python2.x字符串或Python3.x字节对象可以表示路径名或缓冲区对象。需要使用 'file' 或 'buffer' 关键字以避免歧义,否则Sound可能会猜错。如果使用了array关键字(首先检查该对象的缓冲区接口),则该对象将导出一个版本3、C级的数组接口或者导出一个新的缓冲区接口【对于Python 2.6或更高版本】。
- 声音对象表示了实际的声音采样数据。更改声音对象状态的方法将更改声音播放的所有实例。声音对象还导出一个数组接口和一个新的缓冲区接口【对于Python2.6或更高版本】。
- 声音可以从OGG音频文件或未压缩WAV未见加载。
- 缓冲区(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
- 开始在可用频道(例如,计算机扬声器上)上播放声音。此方法将强制选择一个频道,因此播放可能会在必要时切断当前播放的声音。
- loops参数控制样本在第一次播放后重复的次数。值5表示声音将播放一次,然后重复5次,因此总共播放6次。默认值(零)表示声音不重复,因此只播放一次。如果loops设置为-1,声音将无限循环(仍然可以调用
stop()
来停止)。 - maxtime参数可控制在给定毫秒数后停止播放。
- fade_ms参数将使声音在给定时间内以0音量开始播放,并逐渐增加满音量。声音对象可能在完成淡入之前结束。
- 此方法将返回所选通道的通道对象。
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
- 返回一个当前通道的通道对象。id必须是从0到
pygame.mixer.get_num_channels()
的值。 - 通道对象可用于对声音的回放进行精细控制。一个频道一次只能播放一个声音对象。使用通道是完全可选的,因为pygame可以在默认情况下管理它们。
pygame.mixer.
Channel.play
()
功能:在特定频道播放声音
属性:play(Sound, loops=0, maxtime=0, fade_ms=0) -> None
- 这将开始在特定频道上播放声音。如果频道当前正在播放任何其他声音,则会停止播放。
- 循环(loops)参数的含义与
Sound.play()
中一致:第一次重复声音的次数。如果是3,声音将播放4次(第一次,然后再播放3次)。如果循环为-1,则播放将无限期重复。 - 类似
Sound.play()
,maxtime参数可用于在给定毫秒数后停止播放声音。 - 类似
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
- 设置播放声音的音量(响度)。当一个频道开始播放时,它的音量值被重置。因此此方法只影响当前声音。value参数介于0.0和1.0之间。
- 如果只传递一个参数,它将是两个扬声器的音量。如果传递了两个参数并且混音器处于立体声(stereo)模式,则第一个参数将是左扬声器的音量,第二个参数将是右扬声器的音量。(如果第二个参数为
None
,则第一个参数将是两个扬声器的音量。) - 如果频道播放的声音上还调用了
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
- 当声音在频道上排队时,它将在当前声音结束后立即开始播放。每个通道一次只能有一个声音排队。仅当当前播放自动完成时,才会播放排队的声音。可以与其他
Channel.stop()
或Channel.play()
调用关联。 - 如果频道上没有正在播放的声音,则该声音将立即开始播放。
pygame.mixer.
Channel.get_queue
()
功能:返回任何正排队的声音
属性:get_queue() -> Sound
如果一个声音已经在这个频道上排队,它将被返回。一旦队列中的声音开始播放,它将不再在队列中。
pygame.mixer.
Channel.set_endevent
()
功能:播放停止时让频道发送事件
属性:
- set_endevent() -> None
- set_endevent(type) -> None
- 当一个频道设置了endevent时,它将在每次声音在该频道上播放完时(不仅仅是第一次)向pygame队列发送一个事件。一旦发送endevent,就使用
pygame.event.get()
索回。 - 注意如果调用
Sound.play(n)
或Channel.play(sound,n)
,end event只发送一次:在声音播放“n+1”次之后(参见Sound.play详细文档)。 - 如果当声音仍在播放时调用了
Channel.stop()
或Channel.play()
,事件将立即发布。 - 类型参数将是发送到队列的事件id。这可以是任何有效的事件类型,但一个最好是选择
pygame.locals.USEREVENT
和pygame.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”的意思是一个浮点数(或一个可以转换成浮点数的数字),取决于音乐格式。
- 对于
MOD
文件,pos是模块中的整数模式号。对于OGG
,它是从声音开始的绝对位置,以秒为单位。对于MP3
文件,它是相对于当前位置的相对位置(秒)。要在MP3文件中进行绝对定位,请首先调用rewind()
。 - 不支持其他文件格式。较新版本的SDL_mixer比早期版本具有更好的定位支持。如果特定格式不支持定位,则会引发SDLError。
- 函数
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
- 这将导致pygame在音乐播放完毕时发出信号(通过事件队列)。参数决定将要加入队伍的事件类型。
- 每次音乐结束时,事件都会排队,而不仅仅是第一次。若要停止事件排队,请在不带参数的情况下调用此方法。
pygame.mixer.music.
get_endevent
()
功能:获取播放停止时频道发送的事件
属性:get_endevent() -> type
返回每次音乐播放结束时要发送的事件类型。如果没有,则函数返回 pygame.NOEVENT
。
整理自: