当前位置: 首页 > 知识库问答 >
问题:

新的MediaRecorder(stream[,options])流可以活修改吗?

田成化
2023-03-14

新建MediaRecorder(Stream[,options]);

    function getFileBuffer(filepath) {
      return fetch(filepath, {method: 'GET'}).then(response => response.arrayBuffer())
    }
    
    function mp3play() {
      getFileBuffer('song.mp3')
      .then(buffer => context.decodeAudioData(buffer))
      .then(buffer => {
        console.log(buffer)
        const source = context.createBufferSource()
        source.buffer = buffer
        let volume = context.createGain()
        volume.gain.value = 1
        source.connect(volume)
        dest = context.createMediaStreamDestination()
        volume.connect(dest)
        // volume.connect(context.destination)
        source.start(0)
    
        const _audioTrack = stream.getAudioTracks();
        if (_audioTrack.length > 0) {
          _audioTrack[0].stop();
          stream.removeTrack(_audioTrack[0]);
        }
        //
        // console.log(dest.stream)
        // console.log(dest.stream.getAudioTracks()[0])
        // stream.addTrack(dest.stream.getAudioTracks()[0])
      })
    }
    
    function startRecording() {
      recorder = new MediaRecorder(stream, {
        mimeType: 'video/webm'
      })
      recorder.start()
      stopBtn.removeAttribute('disabled')
      startBtn.disabled = true
    }

共有1个答案

毋城
2023-03-14

不,我们仍然不能录制一个在录制开始后轨道被改变的纵隔流,这样做将stop()MediaCorder。这里有一个非常相关的问答,更多的是关于录制视频。

不过,可以做的是创建一种合并的Mediastream。
使用音频更容易,而且因为您已经在使用WebAudio API:您需要做的只是创建一个其他的MediaStreamDestination节点,并连接/断开不同的源。

const base = "https://upload.wikimedia.org/wikipedia/en/d/";
const urls = [
  "d3/Beach_Boys_-_Good_Vibrations.ogg",
  "dc/Strawberry_Fields_Forever_%28Beatles_song_-_sample%29.ogg"
].map( url => base + url );
const context = new AudioContext();
const button = document.querySelector( 'button' );

button.onclick = async () => {
  button.disabled = true;
  context.resume();
  const audiobuffers = await Promise.all( urls.map( fetchAsAudioBuffer ) );
  button.remove();
  const streamNode = context.createMediaStreamDestination();
  const stream = streamNode.stream;
  
  const recorder = new MediaRecorder( stream );
  const chunks = [];
  recorder.ondataavailable = evt => chunks.push( evt.data );
  recorder.onstop = evt => exportAudio( new Blob( chunks ) );
  document.getElementById( 'record-stopper' ).onclick = evt => {
    recorder.stop();
    current_source.stop( 0 );
  };

  let current_index = 0;
  let current_source = null;
  
  document.getElementById( 'switcher' ).onclick = switchAudioSource;
  
  switchAudioSource();
  recorder.start();

  function switchAudioSource() {
    if( current_source ) {
      current_source.stop( 0 );
    }
    current_index = (current_index + 1) % audiobuffers.length;
    current_source = context.createBufferSource();
    current_source.buffer = audiobuffers[ current_index ];
    current_source.loop = true;
    current_source.connect( streamNode );
    current_source.connect( context.destination );
    current_source.start( 0 );
  }

};

function exportAudio( blob ) {
  const aud = new Audio( URL.createObjectURL( blob ) );
  aud.controls = true;
  document.body.prepend( aud );
}

async function fetchAsAudioBuffer( url ) {
  const buf = await fetchAsBuffer( url );
  return context.decodeAudioData( buf );
}
async function fetchAsBuffer( url ) {
  const resp = await fetch( url );
  return resp.arrayBuffer();
}
button+.recording-controls,
  audio+.recording-controls {
    display: none;
  }
<button>begin</button>
<div class="recording-controls">
  <label>Recording...</label>
  <button id="switcher">Switch Audio Sources</button>
  <button id="record-stopper">Stop Recording</button>
</div>
 类似资料:
  • 组织者使用“guestsCanModify:true”创建谷歌活动 当与会者尝试通过谷歌日历api(例如:补丁)更新此活动时,不会将其改为原始活动。我通过谷歌日历网站观看了这一活动记录,“本次活动的细节有所更改,但仅反映在日历上” 当与会者尝试通过谷歌日历网站更新此活动时(https://calendar.google.com/),我可以更改原始事件。这将重定向到组织者日历 使用谷歌日历api时有

  • 本文向大家介绍Objective C中可修改和不可以修改类型。相关面试题,主要包含被问及Objective C中可修改和不可以修改类型。时的应答技巧和注意事项,需要的朋友参考一下 答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。 比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存

  • 问题内容: 我正在测试自己的用户界面,发现搜索栏有点过窄,无法满足我的需求。我还想确保视力较差或手动灵活性较差的人在调配所需界面时没有问题。 所以,我想做的是调整内部的高度。 我尝试过的操作:1.在情节提要中,添加“ 高度限制”-结果:搜索栏大小增加,但内部保持不变。 访问内部并修改其高度-结果:控制台输出显示参数已修改,但是在屏幕上,高度保持不变。 注意-我可以修改使用方法2的其他参数,并且更改

  • 我有一个映射,我正在遍历它,并使用循环修改映射的值。我想知道是否有一种方法可以使用Java8流来实现。 这是我的代码: 基本上,我想流化地图值,设置值,并将其作为新地图。

  • 本文向大家介绍componentWillUpdate可以直接修改state的值吗?相关面试题,主要包含被问及componentWillUpdate可以直接修改state的值吗?时的应答技巧和注意事项,需要的朋友参考一下 react组件在每次需要重新渲染时候都会调用, 例如,我们调用 时候 在这个函数中我们之所以不调用是因为该方法会触发另一个,如果我们中触发状态更改,我们将以无限循环结束.

  • Streams是在Java中引入的,以帮助开发人员从一系列对象中执行聚合操作。 使用Java 9,几乎没有更多方法可以使流更好。 takeWhile(Predicate Interface) 语法 (Syntax) default Stream<T> takeWhile(Predicate<? super T> predicate) takeWhile方法获取所有值,直到谓词返回false。 在