[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