解決 Python 播放的方案很多,而且各個看上去好像都很有效责语。找一個合適你用的炮障,還真有點難。mp3play坤候、pymedia胁赢、pyaudio、pyglet白筹、pygame智末,有些直接報錯,有些只支持 Windows徒河,最讓我吐槽的是 pygame系馆。
選擇 pygame
經(jīng)過各種測試,唯一讓我還算滿意的是 pygame顽照,使用簡單由蘑。但網(wǎng)上的例子就沒一個完整的,導(dǎo)致播放音頻時語速不正確 (讓我各種抓狂)代兵。音頻語速不正確的原因是 pygame.mixer.init()
初始化使用了默認值尼酿,按照 mixer.init 參數(shù)說明 需要傳入第一個參數(shù) frequency (采樣頻率)值后解決問題,根據(jù)說明剩下三個參數(shù)采用默認就好植影。實例中使用了 music 模塊 詳情查看 mixter.music 說明文檔裳擎。
import pygame, time
pygame.mixer.init(8640) # 初始化初混音器模塊參數(shù)
pygame.mixer.music.load("test.wav") # 加載音頻
pygame.mixer.music.play() # 播放
time.sleep(5) # 等待音頻播放完成
pygame.mixer.music.stop() # 播放完成
一個最簡單音頻播放就完成了。
獲取采用頻率和播放時長
我使用的是 wav 格式的音頻何乎,所以我選擇了 wave 庫對音頻文件進行解析句惯,使用 pip install wave
進行安裝土辩,使用其它格式需要自己挑選解析庫。
import wave
# 打開需要進行的文件
fhandle = wave.open(test.wav, "rb")
# 讀取格式信息
params = fhandle.getparams()
# nchannels, sampwidth, framerate, nframes, comptype, compname
# 聲道數(shù), 采樣寬度, 采樣頻率, 采樣點數(shù), 壓縮類型, 壓縮類型的描述抢野。
# wave模塊只支持非壓縮的數(shù)據(jù)拷淘,因此可以忽略最后兩個信息。
nchannels, sampwidth, framerate, nframes = params[:4]
print(nchannels, sampwidth, framerate, nframes)
playTime = nframes / float(framerate) # 播放時長
fhandle.close()
上述代碼完成了對采樣頻率和播放時間等信息的獲取指孤∑粞模可參考 https://blog.csdn.net/sinat_33588424/article/details/80239375 和 https://docs.python.org/3/library/wave.html 了解 wave 的詳細使用。
完整的音頻播放實例
import pygame
import wave
import time
fhandle = wave.open("test.wav", "rb")
params = fhandle.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
fhandle.close()
pygame.mixer.init(framerate)
pygame.mixer.music.load("test.wav")
pygame.mixer.music.play()
playTime = nframes/float(framerate)
time.sleep(playTime)
pygame.mixer.music.stop()
再也不用擔心 wav 播放語速不正常的問題恃轩。
Music 模塊方法簡要說明
方法 | 說明 |
---|---|
pygame.mixer.music.load | 加載音樂文件 |
pygame.mixer.music.play | 播放加載完成的音樂文件 |
pygame.mixer.music.rewind | 重新播放音頻 |
pygame.mixer.music.stop | 停止播放 |
pygame.mixer.music.pause | 暫停播放 |
pygame.mixer.music.unpause | 回復(fù)播放 |
pygame.mixer.music.fadeout | 淡出 |
pygame.mixer.music.set_volume | 設(shè)置音量 |
pygame.mixer.music.get_volume | 獲取音量 |
pygame.mixer.music.get_busy | 檢查音樂是否正在播放 |
pygame.mixer.music.set_pos | 設(shè)置開始播放的位置 |
pygame.mixer.music.get_pos | 獲取音樂已經(jīng)播放的時間 |
pygame.mixer.music.queue | 將音樂文件放入待循環(huán)列表 |
pygame.mixer.music.set_endevent | 音樂播放完成時發(fā)送事件 |
pygame.mixer.music.get_endevent | 獲取音樂播放完成發(fā)送的事件類型 |