Pygame詳解(九):mixer 模組
pygame.mixer
用於載入和播放聲音的pygame模組
函式
- 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.Sound — 從檔案或緩衝區物件建立新的Sound物件
- pygame.mixer.Channel — 建立一個Channel物件來控制播放
此模組包含用於載入 Sound 物件和控制播放的類。混音器模組是可選的,取決於SDL_mixer。您的程式應該在使用它之前 測試 pygame.mixer 模組是否可用並進行初始化。
混音器模組具有有限數量的聲音播放聲道。通常程式會告訴 pygame 開始播放音訊,它會自動選擇一個可用的頻道。預設為8個併發通道,但複雜的程式可以更精確地控制通道數量及其使用。
所有聲音播放都混合在後臺執行緒中。當您開始播放Sound物件時,它會在聲音繼續播放時立即返回。單個Sound物件也可以自動播放多次。
混音器還有一個特殊流通道用於音樂播放,可通過 pygame.mixer.music 模組訪問。
混音器模組必須像其他 pygame 模組一樣進行初始化,但它有一些額外的條件。pygame.mixer.init() 函式採用幾個可選引數來控制播放速率和樣本大小。Pygame將 預設為合理的值,但pygame無法執行聲音重取樣,因此應初始化混音器以匹配音訊資源的值。
注意:不要使用較少的延遲聲音,請使用較小的緩衝區大小。 預設設定為減少某些計算機上發出沙啞聲音的可能性。 您可以在 pygame.mixer.init() 或者 pygame.init() 之前 通過呼叫pygame.mixer.pre_init()預設混合器初始化引數來更改預設緩衝區。 例如:pygame.mixer.pre_init(44100,-16,2,1024)。在pygame 1.8中,預設大小從1024更改為3072。
函式詳解
pygame.mixer.init()
初始化混音器模組
init(frequency=22050, size=-16, channels=2, buffer=4096) -> None
初始化混音器模組以進行聲音載入和播放。預設引數可以被改變以提供特定的音訊混合。允許使用關鍵字引數。對於引數設定為零的向後相容性,使用預設值(可能由pre_init呼叫更改)。
size引數表示每個音訊樣本使用的位數。如果值為負,則將使用帶符號的樣本值。正值表示將使用不帶符號的音訊樣本。無效值會引發異常。
pygame 2中的新功能(使用SDL2編譯時) - 大小可以是32(32位浮點數)。
channels引數用於指定是使用單聲道還是立體聲。1表示單聲道,2表示立體聲。不支援其他值(負值被視為1,大於2的值被視為2)。
buffer引數控制混音器中使用的內部取樣數。預設值應適用於大多數情況。可以降低它以減少延遲,但可能會發生聲音丟失。它可以被提升到更大的值,以確保播放永遠不會跳過,但它會對聲音播放施加延遲。緩衝區大小必須是2的冪(如果不是,則向上舍入到下一個最接近的2的冪)。
某些平臺需要在 display 模組初始化後初始化pygame.mixer 模組。頂級pygame.init() 自動處理此問題,但無法將任何引數傳遞給 mixer init。為了解決這個問題,mixer 具有pygame.mixer.pre_init() 函式在使用頂層初始化之前設定正確預設值。
多次呼叫是安全的,但是在初始化混音器後,如果沒有先呼叫 pygame.mixer.quit(),則無法更改播放參數 。
pygame.mixer.pre_init()
預設混音器初始化引數
pre_init(frequency=22050, size=-16, channels=2, buffersize=4096) -> None
呼叫 pre_init 可以更改呼叫 真正的初始化 pygame.mixer.init() 使用的預設值。允許使用關鍵字引數。設定自定義混音器播放值的最佳方法是 在呼叫頂級 pygame.init() 之前呼叫 pygame.mixer.pre_init()。對於向後相容性引數,零值將替換為啟動預設值。
pygame.mixer.quit()
退出混音器
quit() -> None
這將解除安裝 pygame.mixer,如果稍候重新初始化,則所有播放將停止並且任何載入的Sound物件可能與混音器不相容。
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
這將找到並返回一個非活動的Channel物件。如果沒有非活動通道,則此函式將返回None。如果沒有非活動通道且force引數為True,則會找到執行時間最長的聲道並返回它。
如果調音臺有 pygame.mixer.set_reserved() 保留頻道,則此處不會返回這些頻道。
pygame.mixer.get_busy()
測試mixer 是否正忙
get_busy() -> bool
如果混音器正忙,則返回True。如果混音器處於空閒狀態,則返回False。
類
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
- 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 - 返回Sound樣本的bytestring副本。
從檔名,python檔案物件或可讀緩衝區物件載入新的聲音緩衝區。將執行有限的重新取樣以幫助樣本匹配混音器的初始化引數。Unicode字串只能是檔案路徑名。Python 2.x字串或Python 3.x位元組物件可以是路徑名或緩衝區物件。使用'file'或'buffer'關鍵字來避免歧義; 否則Sound可能會猜錯。如果使用了array關鍵字,則該物件應該匯出版本3,C級別陣列介面,或者對於Python 2.6或更高版本,匯出新的緩衝區介面(首先檢查該物件的緩衝區介面。)
Sound物件表示實際的聲音樣本資料。更改Sound物件狀態的方法將是Sound播放的所有例項。Sound物件還匯出陣列介面,對於Python 2.6或更高版本,還會匯出新的緩衝區介面。
可以從OGG音訊檔案或未壓縮的 WAV 檔案載入聲音。
注意:緩衝區將在內部複製,不會在它與Sound物件之間共享資料。
目前緩衝區和陣列支援與sndarray.make_sound 數值陣列一致,因為忽略了樣本符號和位元組順序。這將通過正確處理符號和位元組順序或在不同時引發異常來改變。此外,截斷源樣本以適合音訊樣本大小。這不會改變。
pygame.mixer.Sound(buffer)是pygame 1.8中新增的pygame.mixer.Sound關鍵字引數和陣列介面支援pygame 1.9.2中的新功能。
play()
開始播放聲音
play(loops=0, maxtime=0, fade_ms=0) -> Channel
在可用頻道上開始播放聲音(即,在計算機的揚聲器上)。 這將強制選擇一個頻道,因此如有必要,播放可能會切斷當前正在播放的聲音。
loops引數控制第一次播放後樣本重複的次數。 值 5 表示聲音將播放一次,然後重複播放五次,因此共播放六次。 預設值(0)表示聲音不重複,因此只播放一次。 如果迴圈設定為-1,則Sound將無限迴圈(但是您仍然可以呼叫stop()來停止它)。
maxtime引數可用於在給定的毫秒數後停止播放。
fade_ms引數將使聲音以0音量開始播放,並在給定時間內逐漸升至全音量。 樣本可以在淡入完成之前結束。
這將返回所選通道的Channel物件。
stop()
停止聲音播放
stop() -> None
這將停止在任何活動頻道上播放此聲音。
fadeout()
淡出後停止聲音播放
fadeout(time) -> None
這將在以毫秒為單位在時間引數上淡出後停止播放聲音。Sound會在所有播放的頻道上消失並停止。
set_volume()
設定此聲音的播放音量
set_volume(value) -> None
這將設定此聲音的播放音量(響度)。如果正在播放,這將立即影響聲音。它也會影響此聲音的任何未來播放。引數是從0.0到1.0的值。
get_volume()
獲取播放音量
get_volume() -> value
返回0.0到1.0之間的值,表示此Sound的音量。
get_num_channels()
計算此聲音播放的次數
get_num_channels() -> count
返回此聲音正在播放的活動頻道數。
get_length()
得到聲音的長度
get_length() -> seconds
以秒為單位返回此聲音的長度。
get_raw()
返回Sound樣本的bytestring副本。
get_raw() -> bytes
將Sound物件緩衝區的副本作為位元組(對於Python 3.x)或str(對於Python 2.x)物件返回。
pygame 1.9.2中的新功能。
類
pygame.mixer.Channel
建立一個Channel物件來控制播放
Channel(id) -> 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 - 排隊Sound物件以跟隨當前
- pygame.mixer.Channel.get_queue - 返回排隊的任何聲音
- pygame.mixer.Channel.set_endevent - 播放停止時讓頻道傳送事件
- pygame.mixer.Channel.get_endevent - 獲取播放停止時頻道傳送的事件
返回其中一個當前通道的Channel物件。id必須是從0到 值pygame.mixer.get_num_channels() 的值。
Channel物件可用於精確控制Sounds的播放。一個頻道只能播放一個聲音。使用頻道完全是可選的,因為pygame預設可以管理它們。
play()
在特定頻道上播放聲音
play(Sound, loops=0, maxtime=0, fade_ms=0) -> None
這將開始播放特定頻道上的聲音。 如果頻道正在播放任何其他聲音,它將被停止。
loops引數與Sound.play()中的含義相同:它是第一次重複聲音的次數。 如果是3,聲音將播放4次(第一次,然後是三次)。 如果迴圈為-1,則播放將無限重複。
與Sound.play()一樣,maxtime引數可用於在給定的毫秒數後停止播放聲音。
與Sound.play()一樣,fade_ms引數可以在聲音中淡入淡出。
stop()
停止在頻道上播放聲音
stop() -> None
停止在頻道上播放聲音。播放停止後,頻道可用於播放新的聲音。
pause()
暫時停止播放頻道
pause() -> None
暫時停止在頻道上播放聲音。它可以在之後呼叫 Channel.unpause() 恢復
unpause()
恢復暫停播放頻道
unpause() -> None
在暫停的頻道上恢復播放。
fadeout()
淡出通道後停止播放
fadeout(time) -> None
在給定時間引數上淡出聲音後,以毫秒為單位停止播放通道。
set_volume()
設定播放頻道的音量
set_volume(value) -> None
set_volume(left, right) -> None
設定播放聲音的音量(響度)。當頻道開始播放時,其音量值將被重置。這隻會影響當前的聲音。value引數介於0.0和1.0之間。
如果傳遞一個引數,則它將是兩個發言者的音量。如果傳遞兩個引數並且混音器處於立體聲模式,則第一個引數將是左揚聲器的音量,第二個引數將是右揚聲器的音量。(如果第二個引數為None,則第一個引數將是兩個揚聲器的音量。)
如果頻道正在播放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).
get_volume()
獲得播放頻道的音量
get_volume() -> value
返回當前播放聲音的通道音量。這沒有考慮到使用的立體聲分離 Channel.set_volume()。Sound物件也有自己的音量,與音訊混合。
get_busy()
檢查通道是否處於活動狀態
get_busy() -> bool
如果通道正在主動混合聲音,則返回true。如果通道空閒,則返回False。
get_sound()
得到當前播放的聲音
get_sound() -> Sound
返回當前在此頻道上播放的實際Sound物件。如果通道空閒,則返回None。
queue()
排隊Sound物件以跟隨當前
queue(Sound) -> None
當聲音在頻道上排隊時,它將在當前聲音結束後立即開始播放。每個通道一次只能排隊一個聲音。排隊的聲音僅在當前播放自動結束時播放。在對Channel.stop()或的任何其他呼叫中清除它 Channel.play()。
如果在頻道上沒有主動播放聲音,則聲音將立即開始播放。
get_queue()
返回排隊的任何聲音
get_queue() -> Sound
如果聲音已在此頻道上排隊,則會返回該聲音。一旦排隊的聲音開始播放,它將不再在佇列中。
set_endevent()
播放停止時讓頻道傳送事件
set_endevent() -> None
set_endevent(type) -> None
當為某個頻道設定了一個嘗試時,每當一個聲音在該頻道上播放時(不僅僅是第一次),它就會向一個遊戲佇列傳送一個事件。使用pygame.event.get()一旦它傳送到檢索ENDEVENT。
請注意,如果您呼叫Sound.play(n)或Channel.play(sound,n),結束事件僅傳送一次:聲音播放“n + 1”次後(請參閱Sound.play文件)。
如果在聲音仍然播放時呼叫Channel.stop()或Channel.play()呼叫,則會立即釋出事件。
type引數將是傳送到佇列的事件id。這可以是任何有效的事件型別,但一個好的選擇是pygame.locals.USEREVENT和之間的值 pygame.locals.NUMEVENTS。如果沒有給出型別引數,那麼Channel將停止傳送事件。
get_endevent()
獲取播放停止時頻道傳送的事件
get_endevent() -> type
返回每次Channel完成聲音播放時要傳送的事件型別。如果沒有功能返回該功能 pygame.NOEVENT。