如何在python中播放wav文件?

nim*_*m4n 23 python audio pygame pyglet

我尝试使用pygame来播放这样的wav文件:

import pygame
pygame.init()

pygame.mixer.music.load("mysound.wav")
pygame.mixer.music.play()
pygame.event.wait()
Run Code Online (Sandbox Code Playgroud)

但它改变了声音,我不知道为什么!我看了这个链接解决方案,并不能解决我的播放波形文件的问题!

对于这个解决方案,我不知道应该导入什么?

s = Sound() 
s.read('sound.wav') 
s.play()
Run Code Online (Sandbox Code Playgroud)

对于这个解决方案/ 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()
Run Code Online (Sandbox Code Playgroud)

当我尝试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
Run Code Online (Sandbox Code Playgroud)

zha*_*gyu 35

你可以使用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()  
Run Code Online (Sandbox Code Playgroud)

  • 只有一个附加组件:将while数据!='':更改为while len(data)&gt; 0:`解决了一个while进入无限循环的问题。只有从pyaudio 0.2.9从python 3.4升级到3.5之后,才会出现此问题。来源:[PyAudio文档](https://people.csail.mit.edu/hubert/pyaudio/docs/) (2认同)

use*_*323 10

在 Windows 上为我工作: https: //pypi.org/project/playsound/

>>> from playsound import playsound
>>> playsound('/path/to/a/sound/file/you/want/to/play.wav')
Run Code Online (Sandbox Code Playgroud)

注意:这在 Windows 中存在一个错误,它不会关闭流。我在这里添加了一个修复 PR: https: //github.com/TaylorSMarks/playsound/pull/53/commits/53240d970aef483b38fc6d364a0ae0ad6f8bf9a0


小智 8

pygame更改音频的原因是混音器默认为22k采样率:

initialize the mixer module
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096): return None
Run Code Online (Sandbox Code Playgroud)

你的wav可能是8k.所以当pygame播放它时,它的播放速度大约是其两倍.所以在init中指定你的wav频率.

Pyglet在正确读取RIFF标题时遇到一些问题.如果你有一个非常基本的wav文件(只有一个16字节的fmt块)而fmt块中没有其他信息(比如'fact'数据),它就可以工作了.但它没有为块中的其他数据做准备,所以它实际上并没有遵守RIFF接口规范.