1. 程式人生 > >Pygame詳解(九):mixer 模組

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。