如何在python中播放wav文件?

时间:2021-01-16 19:44:40

I tried pygame for playing wav file like this:

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

import pygame
pygame.init()

pygame.mixer.music.load("mysound.wav")
pygame.mixer.music.play()
pygame.event.wait()

but It change the voice and I don't know why! I read this link solutions and can't solve my problem with playing wave file!

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

for this solution I dont know what should I import?

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

s = Sound() 
s.read('sound.wav') 
s.play()

and for this solution /dev/dsp dosen't exist in new version of linux :

对于这个解决方案/ 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()

and when I tried pyglet It give me this error:

当我尝试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

2 个解决方案

#1


24  

You can use PyAudio. An example here on my Linux it works:

你可以使用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()  

#2


7  

The reason pygame changes your audio is mixer defaults to a 22k sample rate:

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

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

Your wav is probably 8k. So when pygame plays it, it plays roughly twice as fast. So specify your wav frequency in the init.

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

Pyglet has some problems correctly reading RIFF headers. If you have a very basic wav file (with exactly a 16 byte fmt block) with no other information in the fmt chunk (like 'fact' data), it works. But it makes no provision for additional data in the chunks, so it's really not adhering to the RIFF interface specification.

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

#1


24  

You can use PyAudio. An example here on my Linux it works:

你可以使用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()  

#2


7  

The reason pygame changes your audio is mixer defaults to a 22k sample rate:

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

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

Your wav is probably 8k. So when pygame plays it, it plays roughly twice as fast. So specify your wav frequency in the init.

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

Pyglet has some problems correctly reading RIFF headers. If you have a very basic wav file (with exactly a 16 byte fmt block) with no other information in the fmt chunk (like 'fact' data), it works. But it makes no provision for additional data in the chunks, so it's really not adhering to the RIFF interface specification.

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