我尝试使用pygame来播放这样的wav文件:
import pygame
pygame.init()
pygame.mixer.music.load("mysound.wav")
pygame.mixer.music.play()
pygame.event.wait()
但它会改变声音,我不知道为什么! 我阅读this link解决方案并无法解决播放wave文件的问题!
对于这个解决方案,我不知道应该导入什么?
s = Sound()
s.read('sound.wav')
s.play()
对于这个解决方案/ dev / dsp在新版本的linux中不存在:
from wave import open as waveOpen
from ossaudiodev import open as ossOpen
s = waveOpen('tada.wav','rb')
(nc,sw,fr,nf,comptype, compname) = s.getparams( )
dsp = ossOpen('/dev/dsp','w')
try:
from ossaudiodev import AFMT_S16_NE
except ImportError:
if byteorder == "little":
AFMT_S16_NE = ossaudiodev.AFMT_S16_LE
else:
AFMT_S16_NE = ossaudiodev.AFMT_S16_BE
dsp.setparameters(AFMT_S16_NE, nc, fr)
data = s.readframes(nf)
s.close()
dsp.write(data)
dsp.close()
当我尝试pyglet它给我这个错误:
import pyglet
music = pyglet.resource.media('mysound.wav')
music.play()
pyglet.app.run()
--------------------------
nima@ca005 Desktop]$ python play.py
Traceback (most recent call last):
File "play.py", line 4, in <module>
music = pyglet.resource.media('mysound.wav')
File "/usr/lib/python2.7/site-packages/pyglet/resource.py", line 587, in media
return media.load(path, streaming=streaming)
File "/usr/lib/python2.7/site-packages/pyglet/media/__init__.py", line 1386, in load
source = _source_class(filename, file)
File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 194, in __init__
format = wave_form.get_format_chunk()
File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 174, in get_format_chunk
for chunk in self.get_chunks():
File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 110, in get_chunks
chunk = cls(self.file, name, length, offset)
File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 155, in __init__
raise RIFFFormatException('Size of format chunk is incorrect.')
pyglet.media.riff.RIFFFormatException: Size of format chunk is incorrect.
AL lib: ReleaseALC: 1 device not closed
答案 0 :(得分:31)
您可以使用PyAudio。我的Linux上有一个例子:
#!usr/bin/env python
#coding=utf-8
import pyaudio
import wave
#define stream chunk
chunk = 1024
#open a wav format music
f = wave.open(r"/usr/share/sounds/alsa/Rear_Center.wav","rb")
#instantiate PyAudio
p = pyaudio.PyAudio()
#open stream
stream = p.open(format = p.get_format_from_width(f.getsampwidth()),
channels = f.getnchannels(),
rate = f.getframerate(),
output = True)
#read data
data = f.readframes(chunk)
#play stream
while data:
stream.write(data)
data = f.readframes(chunk)
#stop stream
stream.stop_stream()
stream.close()
#close PyAudio
p.terminate()
答案 1 :(得分:7)
pygame更改音频的原因是混音器默认为22k采样率:
initialize the mixer module
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096): return None
你的wav可能是8k。所以当pygame播放它时,它的播放速度大约是其两倍。所以在init中指定你的wav频率。
Pyglet在正确读取RIFF标题时遇到一些问题。如果你有一个非常基本的wav文件(只有一个16字节的fmt块)而fmt块中没有其他信息(比如'fact'数据),它就可以工作了。但它没有为块中的其他数据做准备,所以它实际上并没有遵守RIFF接口规范。
答案 2 :(得分:3)
在Windows上为我工作: https://pypi.org/project/playsound/
>>> from playsound import playsound
>>> playsound('/path/to/a/sound/file/you/want/to/play.wav')
注意:这在Windows中有一个错误,无法关闭流。 我在此处添加了PR进行修复: https://github.com/TaylorSMarks/playsound/pull/53/commits/53240d970aef483b38fc6d364a0ae0ad6f8bf9a0
答案 3 :(得分:0)
PyGame有2个用于播放声音和音乐的模块,分别是pygame.mixer模块和pygame.mixer.music模块。该模块包含用于加载声音对象和控制播放的类。差异在文档中说明:
音乐播放和常规声音播放之间的区别在于,音乐是流式传输的,永远不会一次全部加载。混音器系统一次仅支持一个音乐流。
如果要播放单个 wav 文件,则必须初始化模块并从该文件中创建一个pygame.mixer.Sound()
对象。调用play()
开始播放文件。最后,您必须等待文件播放。
使用get_length()
来获取声音的长度(以秒为单位),然后等待声音结束:
(pygame.time.wait()
的参数以毫秒为单位)
import pygame
pygame.mixer.init()
my_sound = pygame.mixer.Sound('mysound.wav')
my_sound.play()
pygame.time.wait(int(my_sound.get_length() * 1000))
或者,您可以使用pygame.mixer.get_busy
测试声音是否混合。连续循环查询调音台的状态:
import pygame
pygame.init()
pygame.mixer.init()
my_sound = pygame.mixer.Sound('mysound.wav')
my_sound.play()
while pygame.mixer.get_busy():
pygame.time.delay(10)
pygame.event.poll()