美文网首页
音乐拖动上传播放(梁王的开发笔记)

音乐拖动上传播放(梁王的开发笔记)

作者: 梁王io | 来源:发表于2017-06-24 21:39 被阅读40次

前言

今天实现一个拖动音乐上传的demo(demo在线地址待补充)

准备工作

阅读这篇开发笔记之前,请读者具备以下知识点

联动
Web Audio API 从上传到播放(梁王的理论自习室)(未完成)
drop事件及拖动文件

源码解析

废话不多说,直接上码了
下面是vue里面template的内容

<div id="holder" 
    :class="{hover:isdragging}"
    @drop.prevent="uploadMusic($event)"
    @dragover.prevent="dragover($event)"
    @dragend="dragend()">
</div>

这是vue,如果读者没有vue开发经验也没关系,这里主要绑定了三个事件,其中加了prevent的相当于最先加了一句preventdefault,不然拖文件到浏览器会直接打开url,让我们看看这三个事件的代码。

dragover(event) {
    this.isdragging = true;
},
dragend() {
    this.isdragging = false;
},
uploadMusic(event) {
    let self = this
    console.dir(event)
    console.dir(event.dataTransfer)
    console.dir(event.dataTransfer.files[0])
    let file = event.dataTransfer.files[0]
    if (file.type.match('audio*')) {
        var reader = new FileReader()
        // read the mp3 and decode the audio.
        reader.onload = function(readEvent) {
            self.context.decodeAudioData(readEvent.target.result)
                .then(function(buffer) {
                    self.mediaBuffer = buffer;
                    self.playStream();
                })
        };

        reader.readAsArrayBuffer(file);
    }
},

注:context就是我存的一个this.context = new AudioContext();
dragover和dragend没啥好说的,核心在于触发drop后执行的uploadMusic函数。

拖动后event里面的dataTransfer就有我们拖动过去的文件了,具体读者可以参考drop事件及拖动文件里关于dataTransfer的部分或者自己查阅相关资料。

我们首先获取到了一个文件对象file

let file = event.dataTransfer.files[0]

然后我们新建了一个FileReader准备读取这个文件,读取完后调用decodeAudioData(AudioContect的方法)异步的解码ArrayBuffer里面的音频文件数据,解码完后我们调用了playStream方法,下面是其简化后的代码

playStream( {
    this.mediaSource = this.context.createBufferSource();   //context是之前创建的一个AudioContext对象
    this.mediaSource.buffer = this.mediaBuffer;                   //mediaBuffer是之前解码后保存下来的buffer
    this.mediaSource.connect(this.context.destination);     
    this.mediaSource.start();
}

context.createBufferSource返回一个AudioBufferSourceNode对象
这里有个继承关系AudioBufferSourceNode < AudioScheduledSourceNode < AudioNode
connect是AudioNode的一个方法,用来连接一个输出,这里this.context.destination相当于客户端计算机上的一个音频播放设备,相当于把start之后输出到这个音频设备(也就是播放音乐)
如此,一个将音乐拖动到指定div后播放的demo完成喽。

在线demo

等我把整个骚东西弄完先

相关文章

  • 音乐拖动上传播放(梁王的开发笔记)

    前言 今天实现一个拖动音乐上传的demo(demo在线地址待补充) 准备工作 阅读这篇开发笔记之前,请读者具备以下...

  • Android 仿抖音音频裁剪控件

    效果图 功能要求:绘制音频效果,音乐播放后进度滚动,控件可拖动,拖动后获取新的起始时间(后期会加入根据音乐各个时段...

  • 音乐播放

    日常开发中所用到的音乐播放 ,除了音乐播放器之外就是音效的播放: 音效播放 音乐播放 音乐播放指的是用音乐播放框架...

  • Android音乐播放器开发小记——项目简介

    Android音乐播放器开发小记——项目简介 Android音乐播放器开发小记——功能实现1 Android音乐播...

  • seekbar填坑记

    需求效果: 项目中要求做一个带有音乐倒计时播放功能的拖动条,设计稿效果图如下: 图中白条位置代表音乐播放起始点,红...

  • Android 拖动条SeekBar的简单使用

    在Android开发中,拖动条常常用于对系统某种数值的设置,例如播放视频和音量等都会用到拖动条SeekBar。Se...

  • 2018-03-19 音乐播放器(一)

    笔记如下 进度条跟随音乐播放滑动 音乐暂停的方法

  • CircularSlider半弧形滑动条

    一、半圆弧型滑块的设计 最近项目中需要用到半圆弧形滑块,其作用和UISlider差不多,用于拖动改变播放音乐的播放...

  • 直播专题问题排查-拖动不准(八)

    拖动不准 1. 问题现象 播放过程中,拖动进度条后,实际播放的位置跟松开拖动时的位置相差很远。 2. 问题排查 由...

  • 关于Android音频播放的焦点问题

    前段时间开发一款有音乐播放功能的app,当然还是用到了MediaPlayer来实现音乐的播放。开发的过程中遇到了不...

网友评论

      本文标题:音乐拖动上传播放(梁王的开发笔记)

      本文链接:https://www.haomeiwen.com/subject/xxzkcxtx.html