Я получаю блоб из базы данных ms access, которая содержит моно wav данные с инструмента. Это всего лишь 1 секунда. Он начинается с разных значений, поэтому я имею в виду, что это чистый wav Data
b'\\f_?\xb2\xca^??;]?\xa9(Z?\xf8\x87V?\x8e\x11S?PCP?\xcc\x06O?\xf1RN?a\x07M?\x83DK?\xa9hH?\x94\nE?\x9d.B?mb??\xf9\x05=?\xf5X;?\xeb|:?M\xc7:?Qg;?\xbd\x0c<?\x8c\x05=?\x85I>?v\xd2??/`B?\xfe\xafF?\xafFL?b3S?,\x8dZ?\xc1}`?\x16Le?\xef\xb2h?@#j?a\x02k?\xb3\xcck?D\xd2l?\xec\xaen?\x19\xccp?\x9e\xdfr?\x82Uu?\x81\x03x?tCz?\xa5E{?\xec\xecz?5\xcey?\x08\x82x?\x83\xd2v?\xec\xb3t?\x8f\x04r?\xce\x08n?\x8d3h?\x11@a?\x1e\xfbX?\x9b\x11P?\xfc}G?\x08\'
...
Я использовал пакеты wave
и soundfile
для создания файла wav, но это никогда не встречает оригинальный формат. Я мог бы экспортировать файл из оригинального программного обеспечения, поэтому он должен работать.
import wave
wav = wave.open(wavfile, 'rb')
print("filename :", wavfile)
print("channels :", wav.getnchannels())
print("sampwidth:", wav.getsampwidth())
print("framerate:", wav.getframerate())
print("nframes :", wav.getnframes())
Вывод:
filename : c:\DATEN\TS_org.wav
channels : 1
sampwidth: 2
framerate: 32768
nframes : 16384
Я установил эти параметры в новый файл и добавил BLOB :
def create_audiofile(blobin, saveto):
nchannels = 1
#ok to read in another analyser, but wrong sound sampwidth = 1
sampwidth = 2
framerate = 32768
nframes = 16384
audio = wave.open (saveto, 'wb')
audio.setnchannels (nchannels)
audio.setsampwidth (sampwidth)
audio.setframerate (framerate)
audio.setnframes (nframes)
audio.writeframes(blobin)
#also no success
#audio.writeframesraw(blobin)
Я проверил несколько веб-сайтов и ответы здесь в SO. хорошее описание здесь, но я никогда не получал рабочий wav-файл.
Первые 36 байт исходного файла выглядят так:
Bytenr :0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
integer:82 73 70 70 36 128 0 0 87 65 86 69 102 109 116 32 16 0 0 0 1 0 1 0 0 128 0 0 0 0 1 0 2 0 16 0
hexcode:0x52 0x49 0x46 0x46 0x24 0x80 0x0 0x0 0x57 0x41 0x56 0x45 0x66 0x6d 0x74 0x20 0x10 0x0 0x0 0x0 0x1 0x0 0x1 0x0 0x0 0x80 0x0 0x0 0x0 0x0 0x1 0x0 0x2 0x0 0x10 0x0
ASCII :R I F F $ W A V E f m t # # # # # #
Как могу ли я использовать эту информацию для создания нового файла wav?
Редактировать
Это забавный скрипт из @mivk как python скрипт для проверки конверсии:
import subprocess
infile =("e:\\data\\wav\\raw.pcm")
ffmpeg = "e:\\data\\wav\\ffmpeg.exe"
samples = [8000, 11025, 22050, 16000, 32000, 22050, 44100]
formats = ['alaw', 'f32be', 'f32le', 'f64be', 'f64le', 'mulaw', 's16be', 's16le', 's24be', 's24le', 's32be',
's32le', 's8', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8']
for ar in samples:
for f in formats:
outfile = infile[:-4] + "_%s_%s.wav"%(f, ar)
order = '%s -f %s -ar %d -ac 1 -i %s %s'%(ffmpeg, f, ar, infile, outfile)
subprocess.call(order)