.spx 是 Speex音頻編解碼器的文件擴展名,它是一種開源的、免費的音頻編解碼器,主要用于語音壓縮和語音通信領域。spx 文件通常用于語音記錄、VoIP應用、語音信箱等場景。
.mp3 是一種廣泛使用的音頻格式,它采用了有損壓縮算法,可以在保持較高音質的同時減小文件大小。mp3文件可以在各種設備和平臺上播放,包括計算機、移動設備、音頻播放器等。
FFmpeg 可以將.spx文件轉碼成.wav文件,基于 pyaudio 和 wave 實現播放.wav 聲音文件。
where ffmpeg
D:\FFmpeg\64\ffmpeg.exe
#--?轉換.spx 到 .wav:
ffmpeg?-i input.spx -acodec pcm_s16le?output.wav
#--?轉換.wav 到 .mp3:
ffmpeg?-i input.wav -f mp3 ?output.mp3
pip install pyaudio
pip install wave
編寫?play_spx.py? 如下
# -*- coding: utf-8 -*-
""" 播放 *.spx 音頻文件 """
import os
import sys
import time
from tkinter import filedialog
import pyaudio
import wave# main()
f1 = ''
if len(sys.argv) ==1:filetypes = [('spx file','.spx'),('ogg file','.ogg')]f1 = filedialog.askopenfilename(initialdir='D:/Music', filetypes=filetypes)
elif len(sys.argv) ==2:f1 = sys.argv[1]
else:print('usage: python play_spx.py file1.spx')sys.exit(1)if not os.path.exists(f1):print(f"{f1} is not exists.")sys.exit(2)fn,ext = os.path.splitext(f1)
if ext.lower() not in ('.spx','.ogg'):print('ext is not (.spx , .ogg )')sys.exit(2)f2 = fn +'.wav'
if not os.path.exists(f2):os.system(r"D:\FFmpeg\64\ffmpeg.exe -i %s -acodec pcm_s16le %s" % (f1,f2))
else:print(f"{f2} is exists")# 初始化 PyAudio
p = pyaudio.PyAudio()def play_wav(filename):# 打開 WAV 文件wf = wave.open(filename, 'rb')# 打開音頻流stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(), output=True)chunk = 1024data = wf.readframes(chunk)while data :stream.write(data)data = wf.readframes(chunk)stream.stop_stream()stream.close()wf.close()print(f2)
#time.sleep(1)
time1 = time.time()
# 播放音頻
play_wav(f2)
time2 = time.time()
print("run time: %.3f s" % (time2-time1))
運行 python play_spx.py?
參閱:pyaudio:基于pyaudio和pydub 實現一個簡易音樂播放器播放wav、mp3等格式音樂
安裝 pip install pygame
pygame 能播放*.mid , *.mp3 , *.wav ,編寫 play_mid.py? 如下:
# -*- coding: utf-8 -*-
import os
import sys
import time
from tkinter import filedialog
import traceback
import pygame
from pygame import mixerdef mixer_init():freq = 44100bitsize = -16channels = 2buffer = 2048mixer.init(freq, bitsize, channels, buffer)# optional volume 0 to 1.0mixer.music.set_volume(0.9)def play_mid(file):if mixer.music.get_busy():mixer.music.fadeout(1000)mixer.music.stop()clock = pygame.time.Clock()try:mixer.music.load(file)except:print(traceback.format_exc())mixer.music.play()while mixer.music.get_busy():clock.tick(30)# main()
f1 = ''
if len(sys.argv) ==1:filetypes = [('mid file','.mid'),('mp3 file','.mp3'),('wav file','.wav')]f1 = filedialog.askopenfilename(initialdir='D:/Music', filetypes=filetypes)
elif len(sys.argv) ==2:f1 = sys.argv[1]
else:print('usage: python play_mid.py file1.mid')print('usage: python play_mid.py file1.mp3')print('usage: python play_mid.py file1.wav')sys.exit(1)if not os.path.exists(f1):print(f"{f1} is not exists.")sys.exit(2)fn,ext = os.path.splitext(f1)
if ext.lower() not in ('.mid','.mp3','.wav'):print('.ext is not (.mid , .mp3','.wav')sys.exit(2)time1 = time.time()
print(f1)
mixer_init()
try:play_mid(f1)
except KeyboardInterrupt as ex:# if user hits Ctrl+C then exit# (works only in console mode)mixer.music.fadeout(1000)mixer.music.stop()raise SystemExit from ex
mixer.music.stop()
time2 = time.time()
print("run time: %.3f s" % (time2-time1))
運行 python play_mid.py output.wav