从标准输出获取 wav 缓冲区

问题描述 投票:0回答:1

我正在尝试获取下采样音频,以便我可以将其用于热词检测 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 将音频作为流输出到标准输出而不会出现错误吗?预先感谢!

javascript node.js ffmpeg
1个回答
0
投票

由于我使用“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);
    });
});
}
© www.soinside.com 2019 - 2024. All rights reserved.