Я пытаюсь использовать объект JavaScript Audio. Я очень внимательно слежу за этим руководством: https://medium.com/@bryanjenningz/how-to-record-and-play-audio-in-javascript-faa1b2b3e49b.
В части 6 я должен вызвать play () для объекта Audio, но я получаю сообщение об ошибке «Uncaught TypeError: audio.play не является функцией», и я не уверен, что делаю неправильно. Любая помощь?
Обновлено: код до сих пор:
import React, { Component } from 'react'
class Audio extends Component {
constructor() {
super();
this.state = {
showButton: true,
};
}
recordAudio = () => {
this.setState({ showButton: false })
navigator.mediaDevices.getUserMedia({ audio: true })
.then(stream => {
this.setState({ mediaRecorder: new MediaRecorder(stream) })
this.state.mediaRecorder.start();
const audioChunks = [];
this.state.mediaRecorder.addEventListener("dataavailable", event => {
audioChunks.push(event.data);
});
this.state.mediaRecorder.addEventListener("stop", () => {
const audioBlob = new Blob(audioChunks);
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
console.info(audio);
audio.play();
});
});
}
stopRecording = () => {
this.setState({ showButton: true })
this.state.mediaRecorder.stop();
}
render() {
return (
<div>
{/* This is a ternary operator that changes the button that is shown */}
{
this.state.showButton ?
<button type = "button" onClick = {this.recordAudio}> Start Recording </button> :
<button type = "button" onClick = {this.stopRecording}> Stop Recording </button>
}
</div>
)
}
}
export default Audio;
Обновлено: вывод console.info (аудио):
Audio {props: undefined, context: undefined, refs: {…}, updater: {…}, recordAudio: ƒ, …}
context:undefined
props:undefined
recordAudio:ƒ ()
refs:{}
state:{showButton: true}
stopRecording:ƒ ()
updater:{isMounted: ƒ, enqueueForceUpdate: ƒ, enqueueReplaceState: ƒ, enqueueSetState: ƒ}
isMounted:(...)
replaceState:(...)
__proto__:ReactComponent
Что возвращает console.info(audio)?
Спасибо, что обновили свой пост. Как сказал Миша, что выводит console.info(audio)?
Я добавил вывод console.info (аудио). Есть ли у вас какие-либо мысли о том, что может пойти не так?
В этом контексте Audio - это класс вашего компонента, а не конструктор window.Audio по умолчанию. Так что лучше всего было бы переименовать свой класс во что-то более конкретное. Другим решением менее хорошо может быть вызов window.Audio, если вы не перезаписали его своим классом. И столь же менее хорошее решение - вызвать audio = document.createElement('audio'); audio.preload = 'auto'; audio.src = url, поскольку это то, что делает звук по умолчанию.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Комментарий Кайидо решил проблему для меня. Поскольку я назвал свой класс «Audio» и вызывал конструктор «Audio» (когда я думал, что вызываю window.Audio), он не создавал соответствующий объект.
Согласно их решению, либо переименуйте класс, вызовите window.Audio, либо вызовите функциональность window.Audio по умолчанию, как подробно описано в их комментарии.
Пожалуйста, предоставьте нам код, который вы написали до сих пор.