Skip to content

Instantly share code, notes, and snippets.

@alexey-detr
Created June 6, 2019 10:28
Show Gist options
  • Save alexey-detr/7f7bff437950cd65389a961dc48495aa to your computer and use it in GitHub Desktop.
Save alexey-detr/7f7bff437950cd65389a961dc48495aa to your computer and use it in GitHub Desktop.
Читаем заголовок WAV файла на Node.js из STDIN
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