• Html5游戏开发攻略(免费的音乐面包篇)


    这一篇我们来尝尝免费的面包,至少目前是这样的。

    QQ音乐相信大家或多或少都使用过,里面的音乐资源非常多。

    这个时候你可能就明白了,没错,我们要在游戏中使用QQ音乐的资源当背景音乐~~~~~哦耶~!

    咳咳,不过呢,由于QQ音乐在线接口是加密的,所以我们需要一系列工作来解密并调用。可要做好准备哟!

    先放一张预览图:

    过程其实很简单。

    第一步:申请QQ音乐服务器访问权限。

    第二步:获取不同的音乐列表(根据你的选择获取到)。

    第三步:根据不同列表进行分析。

    第四步:获取音乐信息。

    第五步:从音乐信息中分析数据。

    第六步:播放音乐。

     

    1. /* 
    2.     QQ音乐插件 
    3. */  
    4. void function (w) {  
    5.   
    6.     // QQ音乐对象  
    7.     var QQMusic = {};  
    8.   
    9.     setInterval(function getJurisdiction() {  
    10.         /// <summary>申请QQ音乐服务器访问权限</summary>  
    11.   
    12.         injectScript("http://qzone-music.qq.com/fcg-bin/fcg_set_musiccookie.fcg?fromtag=31");  
    13.         return getJurisdiction;  
    14.     }(), 3 * 60 * 1000);  
    15.   
    16.     function injectScript(url) {  
    17.         /// <summary>引用脚本</summary>  
    18.         /// <param name="url" type="String">地址</param>  
    19.   
    20.         var oScript = document.createElement("script");  
    21.         oScript.src = url;  
    22.         oScript.charset = 'gb2312';  
    23.         document.body.appendChild(oScript);  
    24.         document.body.removeChild(oScript);  
    25.     }  
    26.   
    27.     function getAlbumPicture(albumId) {  
    28.         /// <summary>获取专辑图片</summary>  
    29.         /// <param name="albumId" type="Number">专辑编号</param>  
    30.         /// <returns type="String">专辑图片地址</returns>  
    31.   
    32.         return "http://imgcache.qq.com/music/photo/album/" + parseInt(albumId) % 100 + "/albumpic_" + albumId + "_0.jpg";  
    33.     }  
    34.   
    35.     function getSingerPicture(singerId) {  
    36.         /// <summary>获取歌手图片</summary>  
    37.         /// <param name="singerId" type="Number">歌手编号</param>  
    38.         /// <returns type="String">歌手图片地址</returns>  
    39.   
    40.         return "http://imgcache.qq.com/music/photo/singer/" + parseInt(singerId) % 100 + "/singerpic_" + singerId + "_0.jpg";  
    41.     }  
    42.   
    43.     // 回调函数  
    44.     var cb = null;  
    45.   
    46.     QQMusic.getGuessYouLike = function (callback) {  
    47.         /// <summary>获取猜你喜欢列表</summary>  
    48.         /// <param name="callback" type="Function">回调函数</param>  
    49.   
    50.         var lableId = [];  
    51.         for (var i = 118; i < 142; i++) {  
    52.             lableId.push(i);  
    53.         }  
    54.         lableId.push(150, 160);  
    55.   
    56.         window.JsonCallBack = window.SongRecCallback = listAnalysis;  
    57.   
    58.         cb = callback;  
    59.   
    60.         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());  
    61.     };  
    62.   
    63.     QQMusic.searchSongs = function (key, callback) {  
    64.         /// <summary>搜索歌曲</summary>  
    65.         /// <param name="key" type="String">关键字</param>  
    66.         /// <param name="callback" type="Function">回调函数</param>  
    67.   
    68.         cb = callback;  
    69.   
    70.         key = encodeURI(key);  
    71.   
    72.         window.MusicJsonCallBack = searchAnalysis;  
    73.   
    74.         injectScript("http://s.plcloud.music.qq.com/fcgi-bin/smartbox.fcg?o_utf8=1&utf8=1&key=" + key + "&inCharset=GB2312&outCharset=utf-8");  
    75.     };  
    76.   
    77.     QQMusic.getSongInfo = function (song, callback) {  
    78.         /// <summary>获取歌曲信息</summary>  
    79.         /// <param name="key" type="Object">歌曲对象</param>  
    80.         /// <param name="callback" type="Function">回调函数</param>  
    81.   
    82.         cb = function (info) {  
    83.             info.name = song.name;  
    84.             info.singer = song.singer;  
    85.             info.imgUrl = getAlbumPicture(song.albumId);  
    86.             callback(info);  
    87.         };  
    88.   
    89.         window.JsonCallback = musicAnalysis;  
    90.   
    91.         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");  
    92.     };  
    93.   
    94.     function listAnalysis(data) {  
    95.         /// <summary>随机音乐列表解析</summary>  
    96.         /// <param name="data" type="Array">随机列表数据</param>  
    97.   
    98.         var playList = [];  
    99.         var regexp = new RegExp('(upload|stream)(\d+)\.(music\.qzone\.soso\.com|qqmusic\.qq\.com)\/(\d+)\.wma');  
    100.         var replacement = function (word, x, a, y, b) {  
    101.             return 'stream' + (10 + Number(a)) + '.qqmusic.qq.com/' + (18000000 + Number(b)) + '.mp3';  
    102.         };  
    103.         var songs = data.songs;  
    104.         for (var i = 0; i < songs.length; ++i) {  
    105.             var song = songs[i];  
    106.             var args = decodeURIComponent(song.data).replace(/+/g, ' ').split('|');  
    107.             var singerId = args[2];  
    108.             var albumId = args[4];  
    109.             var name = args[1];  
    110.             var singer = args[3];  
    111.             playList.push({  
    112.                 name: name,  
    113.                 singer: singer,  
    114.                 url: decodeURIComponent(song.url).replace(regexp, replacement),  
    115.                 imgUrl: getAlbumPicture(albumId),  
    116.                 singerImgUrl: getSingerPicture(singerId)  
    117.             });  
    118.         }  
    119.         cb && cb(playList);  
    120.     };  
    121.   
    122.     function searchAnalysis(data) {  
    123.         /// </summary>搜索列表解析</summary>  
    124.         /// <param name="data" type="Array">搜索列表数据</param>  
    125.   
    126.         var songs = data.tips.song;  
    127.         var albums = data.tips.album;  
    128.         for (var i = songs.length; i--;) {  
    129.             songs[i] = {  
    130.                 id: songs[i].id,  
    131.                 mid: songs[i].mid,  
    132.                 name: songs[i].name,  
    133.                 singer: songs[i].singer_name,  
    134.                 albumId: function () {  
    135.                     for (var n = 0; n < albums.length; n++) {  
    136.                         if (albums[n].singer_name == songs[i].singer_name) {  
    137.                             return albums[n].id;  
    138.                         }  
    139.                     }  
    140.                 }()  
    141.             };  
    142.         }  
    143.         cb && cb(songs);  
    144.     };  
    145.   
    146.     function musicAnalysis(data) {  
    147.         /// <summary>单曲音乐解析</summary>  
    148.         /// <param name="data" type="Object">单曲音乐源数据</param>  
    149.   
    150.         cb && cb({  
    151.             url: 'http://stream' + (10 + Number(data.num)) + '.qqmusic.qq.com/' + (30000000 + Number(data.mvlist[0].songid)) + '.mp3'  
    152.         });  
    153.     };  
    154.   
    155.     w.QQMusic = QQMusic;  
    156. }(window);  


    OK!~写好后我们怎么样才能获得数据并播放呢?

    好,下面请看~

    假设我们要获取到随机歌曲列表,那么只需要调用 

    1. QQMusic.getGuessYouLike(function(list){  
    2.     loadNewMusic(list[0]);  
    3. });  


    然后~我们再写一个loadNewMusic函数来播放它就可以了~

      

    1. function loadNewMusic(musicInfo){  
    2.     /// <summary>加载新音乐</summary>  
    3.     /// <param name="musicInfo" type="Object">音乐信息</param>  
    4.   
    5.     var audio = new Audio();  
    6.     audio.autoplay=true;  
    7.     audio.src=musicInfo.url;  
    8.     audio.load();  
    9. }  


    Ok!运行一下吧!?

  • 相关阅读:
    新年新气象~
    北京不下雪,自己来点雪花看看吧~(附效果图)
    没事写个游戏自己玩~
    原生js实现简单的焦点图效果
    php xdebug扩展无法进入断点问题
    (转)没有IE就没有伤害!浏览器兼容性问题解决方案汇总
    利用mvc filterconfig属性实现权限验证
    c# 替换所有中文、标点符号,全角转半角
    go web 第三天 学习笔记 --mysql
    go web 第二天 学习笔记之文件上传
  • 原文地址:https://www.cnblogs.com/web100/p/html5-free-music.html
Copyright © 2020-2023  润新知