3

MediaRecorder API for Firefox を使用してビデオ/オーディオ ファイルを記録しようとしています。

ノードの作成に Web Audio API を使用している場合 (ソース -> ゲイン -> 宛先)

記録されたファイルの出力は、宛先ノードからの戻りストリームがオーディオ ストリームであるため、オーディオのみです

オーディオのみではなくオーディオ/ビデオを記録するために、宛先出力でオーディオ/ビデオストリームを取得するための提案。

    var mediastream;

    var ctx = new AudioContext();

    var mediaStreamSource = ctx.createMediaStreamSource(mediaStream); 

    var destination = ctx.createMediaStreamDestination();

    ObjectStore.VolumeGainNode = ctx.createGain();
    ObjectStore.VolumeGainNode.gain.value = 0.5;

    mediaStreamSource.connect(ObjectStore.VolumeGainNode);

    ObjectStore.VolumeGainNode.connect(destination);

    mediaStream = destination.stream;
4

1 に答える 1

4

gUM ビデオ トラックとゲインを変更したオーディオ トラックで構成されるストリームが必要です。

標準に従い、Firefox では と を使用してストリーム内のトラックを変更しstream.addTrackたりstream.removeTrack、 を使用してトラックから新しいストリームを作成したりできますnew MediaStream([tracks])

これにより、gUM オーディオ トラックをゲイン操作されたものに置き換えることで問題を解決できます。

var constraints = { video: true, audio: true };

var start = () => navigator.mediaDevices.getUserMedia(constraints)
  .then(stream => modifyGain(video.srcObject = stream, 0.5))
  .catch(e => console.error(e));

var modifyGain = (stream, gainValue) => {
    var audioTrack = stream.getAudioTracks()[0];
    var ctx = new AudioContext();
    var src = ctx.createMediaStreamSource(new MediaStream([audioTrack]));
    var dst = ctx.createMediaStreamDestination();
    var gainNode = ctx.createGain();
    gainNode.gain.value = gainValue;
    [src, gainNode, dst].reduce((a, b) => a && a.connect(b));
    stream.removeTrack(audioTrack);
    stream.addTrack(dst.stream.getAudioTracks()[0]);
};

フィドルは次のとおりです (Firefox 44 以降): https://jsfiddle.net/7wd2z8rz/

再び MediaRecorder を使用: https://jsfiddle.net/j33xmkcq/

于 2016-01-25T19:29:10.973 に答える