问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用go语言存储pcm格式数据为wav

发布网友 发布时间:2024-10-01 16:25

我来回答

1个回答

热心网友 时间:2024-10-24 22:51

上次写了存储float类型的wav文件,其实存储PCM的相关数据相对操作更少,难度更小。首先,和存储flaot类型的数据类似,定义一个文件头结构体。

typewaveHeaderstruct{RIFFID[4]byte//内容为""RIFFDwSizeuint32//最后填写,WAVE格式音频的大小FccType[4]byte//内容为"WAVE""FmtID[4]byte//内容为"fmt"FmtDwSizeuint32//内容为WAVE_FMT占的字节数,为16WFormatTaguint16//如果为PCM,值为1WChannelsuint16//通道数,单通道=1,双通道=2DwSamplesPerSecuint32//采样率DwAvgBytesPerSecuint32/*==dwSamplesPerSec*wChannels*uiBitsPerSample/8*/WBlockAlignuint16//==wChannels*uiBitsPerSample/8UiBitsPerSampleuint16//每个采样点的bit数,8bits=8,16bits=16DataID[4]byte//内容为dataDataDwSizeuint32//data的大小}

写入文件分两部分,分别是创建文件头和写入文件数据。下面是我们创建文件并将部分PCM数据写入文件的过程。

funccreateNewWave(urlstring,input[]byte,channelsint,bits_per_sampleint,sample_rateint){inputContext:=inputf,err:=os.Create(url)iferr!=nil{fmt.Println(err.Error())}deferf.Close()inputLen:=len(inputContext)header:=createNewHeader(channels,bits_per_sample,sample_rate)headerPointer:=&headerheaderPointer.DataDwSize+=uint32(inputLen)headerPointer.DwSize+=uint32(inputLen)headerBytes:=*(*[]byte)(unsafe.Pointer(&headerPointer))//headerBytes:=[]byte(&header)f.Write(headerBytes[0:44])fmt.Println(headerBytes[0:44])//f.Seek(0,2)f.Write(inputContext)}

其中input为需要写入的PCM数据,url为存储路径。channels为声道数,bits_per_sample为采样点大小,sample_rate为采样率。

PCM尾添加至已存在的wav文件。

funcp2w(input[]byte,outputstring){inputContent:=inputinputSize:=len(inputContent)fout,err:=os.OpenFile(output,os.O_RDWR,os.ModePerm)iferr!=nil{log.Fatal(err.Error())}deferfout.Close()buff:=make([]byte,44)size,err:=fout.Read(buff)ifsize!=44{fmt.Println("文件损坏")}varheader*waveHeader=*(**waveHeader)(unsafe.Pointer(&buff))header.DataDwSize+=uint32(inputSize)header.DwSize+=uint32(inputSize)resHeader:=headerheaderBytes:=*(*[]byte)(unsafe.Pointer(&resHeader))fout.Seek(0,0)fout.Write(headerBytes[0:44])fout.Seek(0,2)fout.Write(inputContent)}

里面涉及的知识点和上一篇文章大同小异。如果有感兴趣的同学可以留言一起讨论。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 普洱茶如何辨别真假,普洱茶的辨别方法 Go 结构体(补充):计算结构体大小 尘肺病洗肺方法 尘肺病洗肺能治愈吗 苹果手机为什么总被微信语音打断? 怎样用1分钟时间,学会思维导图? 【教程】Mindmaster思维导图技巧:无纸化神速记笔记法 租赁合同印花税税率是多少? 苹果查不到激活日期 查找激活日期 请问交银稳健净值 ...5年,500-800的,华夏回报二,交银稳健,嘉实300这三个那两个比较好... ...需连手机热点上网。可以连上旧手机的热点。新手机的显示不出来?_百 ... 日料基本常识关于日料基本常识 怎么安装炮钉枪? 旧手机连接新手机的热点 炮钉枪常见故障有哪几种? 玻璃体切除后有什么影响_百度拇指医生 眼睛玻璃体切除的后果 淘宝上卖家怎样、何时才能收到买家的汇款?若买家收到货不承认怎么解决... 我是淘宝卖家,买家银行汇款,怎么给她发货? 普尔茶应该如何区分真假? 怎样才能通过电视盒子看到电视台直播? iptv盒子怎么看电视直播台? 如何知道自己的固态硬盘支持哪个接口类型? 庆祝“八一”建军节文艺晚会主持词汇编 5分钟教会你怎么区分M.2固态硬盘接口和协议 华约组织有哪 ...战场S2赛季奖励怎么领取 S2赛季奖励详情-新手攻略-安族网_百度... ...刺激战场补给箱越来越贵 补给箱价格详解-新手攻略-安族网_百度... 绝地求生刺激战场超短裤怎么得 超短裤获取方法详解-高手进阶-安族网... 绝地求生刺激战场师徒任务怎么做 师徒任务攻略-高手进阶-安族网_百度... ...补给箱在哪买 尖兵补给箱获取方法详解-新手攻略-安族网 三星手机s5830中txt文件里的文字怎么复制出来? 绝地求生刺激战场刺激盛宴宝箱怎么得 刺激盛宴宝箱获取攻略-高手进阶... 电影彩蛋是干嘛的 微信捆绑有什么卡 知道彩蛋是干什么用的? 微信上可以绑什么卡 怎么在打电话时也能上网 微信绑定卡都有什么