python播放mp3文件_python-3.x – 使用PyAudio播放.mp3文件

这是简短的回答:

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.用于压缩文件的库.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值