【python】将wav文件转为c

前言

由于需要从wav中获取音源数据存到c文件中,尝试使用python解析。

参考文章

wav文件中数据需要注意大端小端:https://blog.csdn.net/u013008795/article/details/88945733

代码参考:https://blog.csdn.net/qq_38792457/article/details/106915614
注意有差异,参考文章最终存成str,我存成16进制显示的str

分析

在这里插入图片描述
wav的前44字节存储文件信息,可以参考我的另一篇文章:【wav】wav文件查看,这里介绍了如何查看wav文件的头。

从data开始就是我们的数据了。
PS:存疑,python的wave_read获取会忽略前4个字节,比如从C000B200开始。

我们最终需要将wav中的二进制数据存到h文件中,从bytes转为str(h中是字符串存储)

使用python的wave库可以读取到wav文件的二进制数据流(python3开始支持bytes)
获取到一个采样点数据是以b’\xee\x01’存储的,我们只需要ee和01,然后将其交换位置后存给str

使用format可以很方便的实现交换位置以及存为str,相当于c的printf。

代码

import wave

# just suit for 16bit if 32bit set 0-3
def bytesarray2str(temp):
    # print(temp,temp[0],temp[1])
    temp_str='0x{:02X}{:02X}'.format(temp[1],temp[0])
    # print(temp_str)
    return temp_str

def get_wav_file(path):

    print(path)

    wave_read = wave.open(path, "r")
    nchannels, bits, samplerate, nframes, comptype, compname = wave_read.getparams()

    print(nchannels, bits, samplerate, nframes, comptype, compname)

    print("channel    = ",nchannels)
    print("bits       = ",bits*8)   # bits is one byte
    print("samplerate = ",samplerate)
    print("nframes    = ",nframes)         # wave len

    # h file name
    h_name='c'+str(nchannels)+'_b'+str(bits*8)+'_s'+str(samplerate)
    h_path=h_name+'.h'
    print(h_path)

    max_list=nframes

    with open(h_path, 'w+') as outFile:
        outFile.write("#include <stdint.h>\n")
        outFile.write("int16_t "+h_name+"[] = {\n")

        for i in range(max_list):
            temp = wave_read.readframes(1)
            xx_str=bytesarray2str(temp)
            # print(xx_str)
            outFile.write(xx_str)
            outFile.write(',')
            # print('i=',i%4)
            if  i %8 == 7:
                # print('xxxx')
                outFile.write('\n')
        outFile.write('0')
        outFile.write('};') 

    outFile.close()

    wave_read.close()
    return

wav_path = "music.wav"
get_wav_file(wav_path)

结果

在这里插入图片描述
在这里插入图片描述
从C000开始。

存疑:前4字节忽略了,如果有了解的朋友可以一起探讨。

猜你喜欢

转载自blog.csdn.net/qq_38091632/article/details/125271888
今日推荐