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
在你提供的代码中,你正在尝试上传一个录音文件到服务器,然后接收一个响应并创建一个可以播放的音频源。你提到无法播放后端返回的内容,但是你已经成功地创建了一个blob URL (this.audioSource
)。
这是一些可能的原因和解决办法:
检查响应的数据类型:
确保后端返回的是音频文件的原始二进制数据,而不是JSON或其他格式。
媒体类型可能不正确:
在创建Blob时,你使用了 'wav/audio'
作为类型,这是不正确的。正确的类型应该是 'audio/wav'
。
将代码更改为:
const audioBlob = new Blob([response.data], { type: 'audio/wav' });
验证后端响应的数据:
确保后端返回的确实是有效的音频数据。你可以尝试将相同的响应数据保存到文件中,并尝试使用音频播放软件(如VLC或Windows Media Player)播放它以验证是否有效。
使用正确的方式播放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();
跨域问题:
如果你的前端和后端不在同一个域上,你可能遇到了跨域资源共享(CORS)的问题。确保服务器设置了正确的CORS头,以允许你的前端应用访问资源。
错误处理:
在你的.catch
块中,你只是打印了错误。更详细地检查这个错误可能会提供有关为什么音频无法播放的线索。
如果你仍然无法播放音频,你可能需要提供更多信息,比如后端的响应,以及你如何尝试播放音频文件的具体代码。这将有助于进一步诊断问题。
这是后台打印的错误DOMException: Failed to load because no supported source was found.,我本地试了可以正常用,就是用后端的不行
这个错误 DOMException: Failed to load because no supported source was found.
表示浏览器无法加载提供的音频源,因为没有找到支持的格式或者源文件有问题。这可能是由于几个原因造成的:
音频格式不支持:
确保你的浏览器支持播放你尝试加载的音频格式。例如,大多数现代浏览器都支持播放.wav
格式的音频文件,但如果你的音频格式不是.wav
,或者编码方式不被浏览器支持,就会导致这个问题。
音频文件损坏:
可能后端返回的音频文件本身就是损坏的,或者在传输过程中损坏了。尝试直接从后端获取文件并手动播放以验证文件的完整性。
响应类型不正确:
当你从后端获取响应时,确保你接收的是一个Blob对象或者ArrayBuffer。如果你收到的是JSON或者文本,就无法将其正确转换为音频Blob。
内容类型(MIME类型)不匹配:
浏览器依赖于正确的内容类型(MIME类型)来播放媒体文件。如果后端设置的响应头 Content-Type
不是正确的音频类型,浏览器可能无法识别和播放。
CORS问题:
如果你的前端和后端是分开部署的,并且后端没有正确配置CORS,浏览器可能会阻止加载音频文件。你需要确保后端响应中包含正确的CORS头,允许你的前端域名访问资源。
针对这些可能的原因,你可以进行以下检查:
Content-Type
是audio/wav
或者是你的音频文件的正确类型。如果后端返回的是音频文件的流或者二进制数据,也确保你的前端代码能够正确处理这些数据。例如,如果你使用axios,你可能需要指定响应类型为blob:
axios.post('http://10.0.1.79:8989/video', formData, {
headers: {
'Content-Type': 'multipart/form-data'
},
responseType: 'blob' // 确保返回的是blob
})
再次尝试之后,如果问题仍然存在,请提供更多相关信息以进一步诊断。