这是简短的回答:

ffmpeg -i song.mp3 -acodec pcm_u8 -ar 22050 song.wav

TL; DR:我假设你想播放一个没有前端的音频文件.

player = Sound()
player.read('song.wav')
player.play()

我知道我在两个流中使用了这个,我认为mp3文件,不记得如何或在哪个项目中,可能需要查看这个.认为这是咕噜咕噜……无论如何……

如果你完全没有使用像pyglet这样的前端代码(这是我所听到的),你需要一些选项和一些代码来尽可能地工作.

import pyglet
from pyglet.gl import *
pyglet.options['audio'] = ('openal', 'directsound', 'silent')
music = pyglet.resource.media('music.mp3')
music.play()
pyglet.app.run()

依赖关系:

* OpenAL(用于跨平台兼容性)

你的线程问题是Pyglet是一个OpenGL库.根本不需要对线程感兴趣.除非你让Pyglet获取你需要的数据.

你也很可能遇到“pyglet阻塞我的代码”的问题(所有的图形库都有.所以这里有一个解决方法)

import pyglet, os
from time import sleep
from threading import *
from pyglet.gl import *
pyglet.options['audio'] = ('openal', 'directsound', 'silent')
class worker(Thread):
def __init__(self):
Thread.__init__(self)
self.audio_frames = []
self.run()
def add_frame(self, filename):
self.audio_frames.append(filename)
def get_frame(self):
if len(self.audio_frames) > 0:
return self.audio_frames.pop(0)
return None
def run(self):
while 1:
for root, folders, files in os.walk('./audio_files/'):
for f in file:
self.add_frame(f)
sleep(1)
class AudioWindow(pyglet.window.Window):
def __init__(self):
self.audio_worker = worker()
def render(self):
frame = self.audio_frames.get_frame()
if frame:
music = pyglet.resource.media('music.mp3')
music.play()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()

这完全没问题,因为你不是想从另一个线程更新图形.

相反,您正在获取图形术语的数据.

但是,您可以从worker()更新AudioWindow()中的变量/ list / array / w / e而不会出现任何问题,您唯一不能做的就是从图形类外部调用任何图形函数.

没有前端的有趣方法:

然而,最理想的方式是老去学校,并使用pyaudio手动拨弄音响框架.这样,只要正确解码数据,您就可以读取任何音频文件. I use this one(轻轻一点,因为它不骄傲)我自己传输音频:

import pyaudio
import wave
CHUNK_SIZE = 1024
FORMAT = pyaudio.paInt16
RATE = 44100
p = pyaudio.PyAudio()
output = p.open(format=FORMAT,
channels=1,
rate=RATE,
output=True) # frames_per_buffer=CHUNK_SIZE
with open('audio.wav', 'rb') as fh:
while fh.tell() != FILE_SIZE: # get the file-size from the os module
AUDIO_FRAME = fh.read(CHUNK_SIZE)
output.write(AUDIO_FRAME)

这应该产生接近音频的东西:)

Wav在例子等中如此过度的原因是因为它基本上是一个未编码的声音流,而不是以任何方式编码.然而,mp3是一种高度压缩的音频格式,格式是这里的关键词.您需要某种方式来读取mp3数据并将其从紧凑状态转换为可以挤入扬声器的数据流.

我不是音频专家,但这是一个粗略的解释,音频是如何从一个摆弄它的人那里得到的,并让它发挥作用.

最后说明:

如果您希望使用Pyglet播放压缩音频文件,则可以使用AVbin.用于压缩文件的库.