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

音频转base64

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>音频转Base64</title><style>.container {max-width: 600px;margin: 2rem auto;padding: 2rem;border: 1px solid #ccc;border-radius: 8px;}.upload-box {border: 2px dashed #aaa;padding: 2rem;text-align: center;margin-bottom: 1rem;cursor: pointer;}.upload-box:hover {background-color: #f9f9f9;}#audio-preview {margin-top: 1rem;}#result {margin-top: 1rem;white-space: pre-wrap;word-break: break-all;}.hidden {display: none;}.error {color: red;margin-top: 1rem;}</style><style>/* 新增按钮样式 */.copy-btn {margin-top: 1rem;padding: 0.5rem 1rem;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;transition: background-color 0.3s;}.copy-btn:hover {background-color: #45a049;}.copy-btn:disabled {background-color: #cccccc;cursor: not-allowed;}/* 提示信息样式 */.copy-status {margin-top: 0.5rem;font-size: 0.9rem;opacity: 0;transition: opacity 0.3s;}.copy-success {color: #4CAF50;opacity: 1;}.copy-error {color: #f44336;opacity: 1;}</style>
</head>
<body><div class="container"><div class="upload-box" id="drop-zone"><p>点击选择音频文件或拖放到此处</p><input type="file" id="file-input" accept="audio/*" hidden></div><div id="audio-preview" class="hidden"></div><div id="error-message" class="error"></div><div class="container"><!-- ... 原有代码 ... --><button id="copy-btn" class="copy-btn" >复制Base64</button><div id="copy-status" class="copy-status"></div></div><div id="result"></div></div><script>// 新增变量const copyBtn = document.getElementById('copy-btn');const copyStatus = document.getElementById('copy-status');// 修改handleFile函数function handleFile(file) {// ... 原有代码 ...reader.onload = function(e) {audio.src = e.target.result;const base64 = e.target.result.split(',')[1];resultDiv.textContent = base64;// 启用复制按钮copyBtn.disabled = true;copyStatus.className = 'copy-status';  // 重置状态};}// 新增复制功能copyBtn.addEventListener('click', async () => {try {const text = resultDiv.textContent;if (!text) {throw new Error('没有可复制的内容');}await navigator.clipboard.writeText(text);showCopyStatus('复制成功!', 'success');} catch (err) {showCopyStatus(`复制失败: ${err.message}`, 'error');}});// 新增状态显示函数function showCopyStatus(message, type) {copyStatus.textContent = message;copyStatus.className = `copy-status copy-${type}`;// 3秒后淡出提示setTimeout(() => {copyStatus.style.opacity = '0';}, 3000);}// 修改showError函数function showError(message) {// ... 原有代码 ...copyBtn.disabled = true;}</script><script>const dropZone = document.getElementById('drop-zone');const fileInput = document.getElementById('file-input');const audioPreview = document.getElementById('audio-preview');const resultDiv = document.getElementById('result');const errorMessage = document.getElementById('error-message');// 点击上传区域触发文件选择dropZone.addEventListener('click', () => fileInput.click());// 处理文件选择fileInput.addEventListener('change', handleFileSelect);// 处理拖放功能dropZone.addEventListener('dragover', (e) => {e.preventDefault();dropZone.style.backgroundColor = '#f0f0f0';});dropZone.addEventListener('dragleave', () => {dropZone.style.backgroundColor = '';});dropZone.addEventListener('drop', (e) => {e.preventDefault();dropZone.style.backgroundColor = '';const files = e.dataTransfer.files;if (files.length > 0) {handleFile(files[0]);}});function handleFileSelect(e) {const file = e.target.files[0];if (file) {handleFile(file);}}function handleFile(file) {// 验证文件类型if (!file.type.startsWith('audio/')) {showError('请选择有效的音频文件');return;}// 重置状态errorMessage.textContent = '';resultDiv.textContent = '';// 显示音频预览const audio = document.createElement('audio');audio.controls = true;audioPreview.innerHTML = '';audioPreview.appendChild(audio);audioPreview.classList.remove('hidden');// 读取文件const reader = new FileReader();reader.onload = function(e) {audio.src = e.target.result;// 获取Base64编码(去掉Data URL前缀)const base64 = e.target.result.split(',')[1];resultDiv.textContent = base64;};reader.onerror = function() {showError('文件读取失败');};reader.readAsDataURL(file);}function showError(message) {errorMessage.textContent = message;audioPreview.classList.add('hidden');resultDiv.textContent = '';}</script>
</body>
</html>
http://www.xdnf.cn/news/180217.html

相关文章:

  • 基于c++的LCA倍增法实现
  • log4cpp进阶指南
  • Dart中一个类实现多个接口 以及Dart中的Mixins
  • NestJS + Kafka 秒杀系统完整实践总结
  • 大语言模型的“模型量化”详解 - 04:KTransformers MoE推理优化技术
  • Android 理清 Gradle、AGP、Groovy 和构建文件之间的关系
  • 打孔包地解决PCB的串扰问题
  • 03_多线程任务失败解决方案
  • C#学习第19天:多线程
  • 关于 Web 服务器的五个案例
  • AI 应用同质化:一场看不见的资源 “吞噬战”
  • 人机鉴权和机机鉴权
  • Day26 -php开发05 -搭建个人博客三种实现:自己写前后端 套用现成模板 调用第三方模板引擎smarty 及三种方法的缺点
  • nextjs整合快速整合市面上各种AI进行prompt连调测试
  • Java学习手册:开发 Web 网站要知道的知识
  • 马哥教育Linux云计算运维课程
  • GIS开发笔记(16)解决基于osg和osgearth三维地图上添加placeNode图标点击不易拾取的问题
  • 火语言RPA--企业微信群通知
  • vue3 内置组件KeepAlive的使用
  • Spark Streaming核心编程总结(四)
  • QtDesigner中的Spacers弹簧/间隔器
  • 一主多从+自组网络,无线模拟量信号传输专治布线PTSD
  • C语言(3)—分支和循环
  • WinForm真入门(18)——DateTimePicker‌控件解析
  • 13.组合模式:思考与解读
  • MCP实战-本地MCP Server + Client实战
  • 创建一个开机自启的服务
  • 题海拾贝:P2858 [USACO06FEB] Treats for the Cows G/S
  • 大模型图像编辑那家强?
  • 多模态常见面试题