[python] problém s modulem wave
jiri.zahradil na gmail.com
jiri.zahradil na gmail.com
Pátek Březen 31 13:26:43 CEST 2017
Koukám, že nikdo na nic nepřišel, odpovím si tedy sám :-)
Třeba se to někomu bude hodit:
wave modul zapisuje délku dat v bajtech a sám si ji iniciativně
zjišťuje pomocí
len(data) a to i při zápisu setnframes (moc tomu nerozumím proč tam
nezapíše číslo co mu předám). Nicménně pokud se předávají data jako
"unsigned char" a nikoliv jako signed short jak to dělám já (vzorky
jsou opravdu signed short) tak tam logicky zapíše správný počet
frames. Tj.
Je třeba ještě před wave.open přidat konverzi:
bytes = array.array("B")
bytes.fromstring(data.tostring())
data = bytes
JZ
On 16 Čec, 14:58, "jiri.zahra... na gmail.com" <jiri.zahra... na gmail.com>
wrote:
> Zdravím,
>
> mám problém s modulem wave. Mám PCM data v paměti a potřebuji je
> korektně uložit do .wav souboru. Vytvořil jsem si na to funkci pomocí
> modulu wave (je u Pythonu - 2.5, pod Windows). Bohužel, vytvořený
> soubor je zhruba správně velký, ovšem dat - PCM vzorků - je v něm jen
> půlka (= přehraje se jen půlka, zkoušel jsem různé programy). Pokud
> uložím jen PCM data pomocí open("soubor.pcm","wb").write(data) a pak
> data otevřu v editoru jako "raw" formát tak jsou tam všechna. Nevíte
> kde může být chyba?
>
> Funkce kterou používám:
>
> import wave
> def SavePCMasWAV(filename, data):
> """
> Function that takes a filename and PCM data in mono, 16bit, 16000 Hz
> format
> and saves them as standard .WAV file
> """
>
> if type(data) is type(list()):
> # need to transform "list" data to binary array format
> a = array.array("h") # short type
> a.extend(data)
> data = a
>
> w = wave.open(filename,"wb")
> w.setnchannels(1)
> w.setsampwidth(2)
> w.setframerate(16000)
> w.setnframes(len(data))
> w.writeframesraw(data)
> w.close()
Další informace o konferenci Python