uview开发音乐播放器
作者:互联网
准备工作:1,在电脑下载了qq音乐客户端,然后下载了歌曲源文件,并转换格式为mp3格式(可自行百度线上转化即可),2,从控制台拿到歌曲的base64歌词,转码后变成带时间轴的歌词。
收藏列表:
<template>
<view class="my-collection">
<u-tabs :activeStyle="{
color: '#31c27c',
fontWeight: 'bold',
transform: 'scale(1.05)'
}" :scrollable='false' :list="collectionList" @click="click"></u-tabs>
<view class="song-con">
<view class='song-list'>
<view class="play-btn">
<u-button class="play-btn" type="primary" color="#fff" text='播放全部' icon="play-circle-fill">
</u-button>
</view>
<view class='song-btn'>
<u-button type="primary" color="#fff" icon="list-dot"></u-button>
<u-button type="primary" color="#fff" icon="arrow-downward"></u-button>
<u-button type="primary" color="#fff" icon="share-square"></u-button>
</view>
</view>
<view class='song-list' v-for="song in songList" :key='song._id'>
<view class="play-btn">
<u-button type="primary" color="#fff" :text='song.title' @click='handleSongClick(song._id)'>
</u-button>
</view>
<view class='song-btn'>
<u-button type="primary" color="#fff" icon="eye"></u-button>
<u-button type="primary" color="#fff" icon="download"></u-button>
<u-button type="primary" color="#fff" icon="more-dot-fill"></u-button>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
collectionList: [{
name: '歌曲83',
}, {
name: '专辑4',
}, {
name: '歌单21'
}, {
name: '视频3'
}, ],
songList: [],
loading: false
}
},
methods: {
list(e) {
this.loading = true
uni.showLoading({
title: '加载中'
});
uniCloud
.callFunction({
name: 'list',
data: {
limit: 300,
offset: 0,
keyWord: e ? e.detail.value : ''
}
})
.then(res => {
console.log(res.result.data, 0)
this.songList = res.result.data
uni.hideLoading()
this.loading = false
})
},
handleSongClick(id) {
uni.navigateTo({
url: `/pages/song/song?id=${id}`
})
}
},
created() {
this.list()
}
}
</script>
<style lang="scss" scoped>
.my-collection {
.u-tabs {
background: #fff;
::v-deep .u-tabs__wrapper__nav__line {
background: #31c27c !important;
}
}
.song-con {
padding: 10px;
background: #fff;
margin-top: 10px;
.song-list {
display: flex;
justify-content: space-between;
.play-btn {
justify-content: left;
}
::v-deep .u-icon__icon {
color: gray !important;
}
::v-deep .u-button__text {
color: gray;
}
.song-btn {
display: flex;
width: 40%;
}
}
}
}
</style>
播放页面:
<template>
<view class='song-con' :style="{height: screenHeight + 'px' }">
<view class="image-con">
<u--image id='img' class='image-shape' src="https://cdn.uviewui.com/uview/album/1.jpg"></u--image>
</view>
<view class="song-center">
<view class="song-left">
<u--text class='song-name' :text='song.name'></u--text>
<view class="song-info">
<u--text :text='song.author'></u--text>
<u--text class='follew' :text="song.follow ? '已关注' : '关注'"></u--text>
<u--text :text='song.quality'></u--text>
</view>
<view class='lyric' ref='lyric'>
<u--text :class="{each:true, choose: (index==lyricIndex)}"
v-for='(item,key,index) in currentMUsicLyric' :text='item' :key='key'></u--text>
</view>
</view>
<view class="song-right">
<u-button :icon="song.isCollection ? 'heart' : 'heart-fill' "></u-button>
</view>
</view>
<view class='song-foot'>
<view class='slide-con'>
<view> {{current == 0 ? '00:00' : format(current)}}</view>
<u-slider @moving="moveing" @end="endMove" v-model="slideWidth" @start="startMove" :unidirectionalDatatTransfer="true">
</u-slider>
<view>{{format(duration)}}</view>
</view>
<view class='song-tool'>
<u-button icon='reload' @click='playMusic(songId)'></u-button>
<u-button icon='rewind-left-fill' @click='prev()'></u-button>
<u-button :icon="paused ? 'play-circle-fill':'pause-circle-fill' "
@click="audio.paused ? play() : audio.pause()"></u-button>
<u-button icon='rewind-right-fill' @click='next()'></u-button>
<u-button icon='list' @click='openList()'></u-button>
</view>
</view>
<u-popup :show="ifShowList" mode="bottom">
<view class="song-length">播放列表({{songList.length}}首)</view>
<view v-for="item in songList" :key='item._id' class="song-list">
<div class='song-header' @click='playClick(item._id)'>
<view class="song-title">{{item.title}}</view>
<view class='song-author'>- {{item.author}}</view>
</div>
<u-button icon='close'></u-button>
</view>
<view class='song-close' @click='ifShowList = false'>关闭</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
return {
song: {},
screenHeight: '',
audio: uni.createInnerAudioContext(),
slideWidth: '',
paused: true, //是否处于暂停状态
current: 0, //当前进度(s)
duration: 0, //总时长(s),
currentMUsicLyric: {},
lyricIndex: 0,
rotateval: 0,
seek: false, //是否处于拖动状态
Interval: null, // 定时器
loadding: false,
ifShowList: false,
songList: [],
songId: ''
}
},
onLoad(option) {
this.songId = option.id
this.read(option.id || '5f64c4cca2a89f21dbd4fd66')
},
methods: {
endMove() {
const pr = (this.slideWidth / 100) * this.duration
this.audio.seek(pr)
this.play()
},
moveing() {
console.log(this.seek)
this.play()
this.seek = true
const pr = (this.slideWidth / 100) * this.duration
this.current = pr
console.log(this.seek)
},
startMove(){
console.log("move")
},
//返回prev事件
prev() {
// 找歌曲
let targetIndex = this.songList.findIndex((item) =>
item._id == this.songId
)
console.log('targetIndex', targetIndex)
if (targetIndex == 0) {
// 第一首的时候播放最后一首,循环
this.songId = this.songList[this.songList.length - 1]._id
} else {
this.songId = this.songList[targetIndex - 1]._id
}
this.playMusic(this.songId)
},
//返回next事件
next() {
// 找歌曲
let targetIndex = this.songList.findIndex((item) =>
item._id == this.songId
)
console.log('targetIndex', targetIndex)
if (targetIndex == this.songList.length - 1) {
// 已经是最后一首播放第一首,循环
this.songId = this.songList[0]._id
} else {
this.songId = this.songList[targetIndex + 1]._id
}
this.playMusic(this.songId)
},
play() {
this.audio.play()
this.audio.autoplay = true
},
//格式化时长
format(num) {
if (num) {
return '0'.repeat(2 - String(Math.floor(num / 60)).length) + Math.floor(Number(num) / 60) +
':' + '0'
.repeat(2 - String(Math.floor(num % 60)).length) + Math.floor(num % 60)
}
},
getLyric(encodedlyric) {
let lyric = decodeURIComponent(escape(atob(encodedlyric)))
// 处理歌词,转化成key为时间,value为歌词的对象
let lyricArr = lyric.split('[').slice(1); // 先以[进行分割
let lrcObj = {};
lyricArr.forEach(item => {
let arr = item.split(']'); // 再分割右括号
// 时间换算成秒
let m = parseInt(arr[0].split(':')[0])
let s = parseInt(arr[0].split(':')[1])
arr[0] = m * 60 + s;
if (arr[1] != '\n') { // 去除歌词中的换行符
lrcObj[arr[0]] = arr[1];
}
})
// 存储数据
this.currentMUsicLyric = lrcObj;
},
rotate() {
let that = this
if (!that.paused) {
that.Interval = setInterval(function() {
var img = document.getElementById('img');
that.rotateval++;
img.style.transform = 'rotate(' + that.rotateval + 'deg)'
img.style.transition = '0.1s linear'
}, 100)
} else {
clearInterval(that.Interval)
that.Interval = null
}
},
read(id) {
this.loading = true
uni.showLoading({
title: '加载中'
});
uniCloud
.callFunction({
name: 'read',
data: {
id
}
})
.then(res => {
this.song = res.result.data[0] || {}
console.log("this.song", this.song)
this.getLyric(this.song.lyric)
// this.src =
this.audio.src = this.song.src
uni.setNavigationBarTitle({
title: `${this.song.title} - ${this.song.author}`
})
this.loading = false
uni.hideLoading();
})
},
list(e) {
this.loading = true
uni.showLoading({
title: '加载中'
});
uniCloud
.callFunction({
name: 'list',
data: {
limit: 300,
offset: 0,
keyWord: e ? e.detail.value : ''
}
})
.then(res => {
console.log(res.result.data, 0)
this.songList = res.result.data
uni.hideLoading()
this.loading = false
})
},
openList() {
console.log('open')
this.ifShowList = true
},
playMusic(id){
this.currentMUsicLyric = {}
this.read(id)
// 进度条清0
this.play()
// 歌词到最上面
this.lyricIndex = 0
// 图片旋转
this.rotateval = 0
clearInterval(this.Interval)
this.Interval = null
},
playClick(id){
this.playMusic(id)
this.ifShowList = false
}
},
mounted() {
// 获取歌曲列表
this.list()
this.screenHeight = uni.getSystemInfoSync().windowHeight
this.audio.onCanplay(() => {
this.current = this.audio.currentTime
this.duration = this.audio.duration
this.play()
console.log('音频能够播放了', this.current)
})
//音频进度更新事件
this.audio.onTimeUpdate(() => {
// console.log('音频进度条发生更新')
if (!this.seek) {
// console.log('重新更新')
this.current = this.audio.currentTime
}
if (!this.duration) {
this.duration = this.audio.duration
}
})
//音频播放事件
this.audio.onPlay(() => {
console.log('音频播放')
this.paused = false
this.rotate()
})
// 音频暂停事件
this.audio.onPause(() => {
console.log('音频暂停播放')
this.paused = true
this.rotate()
})
//音频完成更改进度事件
this.audio.onSeeked(() => {
// console.log('音频进度条完成')
this.seek = false
this.$forceUpdate()
})
},
watch: {
current(value) {
if (this.duration > 0) {
if (this.current === this.duration) {
this.slideWidth = 100
return
}
this.slideWidth = Number(((value / this.duration) * 100).toFixed(4))
let i = 0
// 循环歌词对象
for (let key in this.currentMUsicLyric) {
// key表示歌词对象中的时间,如果key等于歌曲进度value,改变当前歌词进度 lyricIndex
// console.log("value",key,parseInt(value))
if (+key == parseInt(value)) {
this.lyricIndex = i;
// 当歌词进度大于5,即播放到了第5句歌词,开始滚动
if (i > 3) {
this.$refs.lyric.$el.scrollTop = this.lyricIndex * 30;
}
}
i++;
}
}
},
}
}
</script>
<style lang="scss" scoped>
.song-con {
background-color: #fff;
padding: 10px 20px;
display: flex;
flex-direction: column;
.image-con {
display: flex;
flex: 0 0 auto;
justify-content: center;
align-items: center;
background: url('../../static/bg.jpeg');
background-position: center;
background-size: 100%;
width: 100%;
height: 250px;
border-radius: 15px;
::v-deep .u-image {
width: 150px !important;
height: 150px !important;
.u-image__image {
width: 150px !important;
height: 150px !important;
border-radius: 50% !important;
}
}
}
.song-center {
display: flex;
flex: 1 0 auto;
justify-content: space-between;
padding: 10px 5px;
.song-left {
.song-name {
::v-deep .u-text__value {
font-size: 20px !important;
white-space: nowrap;
font-weight: 600 !important;
padding: 10px 0;
}
}
.song-info {
display: flex;
padding: 10px 0;
::v-deep .u-text__value {
font-size: 13px !important;
white-space: nowrap;
}
.follew {
::v-deep .u-text__value {
padding: 2px 4px;
margin: 0 5px;
border: 1px solid gray !important;
border-radius: 10px !important;
font-size: 12px !important;
}
}
}
.lyric {
// width: 400px;
height: 110px;
// position: absolute;
// top: 360px;
// left: 20px;
background-color: #fff;
// 滚动条
overflow: auto;
color: #ddd;
font-size: 10px;
font-weight: normal;
padding: 5px 10px;
.each {
height: 30px;
// border: 1px solid #000;
line-height: 30px;
text-align: center;
}
.choose ::v-deep .u-text__value {
height: 30px;
line-height: 30px;
font-size: 20px;
color: #31c27c !important;
}
}
}
.song-right {
padding: 10px;
.u-button {
border: none;
}
}
}
.song-foot {
padding: 30px 0;
.slide-con {
display: flex;
justify-content: center;
.u-slider {
width: 80%;
}
::v-deep .uni-slider-track {
background: #31c27c !important;
}
}
.song-tool {
display: flex;
.u-button {
border: none;
}
}
}
/deep/.u-popup__content {
display: flex;
background-color: #2e2c2c !important;
opacity: 0.8;
padding: 15px 0 0 15px;
.song-length {
color: #fff;
}
.song-list {
display: flex;
border-bottom: 1px solid #3c3a3a;
.song-header {
display: flex;
align-items: center;
width: 90%;
.song-title {
font-size: 12px;
color: #fff;
padding-right: 10px;
}
.song-author {
color: #898686;
font-size: 8px;
}
}
.u-button {
width: 10%;
background-color: #2e2c2c;
opacity: 0.8;
border: none;
.uicon-close {
color: #898686 !important;
}
}
}
.song-close {
padding: 20px;
text-align: center;
color: #fff
}
}
}
</style>
云函数:read函数
'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
const collection = db.collection('music') // 获取music的集合对象
console.log('collection : ', collection)
const res = await collection.limit(event.limit).skip(event.offset).where({
title: new RegExp(event.keyWord)
}).get()
//返回数据给客户端
return res
};
list函数
'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
const id = event.id
const collection = db.collection('music')
const res=collection.where({
_id:id
}).get()//返回数据给客户端
return res
};
云服务平台数据库数据:music
{
"title": "错乱底线",
"text": "我错乱的底线",
"author": "南铃子",
"dynasty": "中",
"lyric": "W3RpOl0KW2FyOl0KW2FsOl0KW2J5OuaXtumXtOaIs+W3peWFt10KW29mZnNldDowXQpbMDA6MDAuMDBd6ZSZ5Lmx5bqV57q/IC0g5rWG57OK6Z+z5LmQClswMDowMC4zMF3or43vvJrljZfpk4PlrZAKWzAwOjAwLjYwXeabsu+8muWNl+mTg+WtkApbMDA6MDAuOTBd57yW5puy77yacG9sYXJpcwpbMDA6MDEuMjFd5ZCJ5LuW77ya5p2o6ZGr6ZSQClswMDowMS41MV3liLbkvZzkurrvvJrokovokosKWzAwOjAxLjgxXeWSjOWjsO+8mueajuaciApbMDA6MDIuMTJd5b2V6Z+z5biI77ya6aKc5ZiJ6L6wClswMDowMi40Ml3lvZXpn7PlrqTvvJoxODAzIFN0dWRpbwpbMDA6MDIuNzJd5re36Z+z77ya5byg5qCp6LWr77yIRXRoYW7vvIkKWzAwOjAzLjAzXeebkeWItu+8muiSi+i/sApbMDA6MDMuMzNdT1DvvJrplKbonIDooY3lv4YKWzAwOjAzLjY0XeOAjOeJiOadg+aJgOacieacque7j+iuuOWPr+ivt+WLv+S9v+eUqOOAjQpbMDA6MDQuMDVd5oiR6ZSZ5Lmx55qE5bqV57q/ClswMDowNS45MV3miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAwOjA3LjIwXQpbMDA6MDguODVd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMDoxMS41NV3ml6Dms5Xlho3ljLrliIYKWzAwOjEyLjY2XQpbMDA6MTMuNTld5LiN5pWi55yL5L2g5Ya35ryg55qE55y8ClswMDoxNS45OV0KWzAwOjE2LjUzXeW8uuaOqeaIkeeahOazqueCuQpbMDA6MTguMzZd5oiR54aE54Gt5omA5pyJ55qE54Gv6K+0552A5YaN6KeBClswMDoyMi4zNV0KWzAwOjIzLjEwXeaIkeaJv+iupOaIkeW+iOaDs+S9oApbMDA6MjUuMjBd6K+05LqG5pyA5ZCO5LiA6YGNClswMDoyNy4xNV0KWzAwOjI3LjgxXeaIkeS7rOWlveWDj+S4pOadoeW5s+ihjOeahOe6vwpbMDA6MzAuODRd5oCO5LmI6L+eClswMDozMi41OF3lkI7mnaXkvaDnmoTovazlj5jmiJHog70KWzAwOjM1LjI1Xei9u+aYk+eahOWIhui+qApbMDA6MzcuNDFd6YKj5byg6JaE5oOF5a+h5LmJ55qE6IS4ClswMDo0MC4wOF3orqnmiJHmsonpu5jlr6HoqIAKWzAwOjQzLjU5XeWTree6ouS6huecvOWciApbMDA6NDQuNDld5L2g5rKh5pyJ55yL5oiR5LiA55y8ClswMDo0Ny4wN10KWzAwOjQ3LjcwXeivieivtOedgOaAneW/tQpbMDA6NDkuMjNd5bCG6Ieq5bex6ZSB5Zyo5oi/6Ze0ClswMDo1MS45MF3kvaDliKDpmaTkuobmnIvlj4vlnIjnmoTnm7jniYcKWzAwOjU1Ljc3XQpbMDA6NTYuMzFd5L2g54ix5oiR55qE6K+B5o2u5Lmf55yL5LiN6KeBClswMTowMC4xNV0KWzAxOjAyLjAxXeS9oOivtOedgOaKseatiQpbMDE6MDMuNTFd5Y2055yL5LiN5Ye65pyJ5LqP5qygClswMTowNi4xNV0KWzAxOjA2LjcyXeaDs+e7meeahOS9k+mdogpbMDE6MDguMjVd5Y+q5ZCO5oKU5rS75Zyo5LuO5YmNClswMToxMS41Ml3miJHpgJ7lvLrnmoTmoLflrZDkvaDop4bogIzkuI3op4EKWzAxOjE1LjYzXeWPjei/h+adpeWNtOivtOaIkeWcqOiHquWvvOiHqua8lApbMDE6MjAuMDdd5oiR6ZSZ5Lmx55qE5bqV57q/ClswMToyMS45Nl3miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAxOjIzLjg4XQpbMDE6MjQuODdd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMToyNy41N13ml6Dms5Xlho3ljLrliIYKWzAxOjI5LjU4XeS4jeaVoueci+S9oOWGt+a8oOeahOecvApbMDE6MzIuNTVd5by65o6p5oiR55qE5rOq54K5ClswMTozNC4zOF3miJHnhoTnga3miYDmnInnmoTnga/or7TnnYDlho3op4EKWzAxOjM4LjYxXQpbMDE6MzkuMTJd5oiR5om/6K6k5oiR5b6I5oOz5L2gClswMTo0MS4yNV3or7TkuobmnIDlkI7kuIDpgY0KWzAxOjQzLjIwXQpbMDE6NDMuODZd5oiR5Lus5aW95YOP5Lik5p2h5bmz6KGM55qE57q/ClswMTo0Ni44OV3mgI7kuYjov54KWzAxOjQ4LjYzXeWQjuadpeS9oOeahOi9rOWPmOaIkeiDvQpbMDE6NTEuMjdd6L275piT55qE5YiG6L6oClswMTo1My40Nl3pgqPlvKDoloTmg4Xlr6HkuYnnmoTohLgKWzAxOjU2LjEwXeiuqeaIkeayiem7mOWvoeiogApbMDI6MDAuNzJdClswMjoxOC4wM13lk63nuqLkuobnnLzlnIgKWzAyOjE5LjUzXeS9oOayoeacieeci+aIkeS4gOecvApbMDI6MjIuMTFdClswMjoyMi43N13or4nor7TnnYDmgJ3lv7UKWzAyOjI0LjI3XeWwhuiHquW3semUgeWcqOaIv+mXtApbMDI6MjYuOTdd5L2g5Yig6Zmk5LqG5pyL5Y+L5ZyI55qE55u454mHClswMjozMC44MV0KWzAyOjMxLjM4XeS9oOeIseaIkeeahOivgeaNruS5n+eci+S4jeingQpbMDI6MzcuMDhd5L2g6K+0552A5oqx5q2JClswMjozOC41NV3ljbTnnIvkuI3lh7rmnInkuo/mrKAKWzAyOjQxLjc2XeaDs+e7meeahOS9k+mdogpbMDI6NDMuMjld5Y+q5ZCO5oKU5rS75Zyo5LuO5YmNClswMjo0Ni41M13miJHpgJ7lvLrnmoTmoLflrZDkvaDop4bogIzkuI3op4EKWzAyOjUwLjY3XeWPjei/h+adpeWNtOivtOaIkeWcqOiHquWvvOiHqua8lApbMDI6NTUuMTFd5oiR6ZSZ5Lmx55qE5bqV57q/ClswMjo1Ny4wM13miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAyOjU4Ljk1XQpbMDI6NTkuOTFd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMzowMi42MV3ml6Dms5Xlho3ljLrliIYKWzAzOjA0LjYyXeS4jeaVoueci+S9oOWGt+a8oOeahOecvApbMDM6MDcuNTld5by65o6p5oiR55qE5rOq54K5ClswMzowOS40NV3miJHnhoTnga3miYDmnInnmoTnga/or7TnnYDlho3op4EKWzAzOjE0LjE2XeaIkeaJv+iupOaIkeW+iOaDs+S9oApbMDM6MTYuMjld6K+05LqG5pyA5ZCO5LiA6YGNClswMzoxOC4yNF0KWzAzOjE4LjkwXeaIkeS7rOWlveWDj+S4pOadoeW5s+ihjOeahOe6vwpbMDM6MjEuOTNd5oCO5LmI6L+eClswMzoyMy42N13lkI7mnaXkvaDnmoTovazlj5jmiJHog70KWzAzOjI2LjM0Xei9u+aYk+eahOWIhui+qApbMDM6MjguNTBd6YKj5byg6JaE5oOF5a+h5LmJ55qE6IS4ClswMzozMS4xNF3orqnmiJHmsonpu5jlr6HoqIAKWzAzOjM1Ljc2XQpbMDM6MzcuODld5oiR6ZSZ5Lmx55qE5bqV57q/ClswMzozOS43OF3miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAzOjQxLjcwXQpbMDM6NDIuNjZd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMzo0NS4zOV3ml6Dms5Xlho3ljLrliIYKWzAzOjQ3LjQwXeS4jeaVoueci+S9oOWGt+a8oOeahOecvApbMDM6NTAuMzdd5by65o6p5oiR55qE5rOq54K5ClswMzo1Mi4yMF3miJHnhoTnga3miYDmnInnmoTnga/or7TnnYDlho3op4EKWzAzOjU2Ljk0XeaIkeaJv+iupOaIkeW+iOaDs+S9oApbMDM6NTkuMDdd6K+05LqG5pyA5ZCO5LiA6YGNClswNDowMC45OV0KWzA0OjAxLjY4XeaIkeS7rOWlveWDj+S4pOadoeW5s+ihjOeahOe6vwpbMDQ6MDQuNzFd5oCO5LmI6L+eClswNDowNi40NV3lkI7mnaXkvaDnmoTovazlj5jmiJHog70KWzA0OjA5LjA5Xei9u+aYk+eahOWIhui+qApbMDQ6MTEuMjhd6YKj5byg6JaE5oOF5a+h5LmJ55qE6IS4ClswNDoxMy45Ml3orqnmiJHmsonpu5jlr6HoqIA=",
"songId": "0577b16c-7f02-49ea-943c-ff9311b7af31",
"src": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-987c710a-fa8a-47f9-b416-7c745367d051/028a932c-11c1-43cc-9da2-8e4363ba7042.mp3"
}
标签:播放器,flex,uview,console,log,song,音乐,important,id 来源: https://www.cnblogs.com/sinceForever/p/16482013.html