栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【python】将wav文件转为c

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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’xeex01’存储的,我们只需要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 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字节忽略了,如果有了解的朋友可以一起探讨。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971356.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号