Я надеялся, что смогу найти способ получить данные амплитуды из mp3 в python. Подобно смелости, но я не хочу визуального, простой массив значений будет делать. Я хочу, чтобы мой код реагировал на звук в определенные моменты, когда он становился громче. Я использую pygame для воспроизведения звука и пытаюсь преобразовать его в sndarray, но это только дало мне первые 0.00018 секунды. В любом случае, я могу получить весь mp3? Это не должно быть в режиме реального времени, так как я хотел бы быть в состоянии реагировать раньше времени в любом случае и будет отслеживать мою позицию, используя pygame.Python - Получить форму волны/амплитуду mp3
Я создаю this cloud, используя вместо этого малиновый pi для других функций. У меня уже есть работа по освещению и нужно, чтобы она реагировала на молнию, огни, но это не вариант. Любая помощь будет принята с благодарностью
Редактировать: Так вот что я до сих пор благодаря кодер-дону. Он работает, но я зависаю в цикле while. Я не знаю почему. Mp3, который я использую, довольно длинный, может быть, проблема?
import os, sys
from gi.repository import Gst, GObject
Gst.init()
GObject.threads_init()
def get_peaks(filename):
global do_run
pipeline_txt = (
'filesrc location="%s" ! decodebin ! audioconvert ! '
'audio/x-raw,channels=1,rate=22050,endianness=1234,'
'width=32,depth=32,signed=(bool)TRUE !'
'level name=level interval=1000000000 !'
'fakesink' % filename)
pipeline = Gst.parse_launch(pipeline_txt)
level = pipeline.get_by_name('level')
bus = pipeline.get_bus()
bus.add_signal_watch()
peaks = []
do_run = True
def show_peak(bus, message):
global do_run
if message.type == Gst.MESSAGE_EOS:
pipeline.set_state(Gst.State.NULL)
do_run = False
return
# filter only on level messages
if message.src is not level or \
not message.structure.has_key('peak'):
return
peaks.append(message.structure['peak'][0])
# connect the callback
bus.connect('message', show_peak)
# run the pipeline until we got eos
pipeline.set_state(Gst.State.PLAYING)
ctx = GObject.MainContext()
while ctx and do_run:
ctx.iteration()
return peaks
def normalize(peaks):
_min = min(peaks)
print(_min)
_max = max(peaks)
print(_max)
d = _max - _min
return [(x - _min)/d for x in peaks]
if __name__ == '__main__':
filename = os.path.realpath(sys.argv[1])
peaks = get_peaks(filename)
print('Sample is %d seconds' % len(peaks))
print('Minimum is', min(peaks))
print('Maximum is', max(peaks))
peaks = normalize(peaks)
print(peaks)
Я думаю, что это было уже задавала - http://stackoverflow.com/questions/9344888/getting-max-amplitude-for-an-audio-file-per-second?lq=1 HTTP: //stackoverflow.com/questions/10304495/python-getting-the-amplitudes-of-a-sound-file –