首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并两个或多个音频流,并将其写入

合并两个或多个音频流,并将其写入
EN

Stack Overflow用户
提问于 2021-09-23 11:50:59
回答 1查看 108关注 0票数 0

首先,我不需要将它们连接在一起。我需要将它们同时写入到同一个文件中。详细信息:我正在尝试录制语音,它可以工作,但当有超过1个人在说话时,输出就会损坏(因为我不知道如何合并opus数据,也不能使用web-audio-api)。

下面是我的代码:

AudioStream类:

代码语言:javascript
复制
const stream = require('stream');

function AudioStream(options) { 
    stream.Readable.call(this, options);
}

AudioStream.prototype = Object.create(stream.Readable.prototype);
AudioStream.prototype.constructor = stream.Readable;
AudioStream.prototype._read = function() {};
AudioStream.prototype.write = function(chunk) {
    this.push(chunk);
};

module.exports = AudioStream;

下面是不起作用的代码:

代码语言:javascript
复制
const { opus } = require('prism-media');
//const { pipeline } = require('stream');
const AudioStream = require('./utils/stream/AudioStream');

const receiver = connection.receiver;
const audioStream = new AudioStream();

const oggStream = new opus.OggLogicalBitstream({
    opusHead: new opus.OpusHead({
        channelCount: 2,
        sampleRate: 48000,
    }),
    pageSizeControl: {
        maxPackets: 10,
    },
});

audioStream.pipe(oggStream);
oggStream.on('data', (chunk) => {
    console.log(chunk)
    out.write(chunk);
});

receiver.speaking.on('start', userId => {
    if(!users.includes(userId)) {
        users.push(userId);
        const opusStream = receiver.subscribe(userId, {
            end: {
                behavior: EndBehaviorType.Manual,
            },
        });

        // oggStream.pipe(audioStream);
                    
        opusStream.on('data', (chunk) => {
            //console.log(chunk);
            audioStream.pushData(chunk)
        });
    }
});
EN

回答 1

Stack Overflow用户

发布于 2021-09-23 14:22:20

它不太实用,但您可以将流写入文件,并将它们与FFmpeg合并

命令:

代码语言:javascript
复制
ffmpeg -i first.wav -i second.wav -filter_complex "[0][1]amerge=inputs=2,pan=stereo|FL<c0+c1|FR<c2+c3[a]" -map "[a]" output.wav

node.js使用率:

代码语言:javascript
复制
import { exec } from 'child_process'; // Or const { exec } = require('child_process'); if you are using javascript
const mergeAudios= (firstAudio: string, secondAudio: string, output: string) => {

    return new Promise((resolve, reject) => {
        exec(
    "ffmpeg -i " + firstAudio + "-i " + secondAudio + ' -filter_complex "[0][1]amerge=inputs=2,pan=stereo|FL<c0+c1|FR<c2+c3[a]" -map "[a]" ' + output,
    (error, stdout, stderr) => {
            if (error) {
                reject(error)
                return;
            } else {
                resolve(null);
            }
        });
    })

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69299455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档