我正在尝试获取下采样音频,以便我可以将其用于热词检测 API。在我当前使用的解决方案中,音频已正确转换,并且 API 能够识别音频文件的内容。但是,我经常被迫编写临时输出文件。我曾多次尝试在 ffmpeg 中使用“pipe:1”将转换后的音频作为流输出到标准输出,但它总是给我错误。
function downsampleAudio(pcmBuffer) {
return new Promise((resolve, reject) => {
const inputStream = new PassThrough();
inputStream.end(pcmBuffer);
let filePath = path.join(__dirname, "output.wav")
const ffmpeg = spawn("ffmpeg", [
"-f", "s16le",
"-ar", "48000",
"-ac", "1",
"-i", "pipe:0",
"-ar", "16000",
"-ac", "1",
"-c:a", "pcm_s16le",
filePath
]);
ffmpeg.stdin.on('error', (error) => {
reject(new Error('Errore nello stream stdin di ffmpeg: ' + error.message));
});
ffmpeg.on('close', (code) => {
if (code !== 0) {
reject(new Error(`Il processo ffmpeg è terminato con codice ${code}`));
} else {
console.log('Conversione completata con successo');
const waveBuffer = fs.readFileSync(filePath);
fs.unlinkSync(filePath);
resolve(waveBuffer)
}
});
inputStream.pipe(ffmpeg.stdin);
});
}
任何人都可以帮我弄清楚如何正确使用 ffmpeg 将音频作为流输出到标准输出而不会出现错误吗?预先感谢!
由于我使用“FilePath”作为输出,ffmpeg 自动将输出格式设置为 WAV。当我尝试将 stdout 设置为输出时,ffmpeg 无法再识别输出格式,因为我忘记指定它(我很愚蠢,我所在的地方是凌晨 5 点)。无论如何,指定 WAV 作为格式是有效的。
function downsampleAudio(pcmBuffer) {
return new Promise((resolve, reject) => {
const inputStream = new PassThrough();
let chunks = [];
inputStream.end(pcmBuffer);
const ffmpeg = spawn("ffmpeg", [
"-f", "s16le",
"-ar", "48000",
"-ac", "1",
"-i", "pipe:0",
"-f", "wav",
"-ar", "16000",
"-ac", "1",
"-c:a", "pcm_s16le",
"pipe:1"
]);
ffmpeg.stdin.on('error', (error) => {
reject(new Error('Errore nello stream stdin di ffmpeg: ' + error.message));
});
ffmpeg.on('close', (code) => {
if (code !== 0) {
reject(new Error(`Il processo ffmpeg è terminato con codice ${code}`));
} else {
resolve(Buffer.concat(chunks));
}
});
inputStream.pipe(ffmpeg.stdin);
ffmpeg.stdout.on('data', (chunk) => {
chunks.push(chunk);
});
});
}