我正在尝试为我的webapp编写wav上传功能。前端部分看起来效果很好。问题是我的后端(python)。当它收到二进制数据时,我不确定如何将其写入文件。我尝试使用基本的写功能,声音已经腐败......听起来像是" gobbly-gook"。是否有一种在Python中编写wav文件的特殊方法?
这是我的后端......不是很多。
form = cgi.FieldStorage()
fileData = str(form.getvalue('data'))
with open("audio", 'w') as file:
file.write(fileData)
我甚至试过......
with open("audio", 'wb') as file:
file.write(fileData)
我正在使用aplay播放声音,我注意到所有属性都搞砸了。
在: 签名16位Little Endian,速率44100 Hz,立体声
上传后: 无符号8位,速率8000 Hz,单声道
答案 0 :(得分:2)
也许wave module可能会有所帮助?
import wave
import struct
import numpy as np
rate = 44100
def sine_samples(freq, dur):
# Get (sample rate * duration) samples on X axis (between freq
# occilations of 2pi)
X = (2*np.pi*freq/rate) * np.arange(rate*dur)
# Get sine values for these X axis samples (as integers)
S = (32767*np.sin(X)).astype(int)
# Pack integers as signed "short" integers (-32767 to 32767)
as_packed_bytes = (map(lambda v:struct.pack('h',v), S))
return as_packed_bytes
def output_wave(path, frames):
# Python 3.X allows the use of the with statement
# with wave.open(path,'w') as output:
# # Set parameters for output WAV file
# output.setparams((2,2,rate,0,'NONE','not compressed'))
# output.writeframes(frames)
output = wave.open(path,'w')
output.setparams((2,2,rate,0,'NONE','not compressed'))
output.writeframes(frames)
output.close()
def output_sound(path, freq, dur):
# join the packed bytes into a single bytes frame
frames = b''.join(sine_samples(freq,dur))
# output frames to file
output_wave(path, frames)
output_sound('sine440.wav', 440, 2)
修改强>
我认为在您的情况下,您可能只需要:
packedData = map(lambda v:struct.pack('h',v), fileData)
frames = b''.join(packedData)
output_wave('example.wav', frames)
在这种情况下,您只需要知道采样率。检查波形模块以获取有关其他输出文件参数的信息(即setparams
方法的参数)。
答案 1 :(得分:0)
只要数据没有损坏,我粘贴的代码就会写一个wav文件。没有必要使用波形模块。
with open("audio", 'w') as file:
file.write(fileData)
我最初在Javascript中读取文件为FileAPI.readAsBinaryString。我将其更改为FileAPI.readAsDataURL,然后使用base64.decode()在python中对其进行解码。一旦我解码它,我就能将数据写入文件。 .wav文件状况良好。