Created
June 6, 2019 10:28
-
-
Save alexey-detr/7f7bff437950cd65389a961dc48495aa to your computer and use it in GitHub Desktop.
Читаем заголовок WAV файла на Node.js из STDIN
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const inputStream = process.stdin; | |
function readHeader(stream) { | |
let buffer = stream.read(44); | |
const chunkId = buffer.slice(0, 4).toString(); | |
const chunkSize = buffer.readUInt32LE(4); | |
const format = buffer.slice(8, 12).toString(); | |
const subchunk1Id = buffer.slice(12, 16).toString(); | |
const subchunk1Size = buffer.readUInt32LE(16); | |
const audioFormat = buffer.readUInt16LE(20); | |
const numChannels = buffer.readUInt16LE(22); | |
const sampleRate = buffer.readUInt32LE(24); | |
const byteRate = buffer.readUInt32LE(28); | |
const blockAlign = buffer.readUInt16LE(32); | |
const bitsPerSample = buffer.readUInt16LE(34); | |
// Skip unknown chunks | |
let dataSubchunkId = buffer.slice(36, 40).toString(); | |
let dataSubchunkSize = buffer.readUInt32LE(40); | |
while (dataSubchunkId !== 'data') { | |
console.log('Skipping unknown subchunk', dataSubchunkId); | |
buffer = stream.read(dataSubchunkSize + 8); | |
dataSubchunkId = buffer.slice(dataSubchunkSize, dataSubchunkSize + 4).toString(); | |
dataSubchunkSize = buffer.readUInt32LE(dataSubchunkSize + 4); | |
} | |
return { | |
chunkId, | |
chunkSize, | |
format, | |
subchunk1Id, | |
subchunk1Size, | |
audioFormat, | |
numChannels, | |
sampleRate, | |
byteRate, | |
blockAlign, | |
bitsPerSample, | |
dataSubchunkId, | |
dataSubchunkSize, | |
}; | |
} | |
function validateHeader(header) { | |
if (header.chunkId !== 'RIFF') { | |
throw new Error('Unsupported format: Chunk ID must be "RIFF"'); | |
} | |
if (header.format !== 'WAVE') { | |
throw new Error('Unsupported format: Format must be "WAVE"'); | |
} | |
if (header.subchunk1Id !== 'fmt ') { | |
throw new Error('Unsupported format: First subchunk ID must be "fmt "'); | |
} | |
if (header.dataSubchunkId !== 'data') { | |
throw new Error('Unsupported format: Subchunk with ID "data" not found'); | |
} | |
} | |
inputStream.on('readable', () => { | |
const header = readHeader(inputStream); | |
console.log('Header', header); | |
try { | |
validateHeader(header); | |
} catch (error) { | |
console.error(error); | |
process.exit(1); | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment