当前位置: 首页 > news >正文

[HTML]播放wav格式音频

[HTML]播放wav格式音频

<!doctype html>
<html><head><title>音频播放 - 调试版</title><style>.error { color: red; }.success { color: green; }.debug-info { margin-top: 20px;border: 1px solid #ccc;padding: 10px;background-color: #f9f9f9;}</style></head><body><h1>音频播放 - 调试版</h1><div><h3>方法1: 原生Audio元素</h3><button onclick="playAudioNative()">原生播放</button><audio id="audio-native" controls></audio></div><div><h3>方法2: Fetch + Blob URL</h3><button onclick="playAudioFetch()">Fetch方式播放</button><audio id="audio-fetch" controls></audio></div><div><h3>方法3: XMLHttpRequest</h3><button onclick="playAudioXHR()">XHR方式播放</button><audio id="audio-xhr" controls></audio></div><div><h3>方法4: iframe嵌入</h3><button onclick="showAudioFrame()">iframe方式</button><div id="frame-container"></div></div><div class="debug-info"><h3>调试信息:</h3><div id="debug-log"></div><h3>检查音频文件:</h3><button onclick="checkAudioFile()">检查文件是否存在</button><div id="file-status"></div></div><script>const audioUrl = 'http://127.0.0.1:8080/tts-audio/tts_3691e8bf-1ff9-4b81-804e-ae83546279ce.wav';function log(message, isError = false) {const logElem = document.getElementById('debug-log');const entry = document.createElement('div');entry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;if (isError) entry.className = 'error';else entry.className = 'success';logElem.appendChild(entry);console.log(message);}// 方法1: 原生Audio元素function playAudioNative() {log('尝试使用原生Audio元素播放...');const audio = document.getElementById('audio-native');audio.src = audioUrl;audio.onloadeddata = () => log('音频加载成功,准备播放');audio.onplay = () => log('开始播放');audio.onplaying = () => log('正在播放');audio.onerror = (e) => {const errorMsg = getAudioErrorMessage(audio.error);log(`音频加载错误: ${errorMsg}`, true);};audio.play().catch(err => {log(`播放失败: ${err.message}`, true);});}// 方法2: Fetch + Blob URLasync function playAudioFetch() {log('尝试使用Fetch方式获取音频...');try {const response = await fetch(audioUrl);if (!response.ok) {log(`服务器响应错误: ${response.status} ${response.statusText}`, true);return;}const blob = await response.blob();log(`获取音频成功,大小: ${(blob.size / 1024).toFixed(2)}KB`);const audio = document.getElementById('audio-fetch');const url = URL.createObjectURL(blob);audio.src = url;audio.onloadeddata = () => log('Blob音频加载成功');audio.onerror = (e) => log(`Blob音频错误: ${getAudioErrorMessage(audio.error)}`, true);audio.play().catch(err => {log(`Blob播放失败: ${err.message}`, true);});} catch (err) {log(`Fetch错误: ${err.message}`, true);}}// 方法3: XMLHttpRequestfunction playAudioXHR() {log('尝试使用XHR方式获取音频...');const xhr = new XMLHttpRequest();xhr.open('GET', audioUrl, true);xhr.responseType = 'blob';xhr.onload = function() {if (xhr.status === 200) {log(`XHR获取音频成功,大小: ${(xhr.response.size / 1024).toFixed(2)}KB`);const audio = document.getElementById('audio-xhr');const url = URL.createObjectURL(xhr.response);audio.src = url;audio.onloadeddata = () => log('XHR音频加载成功');audio.onerror = (e) => log(`XHR音频错误: ${getAudioErrorMessage(audio.error)}`, true);audio.play().catch(err => {log(`XHR播放失败: ${err.message}`, true);});} else {log(`XHR错误: ${xhr.status} ${xhr.statusText}`, true);}};xhr.onerror = function() {log('XHR网络错误', true);};xhr.send();}// 方法4: iframe嵌入function showAudioFrame() {log('尝试使用iframe嵌入音频...');const container = document.getElementById('frame-container');container.innerHTML = `<iframe src="${audioUrl}" width="300" height="100"></iframe>`;log('已加载iframe');}// 检查文件是否存在async function checkAudioFile() {const statusElem = document.getElementById('file-status');statusElem.textContent = '正在检查文件...';try {const response = await fetch(audioUrl, { method: 'HEAD' });if (response.ok) {const contentType = response.headers.get('content-type') || '未知';const contentLength = response.headers.get('content-length') || '未知';statusElem.innerHTML = `<div class="success">文件存在!</div><div>Content-Type: ${contentType}</div><div>Content-Length: ${contentLength} 字节</div>`;// 检查CORS头const cors = response.headers.get('access-control-allow-origin');if (cors) {statusElem.innerHTML += `<div>CORS: ${cors}</div>`;} else {statusElem.innerHTML += `<div class="error">警告: 未检测到CORS头</div>`;}} else {statusElem.innerHTML = `<div class="error">文件不存在或无权访问! 状态码: ${response.status}</div>`;}} catch (err) {statusElem.innerHTML = `<div class="error">检查失败: ${err.message}</div>`;}}// 获取音频错误信息function getAudioErrorMessage(error) {if (!error) return '未知错误';// 媒体错误代码switch(error.code) {case 1: return 'MEDIA_ERR_ABORTED: 用户中止了获取过程';case 2: return 'MEDIA_ERR_NETWORK: 网络错误导致下载失败';case 3: return 'MEDIA_ERR_DECODE: 解码失败,可能是文件损坏或浏览器不支持的格式';case 4: return 'MEDIA_ERR_SRC_NOT_SUPPORTED: 媒体源不可用或不支持';default: return `未知错误(${error.code})`;}}// 页面加载时记录浏览器信息window.onload = function() {log(`浏览器: ${navigator.userAgent}`);log('页面已加载,请点击按钮测试不同播放方法');};</script></body>
</html>
http://www.dtcms.com/a/490879.html

相关文章:

  • IntentService 的应用场景和使用方式?
  • 【开题答辩实录分享】以《基于大数据技术的二手车交易数据分析与设计》为例进行答辩实录分享
  • 基础开发工具(上)
  • k8s lngress与安全机制
  • 大模型微调(一):有监督微调与困惑度
  • 网站建设步骤图片素材WordPress点击出现爱心
  • 《从零搭建现代 Android 模块化架构项目(2025 最新实践)》
  • 深圳燃气公司有哪些大型网站和小企业站优化思路
  • AWS CloudWatch Logs Insights:实时日志分析,让服务器问题无所遁形
  • 云服务器与传统服务器租用的核心差异解析(云服务器与服务器租用之间的区别在哪里?)
  • NewStarCTF2025-Week2-Web
  • 自己做网站需要做服务器如何用dw制作网页框架
  • 使用Deepseek解析PDF文件
  • 跨链协同制造中的服务博弈与激励机制
  • 在半导体制造中什么是晶圆退火工艺?
  • 赋能高效电池制造:圆柱电芯组合式双面自动点焊技术
  • 【项目】基于多设计模式下的同步异步日志系统 - 项目介绍与前置知识
  • saas建站和开源建站的区别哈尔滨建站怎么做
  • 鸿蒙Harmony实战开发教学(No.4)-RichText组件基础到高阶介绍篇
  • 外包网站价格介绍西安网页设计
  • yolov3代码详解
  • 第六篇移动端知识,vw/vmin适配方案...
  • kubuntu24.04 换国内ustc源
  • 查询计划:EXPLAIN解读,SQL性能怎样精准调优?
  • 大形电商网站开发费用广州seo关键词优化费用
  • 网站做迅雷下载链接网页制作软件
  • Flink ProcessFunction 与低层级 Join 实战手册:多流广告计费精确去重
  • jQuery Mobile 按钮图标:设计与实现指南
  • SQL MID() 函数详解与使用指南
  • 深度学习之yolov2