Html5游戏开发攻略(免费的音乐面包篇)
这一篇我们来尝尝免费的面包,至少目前是这样的。
QQ音乐相信大家或多或少都使用过,里面的音乐资源非常多。
这个时候你可能就明白了,没错,我们要在游戏中使用QQ音乐的资源当背景音乐~~~~~哦耶~!
咳咳,不过呢,由于QQ音乐在线接口是加密的,所以我们需要一系列工作来解密并调用。可要做好准备哟!
先放一张预览图:
过程其实很简单。
第一步:申请QQ音乐服务器访问权限。
第二步:获取不同的音乐列表(根据你的选择获取到)。
第三步:根据不同列表进行分析。
第四步:获取音乐信息。
第五步:从音乐信息中分析数据。
第六步:播放音乐。
- /*
- QQ音乐插件
- */
- void function (w) {
- // QQ音乐对象
- var QQMusic = {};
- setInterval(function getJurisdiction() {
- /// <summary>申请QQ音乐服务器访问权限</summary>
- injectScript("http://qzone-music.qq.com/fcg-bin/fcg_set_musiccookie.fcg?fromtag=31");
- return getJurisdiction;
- }(), 3 * 60 * 1000);
- function injectScript(url) {
- /// <summary>引用脚本</summary>
- /// <param name="url" type="String">地址</param>
- var oScript = document.createElement("script");
- oScript.src = url;
- oScript.charset = 'gb2312';
- document.body.appendChild(oScript);
- document.body.removeChild(oScript);
- }
- function getAlbumPicture(albumId) {
- /// <summary>获取专辑图片</summary>
- /// <param name="albumId" type="Number">专辑编号</param>
- /// <returns type="String">专辑图片地址</returns>
- return "http://imgcache.qq.com/music/photo/album/" + parseInt(albumId) % 100 + "/albumpic_" + albumId + "_0.jpg";
- }
- function getSingerPicture(singerId) {
- /// <summary>获取歌手图片</summary>
- /// <param name="singerId" type="Number">歌手编号</param>
- /// <returns type="String">歌手图片地址</returns>
- return "http://imgcache.qq.com/music/photo/singer/" + parseInt(singerId) % 100 + "/singerpic_" + singerId + "_0.jpg";
- }
- // 回调函数
- var cb = null;
- QQMusic.getGuessYouLike = function (callback) {
- /// <summary>获取猜你喜欢列表</summary>
- /// <param name="callback" type="Function">回调函数</param>
- var lableId = [];
- for (var i = 118; i < 142; i++) {
- lableId.push(i);
- }
- lableId.push(150, 160);
- window.JsonCallBack = window.SongRecCallback = listAnalysis;
- cb = callback;
- injectScript("http://radio.cloud.music.qq.com/fcgi-bin/qm_guessyoulike.fcg?labelid=" + lableId[(lableId.length * Math.random()) | 0] + "&start=0&num=20&rnd=" + new Date().getTime());
- };
- QQMusic.searchSongs = function (key, callback) {
- /// <summary>搜索歌曲</summary>
- /// <param name="key" type="String">关键字</param>
- /// <param name="callback" type="Function">回调函数</param>
- cb = callback;
- key = encodeURI(key);
- window.MusicJsonCallBack = searchAnalysis;
- injectScript("http://s.plcloud.music.qq.com/fcgi-bin/smartbox.fcg?o_utf8=1&utf8=1&key=" + key + "&inCharset=GB2312&outCharset=utf-8");
- };
- QQMusic.getSongInfo = function (song, callback) {
- /// <summary>获取歌曲信息</summary>
- /// <param name="key" type="Object">歌曲对象</param>
- /// <param name="callback" type="Function">回调函数</param>
- cb = function (info) {
- info.name = song.name;
- info.singer = song.singer;
- info.imgUrl = getAlbumPicture(song.albumId);
- callback(info);
- };
- window.JsonCallback = musicAnalysis;
- injectScript("http://qzone-music.qq.com/fcg-bin/fcg_mv_getinfo_bysongid.fcg?mids=" + song.mid + "&uin=10000&loginUin=0&hostUin=0&outCharset=utf-8");
- };
- function listAnalysis(data) {
- /// <summary>随机音乐列表解析</summary>
- /// <param name="data" type="Array">随机列表数据</param>
- var playList = [];
- var regexp = new RegExp('(upload|stream)(\\d+)\\.(music\\.qzone\\.soso\\.com|qqmusic\\.qq\\.com)\\/(\\d+)\\.wma');
- var replacement = function (word, x, a, y, b) {
- return 'stream' + (10 + Number(a)) + '.qqmusic.qq.com/' + (18000000 + Number(b)) + '.mp3';
- };
- var songs = data.songs;
- for (var i = 0; i < songs.length; ++i) {
- var song = songs[i];
- var args = decodeURIComponent(song.data).replace(/\+/g, ' ').split('|');
- var singerId = args[2];
- var albumId = args[4];
- var name = args[1];
- var singer = args[3];
- playList.push({
- name: name,
- singer: singer,
- url: decodeURIComponent(song.url).replace(regexp, replacement),
- imgUrl: getAlbumPicture(albumId),
- singerImgUrl: getSingerPicture(singerId)
- });
- }
- cb && cb(playList);
- };
- function searchAnalysis(data) {
- /// </summary>搜索列表解析</summary>
- /// <param name="data" type="Array">搜索列表数据</param>
- var songs = data.tips.song;
- var albums = data.tips.album;
- for (var i = songs.length; i--;) {
- songs[i] = {
- id: songs[i].id,
- mid: songs[i].mid,
- name: songs[i].name,
- singer: songs[i].singer_name,
- albumId: function () {
- for (var n = 0; n < albums.length; n++) {
- if (albums[n].singer_name == songs[i].singer_name) {
- return albums[n].id;
- }
- }
- }()
- };
- }
- cb && cb(songs);
- };
- function musicAnalysis(data) {
- /// <summary>单曲音乐解析</summary>
- /// <param name="data" type="Object">单曲音乐源数据</param>
- cb && cb({
- url: 'http://stream' + (10 + Number(data.num)) + '.qqmusic.qq.com/' + (30000000 + Number(data.mvlist[0].songid)) + '.mp3'
- });
- };
- w.QQMusic = QQMusic;
- }(window);
OK!~写好后我们怎么样才能获得数据并播放呢?
好,下面请看~
假设我们要获取到随机歌曲列表,那么只需要调用
- QQMusic.getGuessYouLike(function(list){
- loadNewMusic(list[0]);
- });
然后~我们再写一个loadNewMusic函数来播放它就可以了~
- function loadNewMusic(musicInfo){
- /// <summary>加载新音乐</summary>
- /// <param name="musicInfo" type="Object">音乐信息</param>
- var audio = new Audio();
- audio.autoplay=true;
- audio.src=musicInfo.url;
- audio.load();
- }
Ok!运行一下吧!?
Html5游戏开发攻略(免费的音乐面包篇)的更多相关文章
- Davinci DM6446开发攻略——u-boot-1.3.4移植(1)
UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和 ...
- Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架
Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架,提供JavaScript和TypeScript双重支持,内置游戏对象的物理属性,采用Pixi.js引擎以加快Canvas和W ...
- HTML5游戏开发引擎,初识CreateJS
CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
- HTML5游戏开发技术基础整理
随着HTML5标准终于敲定.HTML5将有望成为游戏开发领域的的热门平台. HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机.智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实 ...
- Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...
- html5游戏开发-零基础开发《圣诞老人送礼物》小游戏
开言: 以前lufy前辈写过叫“ HTML5游戏开发-零基础开发RPG游戏”的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识.今天我也以零基础为 ...
- HTML5游戏开发系列教程5(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...
- 微信小程序——【百景游戏小攻略】
微信小程序--[百景游戏小攻略] 本次课程小项目中的图片以及文章还未获得授权!请勿商用!未经授权,请勿转载! 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE ...
随机推荐
- windows下用python转换markdown到html
方法一: 安装markdown, pip install markdown, 安装好后,python -m markdown xxx.md -f xxx.html 方法二:安装markdown2, p ...
- Is It A Tree? 挂着并查集的帽子招摇撞骗
Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a ...
- Linux基础-简单的进程操作
任务:查找一个名为firewall的进程,并且将其强制杀死 首先要使用ps -aux来查询firewall的进程ID(|grep firewall) 这样我们就得到了firewall的进程ID是653 ...
- 【方法】jQuery无插件实现 鼠标拖动切换图片/内容 功能
前言 我就想随便叨逼叨几句,爱看就看几句,不爱看就直接跳过看正文就好啦~ 这个方法是仿写页面时我自己研究出来,可能有比我更简单的方法. 但我不管,因为我没查我不知道,我就觉得我的最好啦,耶耶耶~ 效果 ...
- JavaScript 优雅的实现方式包含你可能不知道的知识点
有些东西很好用,但是你未必知道:有些东西你可能用过,但是你未必知道原理. 实现一个目的有多种途径,俗话说,条条大路通罗马.很多内容来自平时的一些收集以及过往博客文章底下的精彩评论,收集整理拓展一波,发 ...
- java_环境安装(window10)
参考地址 下载JDK 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 本地环境变 ...
- [转]softmax函数详解
答案来自专栏:机器学习算法与自然语言处理 详解softmax函数以及相关求导过程 这几天学习了一下softmax激活函数,以及它的梯度求导过程,整理一下便于分享和交流. softmax函数 softm ...
- IE安全系列之——RES Protocol
IE安全系列之--RES Protocol res Protocol用于从一个文件里面提取指定资源.语法为:res://sFile[/sType]/sID 各Token含义: sfile:百分号编码. ...
- ActiveMQ实现消息的发送与接受
activemq是apache的一个JMS接口的实现产品,java中定义了JMS规范,虽然RocketMQ,kafka现在比较火,但是还是建议先学一下activeMQ再学其他两个就容易很多 首先可以下 ...
- springboot集成mybatis环境搭建以及实现快速开发微服务商品模块基本的增删改查!
之前学习了springboot和mybatis3的一些新特性,初步体会了springboot的强大(真的好快,,,,,),最近趁着复习,参考着以前学习的教程,动手写了一个springboot实战的小例 ...