Reactでオーディオタグのsrc
属性を設定しようとしましたが、トラックが再生されません。
playTrack(track) {
const stream = new MediaStream()
stream.addTrack(track)
this.setState(() => ({ stream }))
}
render() {
return (
<audio src={this.state.stream || null} controls volume="true" autoPlay />
)
}
chromeデバッガをチェックインすると、オーディオタグに[MediaStream]
ソースとして設定しましたが、何も再生されず、すべてのコントロールがグレー表示のままでした。
状態を設定する代わりにこれを行うことは機能しますが、これはReactでは非常に嫌われていると思います。
const audio = document.querySelector('audio')
audio.srcObject = stream
ストリームを状態に保存する必要がない場合は、srcObject
を使用してref
プロパティを更新できます。
playTrack(track) {
const stream = new MediaStream()
stream.addTrack(track)
this.audio.srcObject = stream;
}
render() {
return (
<audio ref={audio => {this.audio = audio}} controls volume="true" autoPlay />
)
}
州からストリームにアクセスする必要がある場合は、これを試すことができます
<audio ref={audio => { audio.srcObject = this.state.stream }} />
src={this.state.stream}
が機能しないのは、this.state.stream
がsrc
オブジェクトであるのに対し、MediaStream
はオーディオリソースのURLを表す文字列を想定しているためです。
audio.src
とaudio.srcObject
は、異なる値タイプを期待する異なるプロパティです。
小道具を使用し、各レンダリングで関数を作成したくない人のために:
constructor(props) {
super(props)
this.videoRef = React.createRef()
}
render() {
return <video ref={this.videoRef}/>
}
componentDidMount() {
this.updateVideoStream()
}
componentDidUpdate() {
this.updateVideoStream()
}
updateVideoStream() {
if (this.videoRef.current.srcObject !== this.props.stream) {
this.videoRef.current.srcObject = this.props.stream
}
}