我尝试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
5条答案
按热度按时间lyr7nygr1#
你可以使用PyAudio。在我的Linux上的一个例子,它工作:
ghhkc1vu2#
在Windows上运行:https://pypi.org/project/playsound/
注意:这在Windows中有一个错误,它不会关闭流。我在这里添加了一个修复的PR:https://github.com/TaylorSMarks/playsound/pull/53/commits/53240d970aef483b38fc6d364a0ae0ad6f8bf9a0
1wnzp6jl3#
pygame更改音频的原因是mixer默认为22k采样率:
你的wav可能是8k。所以当pygame玩它的时候,它的速度大约是它的两倍。所以在init中指定你的wav频率。
Pyglet在正确阅读RIFF头文件时有一些问题。如果你有一个非常基本的wav文件(只有一个16字节的fmt块),在fmt块中没有其他信息(比如“事实”数据),它就可以工作。但是它没有在块中提供额外的数据,所以它实际上没有遵守RIFF接口规范。
ljo96ir54#
PyGame有两个不同的模块用于播放声音和音乐,pygame.mixer模块和pygame.mixer.music模块。此模块包含用于加载Sound对象和控制播放的类。在文档中解释了差异:
音乐播放和常规声音播放之间的区别在于音乐是流式播放的,并且从未实际上一次全部加载。混音器系统一次只支持单个音乐流。
如果你想播放一个 wav 文件,你必须初始化模块并从文件中创建一个
pygame.mixer.Sound()
对象。调用play()
开始播放文件。最后,您必须等待文件播放。使用
get_length()
获取声音的长度(以秒为单位)并等待声音结束:(pygame.time.wait()
的参数以毫秒为单位)或者,您可以使用
pygame.mixer.get_busy
来测试是否正在混合声音。循环连续查询搅拌机状态:km0tfn4u5#
Windows
winsound
如果你是Windows用户,最简单的方法就是使用winsound。你甚至不需要安装它。
不推荐,功能太少
mp3play
如果您正在寻找更高级的功能,您可以尝试mp3play。
不幸的是,mp3play仅在Python2和Windows中可用。
如果你想在其他平台上使用它,请使用playsound,尽管它的功能很差。如果你想在Python 3中使用它,我会给你修改后的版本,它可以在Python 3上使用。(在答案的底部)
还有,mp3play在播放wave文件方面真的很不错,它给了你更多的选择。
跨平台
播放声音
Playsound非常容易使用,但不建议使用,因为您无法暂停或获取音乐的某些信息,并且经常出现错误。除非其他方法根本不起作用,否则您可以尝试使用此方法。
pygame
我正在使用这段代码,经过测试,它在Ubuntu 22.04上工作。如果它在你的机器上不起作用,考虑更新你的pygame库。
pyglet
这在Windows上工作,但在我的Ubuntu上不工作,所以我什么也做不了。
总结
看起来你使用的是Linux,所以
playsound
可能是你的选择。我的代码可能无法通过使用pygame
和pyglet
来解决你的问题,因为我总是使用Windows。如果没有解决方案在你的机器上工作,我建议你在Windows上运行程序。对于看到我答案的其他用户,我在许多库中做了很多测试,所以如果你使用Windows,你可以尝试
mp3play
,它可以播放mp3和wave文件,mp3play是最pythonic,简单,轻量级和功能的库。python3中的mp3play
只需复制下面的代码,并在工作目录中创建一个名为www.example.com的文件,然后粘贴内容。mp3play.py in your working directory and paste the content.