https://www.xuanmo.xin/1784.html

浏览器实现HTML5发送语音功能

发布于 分类: Html5 & CSS3案例 0 220

   这是一次后台同事让做的一个功能,但是在手机端兼容不好,Safari清一色不支持,导致后来没有用上,想看效果的伙伴可以用pc端浏览器打开模拟手机的功能查看,查看demo链接移步文章尾部。

   也是借助插件实现的,插件主要做了AudioContext的一些封装,处理录好的音频转换成mp3文件,我这里只做了录音功能,发送到服务器的操作没用做,具体效果图如下:

主要功能代码:

   html代码


<!-- 头部标题 -->
<div class="header-wrap">Jon</div>
<!-- 主体内容区 -->
<div class="content-wrap">
    <!-- 发送消息内容 -->
    <div class="wrap content">
        <ul class="voice-wrap"></ul>
    </div>
    <!-- 发送语音按钮 -->
    <div class="wrap inp-wrap">
        <input type="button" value="按住说话">
    </div>
    <!-- 录制语音弹出层 -->
    <div class="hide-tips-wrap">
        <i class="tips-icon"></i>
        <span class="tips-txt">松开发送消息</span>
    </div>
</div>

   js代码


// 禁止浏览器鼠标右键功能
document.oncontextmenu = function() {
    return false;
}
// 创建一个录音对象
var recorder = new MP3Recorder({
    funCancel: function (msg) {
        console.log(msg);
        recorder = null;
    }
});
var mp3Blob,
    oBtn = document.querySelector('input[type="button"]'),
    oHideTips = document.querySelector('.hide-tips-wrap'),
    oMarkIcon = oHideTips.querySelector('.tips-icon'),
    oTipsTxt = oHideTips.querySelector('.tips-txt');
oBtn.addEventListener('touchstart', function() {
    recorder.start();
    oHideTips.style.display = 'block';
});
oBtn.addEventListener('touchend', function() {
    recorder.stop();
    recorder.getMp3Blob(function (blob) {
        mp3Blob = blob;
        var url = URL.createObjectURL(mp3Blob),
            // 获取语言列表容器
            oWrap = document.querySelector('.voice-wrap'),
            // 创建li
            oLi = document.createElement('li'),
            // 创建audio标签
            oAudio = document.createElement('audio'),
            // 创建a标签
            oHref = document.createElement('a'),
            // 创建播放语音显示按钮
            oSpanPlay = document.createElement('span'),
            // 创建播放语音总时间
            oNumberBox = document.createElement('i'),
            // 创建头像img
            oImg = new Image();
        // 给audio标签添加媒体链接
        oAudio.src = url;
        // 给a标签添加下载链接
        oHref.href = url;
        oHref.download = new Date().toISOString() + '.mp3';
        oHref.innerHTML = oHref.download;
        // 给图片添加路径
        oImg.src = '../images/picture.jpg';
        oSpanPlay.className = 'play-wrap';
        oNumberBox.className = 'num-box';
        setTimeout(function() {
            var nDuration = conversionTime( oAudio.duration );
            // 判断时间是否少于一秒
            if( isNaN(nDuration) || nDuration == 0 ) {
                oMarkIcon.style.backgroundImage = 'url(../images/mark.png)';
                oTipsTxt.innerText = '说话时间太短';
                // 关闭提示层
                setTimeout(function() {
                    oHideTips.style.display = 'none';
                    oMarkIcon.style.backgroundImage = 'url(../images/voice.png)';
                    oTipsTxt.innerText = '松开发送消息';
                }, 500);
            } else {
                oNumberBox.innerText = nDuration + '″';
                // 将创建好的对象放入li标签
                oLi.appendChild(oAudio);
                oLi.appendChild(oHref);
                oLi.appendChild(oImg);
                oLi.appendChild(oSpanPlay);
                oLi.appendChild(oNumberBox);
                oLi.className = 'clearfix';
                // 将li标签放入语言列表容器
                oWrap.appendChild(oLi);
                // 获取播放语音按钮总的宽度
                var nSpanTotalWidth = parseFloat(getStyle(oLi, 'width')) * 0.7 - oSpanPlay.offsetWidth;
                // 当前播放按钮宽度  当前距离 = 当前时间 / 总时间 * 总距离 + 初始距离
                oSpanPlay.style.width = nDuration / 60 * nSpanTotalWidth + oSpanPlay.offsetWidth - 2 + 'px';
                var bMark = true;
                // 播放语音
                oSpanPlay.onclick = function() {
                    if( bMark ) {
                        this.style.backgroundImage = 'url(../images/voiceplayer1.gif)';
                        oAudio.play();
                        oAudio.addEventListener('timeupdate', function() {
                            if( this.ended ) {
                                oSpanPlay.style.backgroundImage = 'url(../images/voice2.png)';
                            }
                        });
                    } else {
                        this.style.backgroundImage = 'url(../images/voice2.png)';
                        oAudio.pause();
                    }
                    bMark = !bMark;
                }
                // 关闭提示层
                setTimeout(function() {
                    oHideTips.style.display = 'none';
                }, 500);
            }
        }, 100);
    });
});
// 转换毫秒时间为秒
function conversionTime( t ){
    var s = Math.floor( t % 60 );
    return s;
}
// 获取样式
function getStyle( obj, attr ) {
    return window.getComputedStyle(obj, null)[attr]
}

在线展示

作者专栏:Xuanmo

前端爱好者,热爱前端开发,欢迎和我成为朋友。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

https://www.xuanmo.xin/wp-content/themes/xuan/expression.php
表情
贴图
表情加载中...

换一张

已经没有了!