我想通过调整电位器来调节正在播放的mp3文件的音量。我使用python脚本通过Arduino板串行读取电位计信号。在pydub
库的帮助下,我可以读取文件,但不能在播放时调节文件的音量。这是我在长时间搜索后做的代码,我只指定了Pydub部分的一部分。作为你的信息,我使用vlc媒体播放器来改变音量。
>>> from pydub import AudioSegment
>>> song = AudioSegment.from_wav("C:\Users\RAJU\Desktop\En_Iniya_Ponnilave.wav")
当文件正在播放时,我无法调整该值。请谁来解释一下怎么做。
发布于 2014-02-14 01:16:31
首先,你需要将你的音频信号解码成原始音频,并将你的信号分成X帧,你可以操纵你的音频,在每一帧你都可以改变音量、音高或速度,等等!
要改变音量,你只需要将原始音频矢量乘以一个因子(这可以是电位计的数据信号)。
如果你的向量是短整型或者浮点型,那么这个因子可能会有所不同!
在python中从wav文件中获取原始音频数据的一种方法是使用wave
库。
import wave
spf = wave.open('wavfile.wav','r')
#Extract Raw Audio from Wav File
signal = spf.readframes(-1)
decoded = numpy.fromstring(signal, 'Float32');
现在您可以将解码后的向量乘以一个因子,例如,如果您希望增加10dB,则需要在python 10**(10/20) = 3.1623
中计算10^(DbValue/20)
newsignal = decoded * 3.1623;
现在你需要再次编码矢量来播放新的帧音频,你可以使用"from struct import pack
“和pyaudio
来做这件事!
stream = pyaud.open(
format = pyaudio.paFloat32,
channels = 1,
rate = 44100,
output = True,
input = True)
EncodeAgain = pack("%df"%(len(newsignal)), *list(newsignal))
最后播放你的帧音频,请注意,你将在每一帧都这样做,并在一个循环中播放它,这个过程太快了,并且延迟可能是不可察觉的!
stream.write(EncodeAgain)
PS:这个例子是针对浮点格式的!
发布于 2014-02-17 20:36:35
Ederwander,正如你所说的,我有treid编码,但当打包数据时,我得到的完全是零。所以它不是流媒体。我知道在转换格式数据时可能会出现问题,types.This就是我写的代码。请看一看,并说出建议
import sys
import serial
import time
import os
from pydub import AudioSegment
import wave
from struct import pack
import numpy
import pyaudio
CHUNK = 1024
wf = wave.open('C:\Users\RAJU\Desktop\En_Iniya_Ponnilave.wav', 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True)
# read data
data_read = wf.readframes(CHUNK)
decoded = numpy.fromstring(data_read, 'int32', sep = '');
data = decoded*3.123
while(1):
EncodeAgain = struct.pack(h,data)
stream.write(EncodeAgain)
https://stackoverflow.com/questions/21753764
复制相似问题