二进制字符串到wav文件

时间:2015-10-20 19:36:40

标签: python python-2.7

我正在尝试为我的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,单声道

2 个答案:

答案 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文件状况良好。