【问题标题】:Cycle.js: Getting Stream, Expecting BlobCycle.js:获取流,期待 Blob
【发布时间】:2020-01-29 04:09:03
【问题描述】:

我正在尝试创建一个录制音频流。我正在从导航器mediaDevices.getUserMedia 创建一个承诺流,然后将该流映射到媒体记录器流。最后,我想用媒体记录器流创建一个 blob 流。

我遇到的是订阅函数中的blob 变量是流而不是blob。

addEventListener 获取结果并将其转换为 blob 流的正确方法是什么?

const mediaSource$ = xs.fromPromise(
  navigator.mediaDevices.getUserMedia({ audio: true, video: false })
)

const mediaRecorder$ = mediaSource$
  .map( mediaSource => {
    const mediaRecorder = new window.MediaRecorder(
      mediaSource,
      {mimeType: 'audio/webm'}
    )
    return mediaRecorder
  })

const blob$ = mediaRecorder$
  .map( (mediaRecorder) =>
    xs.create({
      start: (listener) => {
        mediaRecorder.addEventListener('dataavailable', (e) => {
          console.log('Data Available', e.data)
           listener.next(e.data)
        })
      },
      stop: () => {}
    })
  )


xs.combine(action$, mediaRecorder$, blob$).subscribe({
  next: ([action, mediaRecorder, blob]: [any, any, any]) => {

    console.log('BOLB', blob); // getting a stream, not a blob

    if(action.key === 'start_recording') mediaRecorder.start()
    if(action.key === 'stop_recording') mediaRecorder.stop()
  }
})

【问题讨论】:

    标签: cyclejs xstream-js


    【解决方案1】:

    您的方法几乎是正确的,包括 xs.create,但是如果您 map 到一个流,您现在有一个事件流流。要获得正常的事件流,只需在地图后添加.flatten()

    【讨论】:

    • 谢谢 Jan van Brügge。将flatten() 添加到map 是有意义的。我得到了一股溪流。我在文档中错过了这一点。我想我不明白我从 blob 流中得到了什么。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2021-11-16
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多