音乐 组件 (音频, 视频)

目的功能:

  1. axios 请求获取歌曲的 url 以及 封面照片
  2. 切换歌曲
  3. 歌单的展示

演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
网易云音乐接口 github地址

https://github.com/Binaryify/NeteaseCloudMusicApi

安装

git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git

在他的目录下

npm install

运行

node app.js

运行后我么可以在

http://localhost:3000/

打开文档
在这里插入图片描述
借此我们可以请求歌单和歌曲的 url 地址 , 歌曲照片地址等等,详细功能可以自己查看

以上全部借助别人的 api 接口

这里重点强调一下 获取歌曲 url 的 api
在这里插入图片描述
需要传入歌曲的 id 返回 url 地址

template

<template><div class="music-container" ref="music-container"><p v-show="isShowList">歌单: {{ belong }}</p><div class="music-audio"><audio ref="audio" autoplay="autoplay" :src="songsList[currentIndex].url" loop="loop"></audio><img :src="songsList[currentIndex].picUrl" alt="" style="width: 60px; height: 60px;border-radius: 50%;" ref="audio-pic" @click="playMusic()"></div><ul><li @click="showList"><span v-if="isShowList">关闭播放列表</span><span v-else>打开</span></li><li v-for="(item, index) in songsList" @click="playMusic(index)" v-show="isShowList"><span>{{ item.name }}</span> <span>{{ item.ar + "" }}</span></li></ul></div>
</template>

这里需要修改为你自己的信息

<script>
import axios from "axios"
export default {name: 'App',components: {},data: function () {return {// 歌曲名称 歌曲url 照片url 作者名称songsList: [{name: '未知', url: '', picUrl: '', ar: ''}],currentIndex: 0,belong: '',musicTimer: null,musicTime: 0,isShowList: true}},methods: {//showList:function () {this.isShowList = !this.isShowListif (!this.isShowList) {this.$refs["music-container"].style.width = "90px"this.$refs["music-container"].style.height = "120px"this.$refs["music-container"].style.transition = "1s"} else {this.$refs["music-container"].style.width = "270px"this.$refs["music-container"].style.height = ""}},// 控制音乐播放playMusic: function (index) {if (index === undefined) {} else if (this.currentIndex !== index) {this.currentIndex = indexthis.musicTime = 0return true;}if (this.$refs.audio.paused) {this.$refs.audio.play()this.isPlaying = !this.isPlayingthis.musicTimer = setInterval(() => {this.musicTime += 1this.$refs["audio-pic"].style.transform = "rotate(" + this.musicTime + "deg)";},100)return true;}else  {this.$refs.audio.pause()clearInterval(this.musicTimer)this.$refs["audio-pic"].style.transitionDuration = this.musicTime;}},/*** 音乐,网络请求* */// 获取用户的 idgetUserId:function () {// 网易云接口axios.get('http://localhost:3000/login/cellphone?phone=修改为你的电话&password=修改为你的密码').then(res => {this.getList(res.data.account.id)})},// 获取用户的歌单getList:function (id) {axios.get('http://localhost:3000/user/playlist', {params: {uid: id}}).then(res => {// 选择要选择的歌单this.belong = res.data.playlist[1].namethis.getSongsId(res.data.playlist[1].id)})},// 获取歌单中 歌的id, 名字, 照片路径// 一次最多请求十首歌曲getSongsId:function (id) {axios.get('http://localhost:3000/playlist/track/all', {params: {id: id,limit: 10}}).then((res) => {// console.log(res.data.songs)// console.log(res.data.songs[0].name)// console.log(res.data.songs[0].id)// console.log(res.data.songs[0].al.picUrl)this.getSongs(res.data.songs)})},// 获取音乐getSongs:function (res) {for (let i = 0; i < res.length; i++) {// console.log(res[i].name)// console.log(res[i].id)// console.log(res[i].al.picUrl)this.getSong(res[i])}console.log(this.songsList)},getSong:function(items) {axios.get('http://localhost:3000/song/url', {params: {id: items.id}}).then(res => {console.log(res.data.data[0].url)if (this.songsList[0].name === '' || this.songsList[0].name === '未知') {this.songsList[0].name = items.namethis.songsList[0].url = res.data.data[0].urlthis.songsList[0].picUrl = items.al.picUrlthis.songsList[0].ar = items.ar.map(it => {return it.name})} else {this.songsList.push({name: items.name,url: res.data.data[0].url,picUrl: items.al.picUrl,ar: items.ar.map(it => {return it.name})})}})}},mounted() {// 获取音乐this.getUserId()}
}
</script>

样式的话,自己玩去

<style lang="less" scoped>
* {padding: 0;margin: 0;box-sizing: border-box;
}
.music-container {text-align: center;color: #bbbbbb;width: 270px;background-color: transparent;border: 1px solid black;border-radius: 20px;
}.music-audio {width: 100%;display: flex;& > img {margin: 10px;}& > span {margin: auto;}
}button {width: 20px;height: 20px;border-radius: 50%;outline: none;background-color: transparent;border: none;color: #bbbbbb;
}ul {width: 100%;list-style: none;display: flex;flex-direction: column;border-top: 1px solid black;font-size: 8px;color: #bbbbbb;li {padding: 10px 0;border-bottom: 1px solid black;display: flex;justify-content: space-evenly;align-items: center;span {width: 40%;text-align: center;overflow: hidden;white-space: nowrap;text-overflow-ellipsis: ellipsis;}}& > li:last-child {border-bottom: none;}& > li:first-child {border-bottom: none;}
}

目录结构

在这里插入图片描述
vue.config.js

// vue.config.js
const path =  require('path');
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
const resolve = (dir) => path.join(__dirname, dir);
module.exports = {chainWebpack: config => {config.resolve.symlinks(true); // 修复热更新失效// 如果使用多页面打包,使用vue inspect --plugins查看html是否在结果数组中config.plugin("html").tap(args => {// 修复 Lazy loading routes Errorargs[0].chunksSortMode = "none";return args;});config.resolve.alias // 添加别名.set('@', resolve('src')).set('@assets', resolve('src/assets')).set('@components', resolve('src/components')).set('@views', resolve('src/views')).set('@store', resolve('src/store'));},devServer: {overlay: { // 让浏览器 overlay 同时显示警告和错误warnings: true,errors: true},host: "localhost",port: 8081, // 端口号https: false, // https:{type:Boolean}open: true, //配置自动启动浏览器hotOnly: true, // 热更新// proxy: 'http://localhost:8080'   // 配置跨域处理,只有一个代理proxy: { //配置多个跨域"/api": {target: "http://172.11.11.11:3000",changeOrigin: true,// ws: true,//websocket支持secure: false,pathRewrite: {"^/api": "/"}}}}
}

bable.config,js

module.exports = module.exports = {presets: [ '@vue/cli-plugin-babel/preset' ],"plugins": [["component",{"libraryName": "element-ui","styleLibraryName": "theme-chalk"}]]
}

App.vue

<template><div id="app"><music-container></music-container></div>
</template><script>
import MusicContainer from "./components/MusicContainer";
export default {name: 'App',components: {MusicContainer}
}
</script><style lang="less">
* {padding: 0;margin: 0;box-sizing: border-box
}
body {height: 100vh;width: 100vw;background-image: url("~@/assets/b.jpg");background-repeat: no-repeat;background-size: cover;background-position: center;
}
</style>

and 附加视频播放器的思路

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title></title><!-- 引入字体图标的文件--><link rel="stylesheet" href="css/font-awesome.min.css"/><style>*{margin: 0;padding: 0;}/*多媒体标题*/figcaption{text-align: center;line-height: 150px;font-family: "Microsoft Yahei";font-size:24px;}/* 播放器*/.palyer{width: 720px;height: 360px;margin:10px auto;border: 1px solid #000;background: url(images/loading.gif) center no-repeat #000;background-size:auto 100%;position: relative;border-radius: 20px;}.palyer video{height:100%;display: block;margin:0 auto;/*display: none;*/}/* 控制条*/.controls{width: 700px;height:40px;background-color: rgba(255, 255, 0, 0.3);position: absolute;bottom:10px;left:10px;border-radius: 10px;}/*开关*/.switch{position: absolute;width: 20px;height: 20px;left:10px;top:10px;text-align: center;line-height: 20px;color:yellow;}/*进度条*/.progress{width: 432px;height: 10px;position: absolute;background-color: rgba(255,255,255,0.4);left:40px;top:15px;border-radius: 4px;overflow: hidden;}/* 当前进度*/.curr-progress{width: 50%;height: 10px;background-color: #fff;}/* 时间模块*/.time{width: 120px;height: 20px;text-align: center;line-height: 20px;color:#fff;position: absolute;left:510px;top:10px;font-size:12px;}/*全屏*/.extend{position: absolute;width: 20px;height: 20px;right:20px;top:10px;text-align: center;line-height: 20px;color:yellow;}</style>
</head>
<body><!-- 多媒体--><figure><!--  多媒体标题--><figcaption>视频案例</figcaption><div class="palyer"><video src="video/fun.mp4"></video><!-- 控制条--><div class="controls"><!-- 播放暂停--><a href="#" class="switch  icon-play"></a><div class="progress"><!-- 当前进度--><div class="curr-progress"></div></div><!-- 时间--><div class="time"><span class="curr-time">00:00:00</span>/<span class="total-time">00:00:00</span></div><!-- 全屏--><a href="#" class="extend  icon-resize-full"></a></div></div></figure><script>// 思路:/** 1、点击按钮 实现播放暂停并且切换图标* 2、算出视频的总时显示出出来* 3、当视频播放的时候,进度条同步,当前时间同步* 4、点击实现全屏*///        获取需要的标签var  video=document.querySelector('video');
//          播放按钮var  playBtn=document.querySelector('.switch');
//          当前进度条var  currProgress=document.querySelector('.curr-progress');
//          当前时间var  currTime=document.querySelector('.curr-time');
//          总时间var  totalTime=document.querySelector('.total-time');
//          全屏var extend=document.querySelector('.extend');var tTime=0;//         1、点击按钮 实现播放暂停并且切换图标playBtn.onclick=function(){
//               如果视频播放 就暂停,如果暂停 就播放if(video.paused){
//                   播放video.play();//切换图标this.classList.remove('icon-play');this.classList.add('icon-pause');}else{
//                   暂停video.pause();
//                   切换图标this.classList.remove('icon-pause');this.classList.add('icon-play');}}//        2、算出视频的总时显示出出来
//        当时加载完成后的事件,视频能播放的时候video.oncanplay=function(){
//             获取视频总时长tTime=video.duration;console.log(tTime);//          将总秒数 转换成 时分秒的格式:00:00:00
//            小时var h=Math.floor(tTime/3600);
//            分钟var m=Math.floor(tTime%3600/60);
//            秒var s=Math.floor(tTime%60);//            console.log(h);
//            console.log(m);
//            console.log(s);//            把数据格式转成 00:00:00h=h>=10?h:"0"+h;m=m>=10?m:"0"+m;s=s>=10?s:"0"+s;console.log(h);console.log(m);console.log(s);
//            显示出来totalTime.innerHTML=h+":"+m+":"+s;}
//   * 3、当视频播放的时候,进度条同步,当前时间同步
//         当时当前时间更新的时候触发video.ontimeupdate=function(){
//            获取视频当前播放的时间
//           console.log(video.currentTime);
//            当前播放时间var cTime=video.currentTime;
//           把格式转成00:00:00var h=Math.floor(cTime/3600);
//            分钟var m=Math.floor(cTime%3600/60);
//            秒var s=Math.floor(cTime%60);//            把数据格式转成 00:00:00h=h>=10?h:"0"+h;m=m>=10?m:"0"+m;s=s>=10?s:"0"+s;//            显示出当前时间currTime.innerHTML=h+":"+m+":"+s;//            改变进度条的宽度: 当前时间/总时间var value=cTime/tTime;currProgress.style.width=value*100+"%";}//        全屏extend.onclick=function(){
//            全屏的h5代码video.webkitRequestFullScreen();}</script>
</body>
</html>

处理兼容性问题

为了做到多浏览器支持,可以采取以下兼容性写法:

<!--推荐的兼容写法:-->
<audio controls loop><source src="music/yinyue.mp3"/><source src="music/yinyue.ogg"/><source src="music/yinyue.wav"/>抱歉,你的浏览器暂不支持此音频格式
</audio>

代码解释:如果识别不出音频格式,就弹出那句“抱歉”。

补充视频兼容问题

HTML5通过<video>标签来解决视频播放的问题。

使用举例:

	<video src="video/movie.mp4" controls autoplay></video>

我们可以通过附加属性,来更友好地控制视频的播放,如:

  • autoplay 自动播放。写成autoplay 或者 autoplay = "",都可以。

  • controls 控制条。(建议把这个选项写上,不然都看不到控件在哪里)

  • loop 循环播放。

  • preload 预加载 同时设置 autoplay 时,此属性将失效。

  • width:设置播放窗口宽度。

  • height:设置播放窗口的高度。

由于版权等原因,不同的浏览器可支持播放的格式是不一样的:

兼容性写法:

    <!--<video src="video/movie.mp4" controls  autoplay ></video>--><!--  行内块 display:inline-block --><video controls autoplay><source src="video/movie.mp4"/><source src="video/movie.ogg"/><source src="video/movie.webm"/>抱歉,不支持此视频</video>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18501.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音乐聊天室小程序

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 今天推荐的这个项目是音乐聊天室&#xff0c;有小程序版&#xff0c;uniapp版和pc版&#xff0c;前后端均开源了&#xff0c;并且有详细的api和部署文档&#xff0c;可以学习了&#xff01; 二、实现功能 普通文字…

实验探索: ChatGPT是好的推荐系统吗?

TLDR&#xff1a; 之前我们简单测试了下ChatGPT作为推荐器在序列推荐和可解释推荐上的能力&#xff0c;即如何利用ChatGPT实现推荐模型的能力&#xff1f;今天再跟大家分享一篇通过实验来探究ChatGPT通用推荐能力的文章&#xff0c;其在评分预测、序列推荐、直接推荐、解释生成…

好货推荐——好用的ChatGPT

成果图如下&#xff1a; 这个是Microsoft Edge浏览器的一个扩展插件&#xff0c;然后我们下面来操作一下怎么获取并使用这个插件 然后回到管理扩展界面打开webtab 然后他就会自己弹出webtab界面如下图&#xff1a; 然后点击Chat AI即可使用了&#xff0c;不过现在要登录账号才能…

[Unity] 使用 Visual Effect Graph 制作射击枪焰特效

全程照抄油管视频 https://www.youtube.com/watch?vsgBbnF3r60U&ab_channelGabrielAguiarProd. 1. Mesh 制作 打开 Blender 新建一个圆环 进入编辑模式&#xff0c;全选&#xff0c;沿法向挤出&#xff0c;向内挤出 得到一个环 环的内径很小 选中一个面 选择光照贴图拼…

影视特效合成140多种枪火炸弹爆炸破视频素材 BigVFX Starter Pack

素材简介 这是一套特效合成视频素材&#xff0c;包含类别爆炸物&#xff0c;爆照冲击波&#xff0c;闪电&#xff0c;巨大的爆炸&#xff0c;流星坠落&#xff0c;破坏&#xff0c;光剑&#xff0c;光柱&#xff0c;闪电、倒塌&#xff0c;地面塌陷&#xff0c;爆炸&#xff0c…

如何给视频添加特效?快速制作特效视频

如何给视频添加特效&#xff1f;现如今几乎我们人人每天都在与短视频打交道&#xff0c;有些人在日常的生活中也会剪辑一些短视频。其实剪辑短视频并没有你想象中的那么困难。只是需要找到一款合适的软件就可以很快完成。在短视频剪辑中就有需要给短视频添加特效的操作&#xf…

免费开源剪辑软件Shotcut推荐和使用教程

shotcut是一个免费、开源、跨平台的视频编辑软件&#xff0c;功能丰富强大&#xff0c;能够满足绝大多数情况下对视频编辑的需求&#xff0c;下面看看它如何使用吧。 下载软件 去官网下载软件&#xff0c;支持Linux、MacOS和Windows平台。 下载地址 打开软件 不同的平台有不…

Mac精品应用推荐:专业的后期特效制作软件

什么是影视后期&#xff1f;影视后期具体指什么&#xff1f; 影视后期制作就是对拍摄完的影片或者软件制作的动画&#xff0c;做后期的处理&#xff0c;使其形成完整的影片&#xff0c;包括加特效&#xff0c;加文字&#xff0c;并且为影片制作声音等。后期软件具体可以分为平…

chatgpt赋能Python-python自动化办公真的有用吗_知乎

简介 如今&#xff0c;Python作为一种必学的编程语言&#xff0c;已经走进了各行各业的办公场景。Python自动化办公也逐渐成为了一个热门话题&#xff0c;很多人开始使用Python来进行一些机械化、重复性的办公工作&#xff0c;例如数据清洗、文本处理、文件管理、自动发送邮件…

ChatGPT能否取代程序员?仍然是一个需要认真探讨的问题,对此你怎么看?

导言 ChatGPT能否取代程序员&#xff1f;作为一个AI语言处理程序&#xff0c;ChatGPT已经取得了重大的进展&#xff0c;它可以与人类进行流畅的对话&#xff0c;并能够接受和解释自然语言输入&#xff0c;并输出人类可理解、有意义的回复。然而&#xff0c;它是否能够取代程序…

chatgpt赋能python:Python自动操作Excel:提高工作效率的利器

Python自动操作Excel: 提高工作效率的利器 在当前数字化时代&#xff0c;电子表格已经成为了我们生产和工作中的重要工具。对于那些常常需要大量处理数据的人来说&#xff0c;快速而准确地操作电子表格是至关重要的。而Python提供了一种强大而又易于使用的方式来自动化Excel操…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好&#xff0c;但还不能取代专家导师&#xff0c;有时还会犯错&#xff01; ChatGPT 教小狗编程&#xff08; Midjourney 创作&#xff09; GPT-4刚刚发布&#xff0c;相较于GPT-3.5&#xff0c;它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下&#xff0c;…

chatgpt赋能python:Python代码自动生成工具–简介

Python代码自动生成工具 – 简介 Python是一个广泛使用的开源动态编程语言&#xff0c;其流行程度越来越高&#xff0c;许多企业和组织也在使用Python来实现其业务需求。为了提高生产力和代码的质量&#xff0c;Python代码自动生成工具被越来越多地采用。这些工具可以自动编写…

ChatGPT到底是赛博做题家还是科研颠覆者?

来源&#xff1a;中科院物理所 作者&#xff1a;Sidney Pertowitz 翻译&#xff1a;*0 审校&#xff1a;云开叶落 原文链接&#xff1a;What Does ChatGPT Know About Science? 除非最近彻底断网了&#xff0c;否则大家应该听说或体验过了目前非常流行的聊天机器人&#xff0c…

AI杂谈04 与Chat AI沟通代码的提词

BING AI&#xff1a;“与AI交流应该像与人交流一样&#xff0c;尊重对方的感受和权力。” 图源&#xff1a;文心一言 | 提词&#xff1a;少女机器人 漫画风格 作为小白&#xff0c;在使用AI生成代码的时候&#xff0c;耗过不少时间&#xff0c;栽过不少跟头&#xff0c;因此总…

打工人的尽头,是 “超级个体”

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 农业时代“创业”做买卖&#xff0c;怎么着也得几十匹骡马、上百亩良田打底&#xff0c;你才有胆子折腾&#xff1b;工业时代创业&#xff0c;一条生产流水线、十几个工人、几百平厂房&#xff0c;算是…

Midjourney 端午海报制作

不废话直接上干货 我用的国内Midjourney&#xff1a; AIGC研究院-midjourney,ChatGPTAI绘画,AI画画A绘图AI作画,GPT4.0,GPT3.5,midjourney共享-让更多人体验AI作画的乐趣 咒语&#xff1a; portrait photography from Disney Pixar Studios,Dragon Boat Festival&#xff0…

midjourney AI画图注册使用详细教程

第一步&#xff1a;在 discord 官网用邮箱注册 discord 账号 地址 第二步&#xff0c;在 midjourney官网绑定刚才注册的 discord 账号 进入 midjourney官网 &#xff0c;点击Join the Bate 然后会进入这个主页&#xff0c;点击左侧箭头的加号&#xff0c;创建自己的频道服务器 …

LaTex图片排版

目录 在中心位置插入一张图片并排插入多张图片多排插入多张图片垂直&#xff08;竖向&#xff09;插入多张图片并排&#xff08;橫向&#xff09;插入多张图片且有两张以上图像共用同一个子标题图片重叠插入图片的混合排版最后 在中心位置插入一张图片 代码如下&#xff1a; \…

想知道图片批量处理软件哪个好?分享2款好用软件

在工作中&#xff0c;有些小伙伴经常需要对多张图片进行处理编辑&#xff0c;比如进行裁剪、重命名、旋转等操作&#xff0c;如果一张张图片进行操作&#xff0c;不仅繁琐而且还很耗费时间。其实我们可以使用一些图片批量处理的工具&#xff0c;就可以轻松完成多张图片处理的任…