首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在反应中使用audioWorklet.addModule?

如何在反应中使用audioWorklet.addModule?
EN

Stack Overflow用户
提问于 2018-11-08 22:06:18
回答 1查看 1.7K关注 0票数 0

我已经开始尝试创建一个音频录音机,以便使用Web音频API进行反应。

这是我的记录器类的代码

代码语言:javascript
复制
import AudioNode from './workletNode'


export default class Recorder {
  constructor(context) {

    this.context = context
    this.recording = false

    console.log(context)

    context.audioWorklet.addModule('processor.js')
      .then(() => {
        console.log('added worklet module')

        navigator.mediaDevices.getUserMedia({audio: true, video: false})
          .then(stream => {
            console.log('Have stream')
            let microphone = context.createMediaStreamSource(stream)
            let wavEncoder = new AudioNode(context)

            microphone.connect(wavEncoder).connect(context.destination)
          })
      })
      .catch((e) => {
        alert('Error getting audio')
        console.log(e)
      })
  }


  record() {
    console.log('Start recorder')
    this.recording = true
  }

  stop() {
    console.log('Stop recorder')
    this.recording = false
  }
}

我遇到的问题是这一行:context.audioWorklet.addModule('processor.js')

没有添加processor.js文件。

然后,当它到达这一行时抛出一个错误:

代码语言:javascript
复制
let wavEncoder = new AudioNode(context)

错误是:

未处理的拒绝( __WEBPACK_IMPORTED_MODULE___workletNode___default.a ):TypeError不是构造函数

我在react之外尝试过相同的代码,这很好。因此,这与使用audioWorklet.addModule的内部反应有关。

有人能帮忙吗?

这是调用记录器的react组件:

代码语言:javascript
复制
import React from 'react'
import {connect} from 'react-redux'
import {Button} from 'semantic-ui-react'
import {injectIntl} from 'react-intl'
import Recorder from './recorder'

class SpeechToTextAudioWorklet extends React.Component {

  componentDidMount() {
    this.context = null
    this.recorder = null
  }

  startRecorder() {
    if (!this.context) {
      this.context = new window.AudioContext()
      this.recorder = new Recorder(this.context)
    } else {
      this.context.resume()
    }

    this.recorder && this.recorder.record()
  }

  stopRecorder() {
    this.recorder && this.recorder.stop()
  }

  render() {

    return (<div>Speech to text

      <Button id="start" onClick={() => {
        this.startRecorder()
      }}>Record</Button>
      <Button id="stop" onClick={() => {
        this.stopRecorder()
      }}>Stop</Button>
      <div id="recordingslist"></div>
    </div>)
  }
}

const mapStateToProps = () => {
  return {}
}

export default connect(
  mapStateToProps
)(injectIntl(SpeechToTextAudioWorklet))
EN

回答 1

Stack Overflow用户

发布于 2018-12-26 19:24:14

尝试在worklet文件夹中创建一个public目录,将AudioWorkletProcesser移到那里,并更改代码以反映新路径:context.audioWorklet.addModule('worklet/processor.js')

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53216863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档