2017-02-17 20 views
0

На стороне клиента я отправляю файл blob audio (wav). На стороне сервера, я пытаюсь преобразовать blob-файл в аудио-wav-файл. Я сделал следующее:Создайте wav-файл из blob audio django

blob = request.FILES['file'] 
name = "TEST.wav" 
audio = wave.open(name, 'wb') 
audio.setnchannels(1) 
audio.writeframes(blob.read()) 

Я думал, что преобразование блобо будет похоже на преобразование двоичного объект изображения в файл в формате JPEG, но был очень неправильно в этом предположении. Это не сработало; Я получаю сообщение об ошибке - «Ошибка: ширина образца не указана». Затем я использовал setsampwidth() и помещался в произвольное число от 1 до 4 (после просмотра исходного файла wave.py ... Я не знаю, почему байты должны быть между 1 и 4). После этого возникает другая ошибка - «Ошибка: частота дискретизации не указана». Как указать частоту дискретизации?

Что делают методы setnchannels(), setsampwidth()? Есть ли «простой» способ генерировать wav-файл из blob?

+0

это связано с Джанго? –

+0

Да. Я использую django 1.9 для преобразования аудиокабеля в wav-файл. – alienboy

ответ

0

Раньше я никогда не сделать это раньше .. но, в моем тесте этот скрипт ниже работает хорошо для меня .. (Но аудиовыход не совпадает, как и исходный файл).

>>> nchannels = 2 
>>> sampwidth = 2 
>>> framerate = 8000 
>>> nframes = 100 
>>> 
>>> import wave 
>>> 
>>> name = 'output.wav' 
>>> audio = wave.open(name, 'wb') 
>>> audio.setnchannels(nchannels) 
>>> audio.setsampwidth(sampwidth) 
>>> audio.setframerate(framerate) 
>>> audio.setnframes(nframes) 
>>> 
>>> blob = open("original.wav").read() # such as `blob.read()` 
>>> audio.writeframes(blob) 
>>> 

Я нашел этот метод на https://stackoverflow.com/a/3637480/6396981

Наконец, путем изменения значения nchannels и sampwidth с 1. и я получил звук, который был таким же с оригинальным файлом.

nchannels = 1 
sampwidth = 1 
framerate = 8000 
nframes = 1 

Tested under Python2, and got an error UnicodeDecodeError: 'utf-8' codec can't decode byte 0x95 in position 4: invalid start byte on Python3.