2016-01-25 15 views
3

Я пытаюсь записывать видео/аудио файлы с помощью MediaRecorder API для Firefox.Регулировка громкости для видео/аудиопотока в Firefox

Когда я использую веб-Audio API для создания узлов (источник -> Gain -> Destination)

Вывод записанного файла является только аудио в качестве потока, возвращаемого из узла назначения только аудио поток ссылаясь на эту документацию https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamAudioDestinationNode

Любое предложение для получения аудио/видеопотока на выходе для записи аудио/видео, а не только аудио.

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; 

ответ

3

Вам нужен поток, состоящий из Gum видеодорожки и усиления вашей модифицированных звуковой дорожки.

Следуя стандарту, Firefox позволяет изменять дорожки в потоке с использованием stream.addTrack и stream.removeTrack, а также создавать новые потоки из дорожек с помощью new MediaStream([tracks]).

Это позволяет решить проблему путем замены звуковой дорожки жевательной резинки с вашим амплитудно-манипулирует один:

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/