12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- // import { Base64 } from 'js-base64'
- function pcmtoWav(pcmsrt, sampleRate, numChannels, bitsPerSample) {
- //参数->(base64编码的pcm流,采样频率,声道数,采样位数)
- let header = {
- // OFFS SIZE NOTES
- chunkId: [0x52, 0x49, 0x46, 0x46], // 0 4 "RIFF" = 0x52494646
- chunkSize: 0, // 4 4 36+SubChunk2Size = 4+(8+SubChunk1Size)+(8+SubChunk2Size)
- format: [0x57, 0x41, 0x56, 0x45], // 8 4 "WAVE" = 0x57415645
- subChunk1Id: [0x66, 0x6d, 0x74, 0x20], // 12 4 "fmt " = 0x666d7420
- subChunk1Size: 16, // 16 4 16 for PCM
- audioFormat: 1, // 20 2 PCM = 1
- numChannels: numChannels || 1, // 22 2 Mono = 1, Stereo = 2...
- sampleRate: sampleRate || 16000, // 24 4 8000, 44100...
- byteRate: 0, // 28 4 SampleRate*NumChannels*BitsPerSample/8
- blockAlign: 0, // 32 2 NumChannels*BitsPerSample/8
- bitsPerSample: bitsPerSample || 16, // 34 2 8 bits = 8, 16 bits = 16
- subChunk2Id: [0x64, 0x61, 0x74, 0x61], // 36 4 "data" = 0x64617461
- subChunk2Size: 0, // 40 4 data size = NumSamples*NumChannels*BitsPerSample/8
- }
- function u32ToArray(i) {
- return [i & 0xff, (i >> 8) & 0xff, (i >> 16) & 0xff, (i >> 24) & 0xff]
- }
- function u16ToArray(i) {
- return [i & 0xff, (i >> 8) & 0xff]
- }
- let pcm = Base64.toUint8Array(pcmsrt)
- header.blockAlign = (header.numChannels * header.bitsPerSample) >> 3
- header.byteRate = header.blockAlign * header.sampleRate
- header.subChunk2Size = pcm.length * (header.bitsPerSample >> 3)
- header.chunkSize = 36 + header.subChunk2Size
- let wavHeader = header.chunkId.concat(
- u32ToArray(header.chunkSize),
- header.format,
- header.subChunk1Id,
- u32ToArray(header.subChunk1Size),
- u16ToArray(header.audioFormat),
- u16ToArray(header.numChannels),
- u32ToArray(header.sampleRate),
- u32ToArray(header.byteRate),
- u16ToArray(header.blockAlign),
- u16ToArray(header.bitsPerSample),
- header.subChunk2Id,
- u32ToArray(header.subChunk2Size)
- )
- let wavHeaderUnit8 = new Uint8Array(wavHeader)
- let mergedArray = new Uint8Array(wavHeaderUnit8.length + pcm.length)
- mergedArray.set(wavHeaderUnit8)
- mergedArray.set(pcm, wavHeaderUnit8.length)
- let blob = new Blob([mergedArray], { type: 'audio/wav' })
- let blobUrl = window.URL.createObjectURL(blob)
- return blobUrl
- }
|