自定义H5音频组件

快应用之audio 做为一枚小白,之前快应用项目接触需要用到audio音频效果,但是快应用不支持h5的新标签< audio >。虽然有提供了音频接口,但是小白还是觉得无从下手,在网上搜了下也没有很好的参照,没有下手的方向,磕磕碰碰写出效果来,可能代码很幼稚不理想,分享出来希望可以得到指教。 1、首先接口声明,在manifest.json的"features"里写上 { “name”: “system.au... 阅读详情

自定义支持播放/暂停,进度条拖拽,静音/有声音播放的H5音频播放组件,效果图和具体实现代码如下:

在这里插入图片描述

  • HTML代码

    <!DOCTYPE html>
    <html lang="en">
    <style type="text/css">
        .audio {
            display: flex;
            align-items: center;
            justify-content: space-between;
        }
    
        .progress-bar-bg {
            width: 40%;
            background-color: #d9d9d9;
            position: relative;
            height: 2px;
            cursor: pointer;
        }
    
        .progress-bar {
            background-color: #649fec;
            width: 0;
            height: 2px;
        }
    
        .progress-bar-bg span {
            content: " ";
            width: 10px;
            height: 10px;
            border-radius: 50%;
            -moz-border-radius: 50%;
            -webkit-border-radius: 50%;
            background-color: #3e87e8;
            position: absolute;
            left: 0;
            top: 50%;
            margin-top: -5px;
            margin-left: -5px;
            cursor: pointer;
        }
    </style>
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;"
            name="viewport">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <meta name="format-detection" content="telephone=yes" />
        <title>H5播放音频</title>
    </head>
    
    <body>
        <audio src="music.mp3"></audio>
        <div class="audio">
            <image src="./img/play_ic.png" id="audioPlayer" onclick="handlePlay()"></image>
            <span id="currentTime">00:00</span>
            <div class="progress-bar-bg" id="progressBarBg">
                <div class="progress-bar" id="progressBar"></div>
                <span id="progressDot"></span>
            </div>
            <span id="duration">00:00</span>
            <image src="./img/voice_ic.png" id="MutePlayer" onclick="handleMute()"></image>
    </div>
    </body>
    </html>
    
  • DOM元素获取

    var audio = document.getElementsByTagName("audio")[0];
    var isPlay = false;
    var isMute = false;
    var audioPlayer = document.getElementById("audioPlayer")
    var MutePlayer = document.getElementById("MutePlayer")
    var progressBarBg = document.getElementById("progressBarBg")
    var progressDot = document.getElementById("progressDot")
    var currentTime = document.getElementById("currentTime")
    var duration = document.getElementById("duration")
    
  • 播放/暂停

    //   音频操作函数
    function handlePlay() {
        if (audio.paused) {
            // 开始
            audioPlayer.src = './img/suspend_ic.png';
            audio.play();
            duration.innerHTML = transTime(audio.duration);
        } else {
            // 暂停
            audioPlayer.src = './img/play_ic.png';
            audio.pause();
        }
    }
    
  • 进度条操作

    //   音频播放进度实时监听事件
    audio.addEventListener('timeupdate', function () {
        updateProgress();
    }, false);
    //   进度条更新方法
    function updateProgress() {
        var value = audio.currentTime / audio.duration;
        document.getElementById("progressBar").style.width = value * 100 + '%';
        document.getElementById("progressDot").style.left = value * 100 + '%';
        currentTime.innerHTML = transTime(audio.currentTime);
    }
    //   进度条点击事件
    progressBarBg.onmousedown = function (e) {
        if (!audio.paused || audio.currentTime !== 0) {
            var pgsWidth = progressBarBg.clientWidth || progressBarBg.offsetWidth;
            var rate = e.offsetX / pgsWidth;
            audio.currentTime = audio.duration * rate;
            updateProgress();
        }
    }
    //   进度条拖拽事件
    progressDot.addEventListener('touchstart', function (e) {
        if (!audio.paused || audio.currentTime !== 0) {
            var totalLength = progressBarBg.offsetWidth;
            var prevX = e.touches[0].clientX - progressDot.offsetLeft;
            document.addEventListener('touchmove', fnMove, false);
            document.addEventListener('touchend', fnEnd, false);
            function fnMove(e) {
                var difference = e.targetTouches[0].clientX - prevX;
                if (difference >= totalLength) {
                    difference = totalLength;
                } else if (difference <= 0) {
                    difference = 0;
                }
                var rate = difference / totalLength;
                audio.currentTime = audio.duration * rate;
                updateProgress();
            }
            function fnEnd(e) {
                document.removeEventListener('touchmove', fnMove, false);
                document.removeEventListener('touchend', fnEnd, false);
            }
        }
    }, false);
    
  • 静音

     //   音量操作函数
     function handleMute() {
         if (audio.muted) {
             //   取消静音
             MutePlayer.src = './img/voice_ic.png';
             audio.muted = false;
         } else {
             //   静音
             MutePlayer.src = './img/mute_ic.png';
             audio.muted = true;
         }
     }
    
  • 其他

    // 监听播放完成事件
    audio.addEventListener('ended', function () {
        audioEnded();
    }, false);
    
    /**
    * 播放完成时把进度调回开始的位置
    */
    function audioEnded() {
        document.getElementById("progressBar").width = 0;
        document.getElementById("progressDot").left = 0;
        audioPlayer.src = './img/play_ic.png';
    }
    /**
    * 音频播放时间换算
    * @param {number} value - 音频当前播放时间,单位秒
    */
    function transTime(value) {
        if (!value) {
            return '00:00'
        }
        var time = "";
        var h = parseInt(value / 3600);
        value %= 3600;
        var m = parseInt(value / 60);
        var s = parseInt(value % 60);
        if (h > 0) {
            time = formatTime(h + ":" + m + ":" + s);
        } else {
            time = formatTime(m + ":" + s);
        }
        return time;
    }
    /**
    * 格式化时间显示,补零对齐
    * eg:2:4  -->  02:04
    * @param {string} value - 形如 h:m:s 的字符串 
    */
    function formatTime(value) {
       if (!value) {
           return ''
       }
       var time = "";
       var s = value.split(':');
       var i = 0;
       for (; i < s.length - 1; i++) {
           time += s[i].length == 1 ? ("0" + s[i]) : s[i];
           time += ":";
       }
       time += s[i].length == 1 ? ("0" + s[i]) : s[i];
       return time;
     }
    
H5音乐播放插件kaudio.js实战应用 kaudio.js 是一款轻量级、模块化的 JavaScript 音频控制库,基于 HTML5 Audio API 构建,旨在简化音频播放的复杂性。它封装了原生 API 的冗余操作,提供统一接口实现跨浏览器兼容的音频控制。音频播放器中的进度条不仅是展示当前播放位置的关键元素,更是用户进行时间轴跳转的主要操作入口。原生<audio>元素虽然自带控件,但样式固定、难以扩展,无法满足品牌化或响应式布局需求。因此,构建一个完全自定义的进度条组件成为提升播放器体验的核心任务之一。 阅读详情

相关推荐

html5(h5)播放mp3全浏览器兼容

html5(h5)播放mp3全浏览器兼容 兼容主流浏览器,兼容微信内置浏览器,兼容移动端浏览器 等等,html5

简单解决 H5无法播放mp3录音问题

简单解决 H5无法播放mp3录音问题

孤er尽悲欢绝的博客 1259

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3228

用H5实现简单的MP3MP4的播放

H5实现视频和音乐播放确实比Android简捷多了 首先就是源文件要添加进项目里面,这里我把MP3文件和MP4文件都放在了img文件夹下面, 然后就是代码的实现,其实代码也比较简单的,全都是调用指令,设置播放按钮,做一些语法处理啦,直接上代码了,不多说,毕竟我也是初学者<html> <head> <meta charset="utf-8" /> <ti

qq_36159785的博客 1万+

Latex | IEEE双栏排版中长公式的排版

IEEE双栏排版中,有时候公式过于长了,过宽,导致单栏排版不下。

qq_43466146的博客 1万+

使用pdfBox实现pdf转图片出现中文方块乱码 简单修改源码解决

参考文章 问题排查:使用pdfbox将pdf转image时STSong-Light字体中文乱码 pdfbox版本是2.0 日志中打印出类似这样的日志(例:Using fallback XXX for CID-keyed font STSong-Light),就说明系统没有安装STSong-Light字体,pdfbox使用XXX字体来替代了。如果出现方块,就说明没有这种字体,并且替代字体也没有,日志也有相应的其他提示。 正常操作就是安装缺失的 STSong-Light 字体,但是在网上搜到的都是 STSong

aji_csdn的博客 5266

H5页面播放音频

1、使用 <audio></audio> 标签(不推荐) H5代码: <div class="title" id="click"></div> <audio id="audio" src="xxx.mp3"></audio> JS代码: <script> $("#click").click(function () { let audio = document.getElementById("audio"); a

马赛克大战的博客 4102

NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案

本文主要介绍了NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

H5实现实时音频MP3上传至服务端

H5实现实时音频上传至服务端生成MP3背景实现方法音频采集服务器端源码前端页面源码如下:服务端源码 背景 最近由于项目需求,需要对接广播,实现在业务平台上集成话筒的实时喊话功能。没问题,很简单的SDK集成。然而这个项目我们连个苦逼的乙方都算不上,只能是作为第三方技术支撑,设备方没有SDK提供, 最后只给了两个API: 1、查询设备信息,连接设备信息的接口; 2、接收实时音频文件的传输接口; 然后需要我们通过websocket将实时的音频文件上传至设备厂家的服务器,同时发送设备连接命令,然后实现实时喊话功能。

zhang45362613的专栏 4781

STM32入门教程:图像处理

然后,我们使用 STM32 的 DSP 模块中的 arm_mean_u8 函数计算原始图像的平均值,并将结果存储在 meanValue 变量中。然后,我们需要编写代码配置 STM32 的外部中断输入引脚,并在中断处理函数中读取 OV7670 摄像头模块输出的图像数据。然后,我们需要编写代码配置 STM32 的 USB OTG 接口,并在回调函数中读取 USB 摄像头输出的图像数据。一、图像采集 图像采集是图像处理的第一步,我们需要将外部图像源的数据导入到 STM32 中进行处理。

2401_85625565的博客 1616

网络系统管理专栏-配套练习+知识点详解

网络系统管理专栏-配套练习+知识点详解

bfq05234214的博客 681

H5 处理ios端部分mp3文件播放不了

有些mp3文件在pc端,安卓端可以正常播放,但是在ios设备上却不能播放,大概是给音频源文件转换格式时没有使用转换工具,而是直接修改的后缀,比如将【demo.wav】直接修改成【demo.mp3】,这样直接修改后缀而产生的文件在ios端会导致解码失败无法播放;- 但这样处理有个缺点就是如果文件太大,生成的base64链接地址会特别大,有可能导致手机卡顿,具体我没测试,我猜是这样的( ̄▽ ̄)~*- 经测试在ios端能正常播放的mp3文件转成wav格式base64也是能播放的;

iVRJay的博客 3340

DB文件在编程中的作用及示例代码

通过使用DB文件,我们可以实现数据的持久化存储,并能够高效地进行数据的增删改查操作。在本文中,我们以SQLite数据库为例,演示了如何使用Python语言创建和操作DB文件的示例代码。在实际的编程中,我们可以根据具体的需求和使用的数据库系统来进行更复杂的操作和优化。通过使用DB文件,我们可以实现数据的持久化存储,确保数据在程序关闭后也能被保留,并且能够高效地进行数据检索和更新。在本文中,我们将探讨DB文件的作用,并提供一些示例代码展示如何在编程中使用DB文件。上述代码中,我们使用SQLite提供的。

CodeSpark的博客 1821

uniapp H5自定义封装 音频播放组件

先看效果 1.点击播放直接播放音频 2.拖动滑动条可以定位到相应位置播放 3.滑动条根据播放进度自动移动 4.可以点击左右箭头进行上下曲切换 <template> <view class="customAudio flex"> <view class="left"> <image :src="image" mode=""></image> </view> <view class="right">

qq_40907752的博客 2284

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 438

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

h5自定义audio样式

h5或web页面 自定义audio样式 此处实例为H5移动端 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定义audio样式</title> <style type="text/css"> ...

前端全栈干货分享|小程序|Vue3|CSS 动效|工程化|项目实战 2384

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

记一次h5视频音频使用经验

一个app项目中需要用到一些h5页面, 页面中是含音频、视频的。video,audio原生组件ui太丑了,只有自定义了。 一开始视频组件在安卓内有些兼容问题,全屏功能无法使用,折腾了一会儿,在网上找到一个第三方播放器Aliplayer,阿里云推出的,第一次使用,感觉很方便,使用简单,能在线配置,根据所选配置会生成代码,直接拿来就用,用起来比较爽!有时候我们需要根据视频帧来生成视频封面图片(就是视...

海阔天空 1129

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

React-H5-Audio-Player完全指南:打造跨设备响应式音频播放体验

React-H5-Audio-Player是一款专为React应用设计的音频播放组件,它提供了直观的用户界面和跨设备兼容性,让开发者能够轻松集成高质量的音频播放功能到网页应用中。无论是在桌面端还是移动设备上,这款组件都能提供一致且流畅的音频播放体验,帮助你快速实现专业级别的音频播放器。 ## 🚀 快速开始:安装与基础使用 ### 一键安装步骤 要开始使用React-H5-Audio-Pla

gitblog_00507的博客 842

uniapp音频播放组件,兼容微信小程序、h5等,可倍数播放,快进快退,切换上下音频等

uniapp音频播放组件,兼容微信小程序、h5等,可倍数播放,快进快退,切换上下音频等

weixin_60266866的博客 3796

Vue实现自定义音频播放器组件

Vue实现自定义组件音频播放组件

dss0225的博客 4826

Sunshine 游戏串流主机快速教程:从安装到第一次投屏

Sunshine 是一台自托管的游戏串流主机:装到电脑上,局域网里的电视、手机、平板就能通过 Moonlight 客户端收到这台机器的画面和输入。装完你拥有一台随时待命的串流主机,外加一个位于 `https://localhost:47990` 的网页管理页,用来管应用和参数。这篇带你从安装走到第一次投屏,最后留给你一张参数速查表和一份排障清单。 ## 先定好你的用法 用法不同,后面动的参数就

gitblog_01078的博客 760

Atlas如何拉起与注册外部代理进程?ACP驱动器生命周期实战

[![Atlas 多编码代理源码控制工作台界面](https://raw.gitcode.com/GitHub_Trending/atlas115/atlas/raw/cf3207c2d08efd0596740fcff525031c9e7f0905/landing/og-image.png?utm_source=gitcode_repo_files)](https://link.gitcode.c

gitblog_00320的博客 966

5分钟上手React-H5-Audio-Player:从安装到自定义的快速教程

React-H5-Audio-Player是一个高度可定制的React音频播放器组件,采用TypeScript编写,兼容移动设备且支持键盘操作。本教程将帮助你在5分钟内完成从安装到基础自定义的全过程,让你轻松在React项目中集成专业级音频播放功能。 ## 📦 一键安装:3种快速上手方式 ### 使用npm安装 ```bash npm install react-h5-audio-playe

gitblog_00841的博客 434

React-H5-Audio-Player高级布局技巧:堆叠与水平模式切换指南

React-H5-Audio-Player是一款功能强大的React音频播放器组件,它在桌面和移动设备上都能提供清晰的时间指示器,让用户轻松掌控音频播放进度。本文将为你详细介绍如何利用该组件的高级布局功能,实现堆叠与水平模式的灵活切换,打造符合你项目需求的音频播放界面。 ### 布局模式概览 📱💻 React-H5-Audio-Player提供了四种基本布局模式,分别是堆叠(stacked

gitblog_00792的博客 926

Harbor 任务标注实战:用 annotate-task 提示词模板驱动 Agent 自动生成 README 与任务描述

在 Harbor 评测框架中,每个评测任务(Task)目录除了 `instruction.md`、`task.toml`、`tests/` 等核心文件外,通常还需要一份 README.md 和一句凝练的描述(description),用于归档、检索与展示。本篇文章围绕 [annotate-task.md](https://link.gitcode.com/i/8f1307e1a387dd59d7b

gitblog_01054的博客 277

H5音频组件

前言 上一篇简要阐述了H5基于wx-JS-SDK实现音频录制功能,本篇梳理一下音频播放列表组件,对于技术本身组件的实现度并不复杂,但核心就在于考虑组件性能以及逻辑的高聚合。 上一篇-音频录制 DEMO 图片演示了自上而下的点击播放效果: 需求分析 点击播放,播放当前,并清除之前状态; 正常对应播放、暂停状态; 控制音频组件UI展示样式; 思路及实现方式 思路 - 定义参数,组件接收音频资...

weixin_33910385的博客 1万+
上一篇: 微信小程序实现录制、试听、上传音频(带波形图)
下一篇: 微信小程序添加埋点
codezha
博客等级 码龄10年 28粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值