将两个音轨合并为一个。

6

我在将两个音轨合并成一个时遇到了问题,以便将整个合并后的音频添加到视频轨道中。

  this.promises = [navigator.mediaDevices.getUserMedia({ audio: true, video: true })];
  if (navigator['getDisplayMedia']) {
    this.promises.push(navigator['getDisplayMedia'](this.streamConstraints));
  }
  else if (navigator.mediaDevices['getDisplayMedia']) {
    this.promises.push(navigator.mediaDevices['getDisplayMedia'](this.streamConstraints));
  }
  else {
    this.promises.push(navigator.mediaDevices.getUserMedia({ video: { mediaSource: 'screen' } as any }));
  }
  Promise.all(this.promises)
    .then((streams) => {
      // so here is the microphone audio and webcam video
      const avTracks = streams[0].getTracks();
      // here is the screen video and audio
      const screenRecordTracks = streams[1].getTracks();
      const firstAudioTrack = new MediaStream(avTracks).getAudioTracks();
      const secondAudioTrack= new MediaStream(screenRecordTracks ).getAudioTracks();

  // so here I want to merge these two audio tracks, and them to add this final track to the first video track like so..
  const wholeRecord = new MediaStream(avTracks).getVideoTracks(); + the merged audio track

我该如何将它们合并成一条轨道,有人可以帮助我吗?


你自己尝试过什么来解决这个问题了吗? - Andreas
我不知道,伙计。我刚刚发现不能有两个音轨,因为其中一个会无法工作。 - Teodor Kostadinov
1个回答

18

我能够通过使用Web Audio API来实现这一点。我从两个流中获取音频轨道,并使用音频上下文将它们合并成一个。

var OutgoingAudioMediaStream = new MediaStream();
OutgoingAudioMediaStream.addTrack(OutgoingStream.getAudioTracks()[0]);

var IncomingAudioMediaStream = new MediaStream();
IncomingAudioMediaStream.addTrack(IncomingStream.getAudioTracks()[0]);

const audioContext = new AudioContext();

audioIn_01 = audioContext.createMediaStreamSource(OutgoingAudioMediaStream);
audioIn_02 = audioContext.createMediaStreamSource(IncomingAudioMediaStream);

dest = audioContext.createMediaStreamDestination();

audioIn_01.connect(dest);
audioIn_02.connect(dest);

var FinalStream = dest.stream;

这个完美地运作了。


你如何将 FinalSteam 转换为 blob? - Ramon Zuniga
2
录制器 = new MediaRecorder(FinalStream); recorder.addEventListener('dataavailable', function (e) { var file = new File([e.data], fileName, { type: "video/webm;codecs=h264" });
}); recorder.start();
- Kartik Khamborkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接