PC页面播放Mp3文件异步请求:

业务中需求,操作需要,页面点击播放mp3文件,要求点击播放,播放时点击,停止!

1.服务端代码实现如下(使用springmvc):

 @RequestMapping("/listening")
    public void myWorkPage(String dfsAttachPath, HttpServletRequest request, HttpServletResponse response) {
//        请求参数:dfsAttachPath = "springSong.mp3";
        try {
            // 文件服务器地址
            String url = "http://172.16.5.104:8888/" + dfsAttachPath;
            CloseableHttpResponse closeableHttpResponse = HttpClientUtil.httpOrHttpsGetHttpResponse(urlPath);
            long length = closeableHttpResponse.getEntity().getContentLength();
            InputStream is = closeableHttpResponse.getEntity().getContent();

//            此处是采用本地文件进行测试
//            File file = new File("E:\\springSong.mp3");
//            InputStream is = new FileInputStream(file);
//            long length = file.length();

            response.addHeader("Content-Length", length + "");
            response.addHeader("Content-Type", "audio/mpeg;charset=UTF-8");
            ServletOutputStream os = response.getOutputStream();
            int len;
            byte[] b = new byte[2048];
            while ((len = is.read(b)) != -1) {
                os.write(b, 0, len);
            }
            is.close();
            os.close();
        } catch (Exception e) {
            logger.error("===========获取音频文件失败===========",e);
        }
    }

2.前端代码如下:

页面图片按钮:

<img alt='播放' src='../../images/audio/play.png' width='18' class='playAudio'/>

js部分代码(使用jquery):


vvar AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext || window.oAudioContext;
var audioCtx = AudioContext ? new AudioContext() : '';
var source = null;
// Jquery监听图片按钮
$(document).on('click','img.playAudio',function(){
    var obj = $(this);
    if(obj.hasClass('running')){
        if(source){
            source.stop()
            // source.currentTime = 0; //如只暂停则不需要此行
        }
        return;
    }
    var audioPath = obj.siblings('span').text(); // 此变量是音频文件名springSong.mp3
    var playIcon = '../../images/audio/play.png';
    obj.addClass('running'); // 只为区别是否在播放音频springSong.mp3
    var urlPath = "/messageCenter/listening?dfsAttachPath=" + encodeURIComponent(audioPath);
    var type = "GET";
// 此处只能使用原生ajax请求后台回去音频流,不能使用jquery的ajax
    var xhr = new XMLHttpRequest();
    xhr.open(type, urlPath);
    xhr.responseType = 'arraybuffer';// 返回type必须是arrayBuffer
    xhr.onload = function(e) {
        var res = this.response;
        if (res) {
            try{
                // 处理音频代码,播放音频
                audioCtx.decodeAudioData(res, function(buffer){
                    createSound(buffer, obj)
                })
            }catch(err){
                layer.msg('浏览器不支持播放音频');
            }
        }
    };
    xhr.onerror = function() {
        obj.attr('src', playIcon);
        obj.removeClass('running');
        layer.msg('音频加载失败..');
    };
    xhr.send();

});

// 播放音频的操作
function createSound(buffer, obj) {
    if (audioCtx.state != 'running') {
        console.log('重启audioCtx');
        audioCtx.resume();
    }
    var playIcon = '../../images/audio/play.png';
    var stopIcon = '../../images/audio/stop.png';
    obj.attr('src',stopIcon);
    var analyser = audioCtx.createAnalyser();
    var gainNode = audioCtx.createGain();
    source = audioCtx.createBufferSource();
    source.buffer = buffer;
    source.connect(analyser);
    analyser.connect(gainNode);
    gainNode.connect(audioCtx.destination);
    source.loop = false;
    source.start(0); // 播放
    source.addEventListener('ended', function (event){
        obj.attr('src', playIcon );
        obj.removeClass('running');
    });
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值