uploadRecord() { if (this.recorder == null || this.recorder.duration === 0) { this.$message({ message: '请先录音', type: 'error' }) return false } this.recorder.pause() // 暂停录音 this.timer = null console.log('上传录音')// 上传录音 var wavBlob = this.recorder.getWAVBlob(); // 创建一个formData对象 var formData = new FormData() // 此处获取到blob对象后需要设置fileName满足当前项目上传需求,其它项目可直接传把blob作为file塞入formData const newbolb = new Blob([wavBlob], { type: 'audio/wav' }) //获取当时时间戳作为文件名 const fileOfBlob = new File([newbolb], new Date().getTime() + '.wav') formData.append('file', fileOfBlob) axios.post('http://10.0.1.79:8989/video', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) .then(response => { const audioBlob = new Blob([response.data], { type: 'wav/audio' }); this.audioSource = URL.createObjectURL(audioBlob); console.log(audioBlob) this.bf(); // 加载并播放音频 console.log(this.audioSource) }) .catch(error => { console.error('Error:', error); }); },这是我的请求函数,请求没问题,但是后端返回的内容我无法播放,这是 console.log(this.audioSource)返回的内容blob:http://localhost:8080/270bc311-a089-4e8a-a336-3e469d8df4d6

2023-12-04by@1275680765-ObLB7&@GPT-4.Model: gpt-4
1275680765-ObLB7
uploadRecord() {
  if (this.recorder == null || this.recorder.duration === 0) {
    this.$message({
      message: '请先录音',
      type: 'error'
    })
    return false
  }
  this.recorder.pause() // 暂停录音
  this.timer = null
  console.log('上传录音')// 上传录音
  var wavBlob = this.recorder.getWAVBlob();
  // 创建一个formData对象
  var formData = new FormData()
  // 此处获取到blob对象后需要设置fileName满足当前项目上传需求,其它项目可直接传把blob作为file塞入formData
  const newbolb = new Blob([wavBlob], { type: 'audio/wav' })
  //获取当时时间戳作为文件名
  const fileOfBlob = new File([newbolb], new Date().getTime() + '.wav')
  formData.append('file', fileOfBlob)
  axios.post('http://10.0.1.79:8989/video', formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
    .then(response => {
      const audioBlob = new Blob([response.data], { type: 'wav/audio' });
      this.audioSource = URL.createObjectURL(audioBlob);
      console.log(audioBlob)
      this.bf(); // 加载并播放音频
      console.log(this.audioSource)
    })
    .catch(error => {
      console.error('Error:', error);
    });
},这是我的请求函数,请求没问题,但是后端返回的内容我无法播放,这是 console.log(this.audioSource)返回的内容blob:http://localhost:8080/270bc311-a089-4e8a-a336-3e469d8df4d6
Avatar
Avatar

在你提供的代码中,你正在尝试上传一个录音文件到服务器,然后接收一个响应并创建一个可以播放的音频源。你提到无法播放后端返回的内容,但是你已经成功地创建了一个blob URL (this.audioSource)。

这是一些可能的原因和解决办法:

  1. 检查响应的数据类型
    确保后端返回的是音频文件的原始二进制数据,而不是JSON或其他格式。

  2. 媒体类型可能不正确
    在创建Blob时,你使用了 'wav/audio' 作为类型,这是不正确的。正确的类型应该是 'audio/wav'

    将代码更改为:

    const audioBlob = new Blob([response.data], { type: 'audio/wav' });
    
  3. 验证后端响应的数据
    确保后端返回的确实是有效的音频数据。你可以尝试将相同的响应数据保存到文件中,并尝试使用音频播放软件(如VLC或Windows Media Player)播放它以验证是否有效。

  4. 使用正确的方式播放Blob URL
    确保你的播放逻辑(this.bf() 函数)正确地使用了blob URL来播放音频。

    例如,如果你使用 HTML5 的 <audio> 元素来播放音频,代码可能看起来像这样:

    <audio id="myAudio" controls></audio>
    
    var audio = document.getElementById('myAudio');
    audio.src = this.audioSource;
    audio.load();
    audio.play();
    
  5. 跨域问题
    如果你的前端和后端不在同一个域上,你可能遇到了跨域资源共享(CORS)的问题。确保服务器设置了正确的CORS头,以允许你的前端应用访问资源。

  6. 错误处理
    在你的.catch块中,你只是打印了错误。更详细地检查这个错误可能会提供有关为什么音频无法播放的线索。

如果你仍然无法播放音频,你可能需要提供更多信息,比如后端的响应,以及你如何尝试播放音频文件的具体代码。这将有助于进一步诊断问题。

1275680765-ObLB7

这是后台打印的错误DOMException: Failed to load because no supported source was found.,我本地试了可以正常用,就是用后端的不行

Avatar
Avatar

这个错误 DOMException: Failed to load because no supported source was found. 表示浏览器无法加载提供的音频源,因为没有找到支持的格式或者源文件有问题。这可能是由于几个原因造成的:

  1. 音频格式不支持
    确保你的浏览器支持播放你尝试加载的音频格式。例如,大多数现代浏览器都支持播放.wav格式的音频文件,但如果你的音频格式不是.wav,或者编码方式不被浏览器支持,就会导致这个问题。

  2. 音频文件损坏
    可能后端返回的音频文件本身就是损坏的,或者在传输过程中损坏了。尝试直接从后端获取文件并手动播放以验证文件的完整性。

  3. 响应类型不正确
    当你从后端获取响应时,确保你接收的是一个Blob对象或者ArrayBuffer。如果你收到的是JSON或者文本,就无法将其正确转换为音频Blob。

  4. 内容类型(MIME类型)不匹配
    浏览器依赖于正确的内容类型(MIME类型)来播放媒体文件。如果后端设置的响应头 Content-Type 不是正确的音频类型,浏览器可能无法识别和播放。

  5. CORS问题
    如果你的前端和后端是分开部署的,并且后端没有正确配置CORS,浏览器可能会阻止加载音频文件。你需要确保后端响应中包含正确的CORS头,允许你的前端域名访问资源。

针对这些可能的原因,你可以进行以下检查:

  • 使用浏览器开发者工具(Network tab)检查音频文件的响应头,确保Content-Typeaudio/wav或者是你的音频文件的正确类型。
  • 直接从后端获取音频文件,使用音频播放器尝试播放,确保文件没有损坏。
  • 如果你的后端服务使用了某种压缩或编码方式,确保它是浏览器兼容的,并且在前端正确解码。
  • 如果你怀疑CORS可能是问题所在,检查浏览器控制台是否有CORS相关的错误,并确保后端服务有适当的CORS配置。

如果后端返回的是音频文件的流或者二进制数据,也确保你的前端代码能够正确处理这些数据。例如,如果你使用axios,你可能需要指定响应类型为blob:

axios.post('http://10.0.1.79:8989/video', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  responseType: 'blob' // 确保返回的是blob
})

再次尝试之后,如果问题仍然存在,请提供更多相关信息以进一步诊断。