Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React.js-audio.duration返回NaN&;如何将blobUrl上传到AmazonS3_Javascript_Reactjs_Amazon S3 - Fatal编程技术网

Javascript React.js-audio.duration返回NaN&;如何将blobUrl上传到AmazonS3

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

我正在使用react组件
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
事件吗。我添加了一个代码片段。