Javascript React.js-audio.duration返回NaN&;如何将blobUrl上传到AmazonS3
我正在使用react组件Javascript React.js-audio.duration返回NaN&;如何将blobUrl上传到AmazonS3,javascript,reactjs,amazon-s3,Javascript,Reactjs,Amazon S3,我正在使用react组件ReactMediaRecorder使用以下代码捕获音频。它返回我在状态中设置的blobUrl <ReactMediaRecorder audio whenStopped={blobUrl=>this.setState({ blobUrl })} render={({ status, startRecording, stopRecording, mediaBlob }) => ( <div> <p&g
ReactMediaRecorder
使用以下代码捕获音频。它返回我在状态中设置的blobUrl
<ReactMediaRecorder
audio
whenStopped={blobUrl=>this.setState({ blobUrl })}
render={({ status, startRecording, stopRecording, mediaBlob }) => (
<div>
<p>{status}</p>
<button onClick={startRecording}>Start Recording</button>
<button onClick={stopRecording}>Stop Recording</button>
<audio src={mediaBlob} controls />
</div>
)}
/>
其次,我想使用RESTAPI将此音频上传到我的AmazonS3存储中。是否有其他方法将此blobUrl转换为音频,然后将其上载到s3存储
我的第一个问题是为什么audio.play()工作,而audio.duration返回NaN
let audio = new Audio(mediaBlob);
audio.play(); // this works
audio.duration //but this returns NaN
您需要等到音频对象加载了一些数据之后才能获取持续时间
audio.addEventListener('loadedmetadata', (e) => {
console.log(e.target.duration);
});
此外,持续时间可能不可靠。。。MediaRecorder的浏览器实现存在一些问题,如果输出以数据块形式传输,则无法可靠地设置长度
其次,我想使用RESTAPI将此音频上传到我的AmazonS3存储中。是否有其他方法将此blobUrl转换为音频,然后将其上载到s3存储
使用Blob实例本身作为请求主体。不要使用blob URL。别忘了设置内容类型
标题
我的第一个问题是为什么audio.play()工作,而audio.duration返回NaN
let audio = new Audio(mediaBlob);
audio.play(); // this works
audio.duration //but this returns NaN
您需要等到音频对象加载了一些数据之后才能获取持续时间
audio.addEventListener('loadedmetadata', (e) => {
console.log(e.target.duration);
});
此外,持续时间可能不可靠。。。MediaRecorder的浏览器实现存在一些问题,如果输出以数据块形式传输,则无法可靠地设置长度
其次,我想使用RESTAPI将此音频上传到我的AmazonS3存储中。是否有其他方法将此blobUrl转换为音频,然后将其上载到s3存储
使用Blob实例本身作为请求主体。不要使用blob URL。不要忘记设置您的内容类型标题。您可以这样尝试:
let duration, retry;
const limit = 50;
function getDuration(audio) {
if(audio.duration > 0){
duration = audio.duration;
return;
}
if(retry > limit) { return }
setTimeout(() => {
retry++;
getDuration(audio)
}, 40);
}
您可以这样尝试:
let duration, retry;
const limit = 50;
function getDuration(audio) {
if(audio.duration > 0){
duration = audio.duration;
return;
}
if(retry > limit) { return }
setTimeout(() => {
retry++;
getDuration(audio)
}, 40);
}
感谢您的评论,Brad,如何检查音频对象是否已加载?你能发布一个我能更好理解的片段吗?@AmeerHamza你想听听loadedmetadata
事件吗。我添加了一个代码段。感谢您的评论,Brad,如何检查音频对象是否已加载?你能发布一个我能更好理解的片段吗?@AmeerHamza你想听听loadedmetadata
事件吗。我添加了一个代码片段。