baidumusic / muplayer Goto Github PK
View Code? Open in Web Editor NEWAn open source web audio player from Baidu Music, support HTML5 and Flash engine on different platforms(百度音乐播放内核)
Home Page: https://886.enimo.cn/muplayer/doc/
License: Other
An open source web audio player from Baidu Music, support HTML5 and Flash engine on different platforms(百度音乐播放内核)
Home Page: https://886.enimo.cn/muplayer/doc/
License: Other
因为这些浏览器要求audio的播放必须是用户的主动交互操作(如点击滑动等),而如果只是在代码中调用play方法,会让player卡在buffering状态,导致即便主动交互时选链逻辑依然失效。应该修复这个问题。
zepto-player.js的编译有问题,没有将zepto确实的defferd支持,$.getScript和$.isNumeric等方法的支持。需要完善builder.coffee
这是一个已知问题,因IOS及Chrome下会因歌曲缓存导致progress不被触发。可以参考audiojs的解决方案来修复:
https://github.com/kolber/audiojs/blob/44b1359a9f486c93ff5bd15e225449bc436ff6b0/audiojs/audio.js#L501
比如播放这个连接:
player.setUrl('http://bj.bs.bae.baidu.com/music-xiaoyuan/%2F%E7%99%BE%E5%BA%A6%E9%9F%B3%E4%B9%90%E4%BA%BA15%E7%A7%92%E6%88%90%E5%93%81new15.mp3?sign=MBO:Din8hpn73gqLayb2a:QJfVMr5KZ6SWsTQO2g%2BY3AAEmO8%3D').play();
在mode为list时,即列表播放时,应该在播完最后一首歌后停止播放,并将列表重置回第一首。在播放第一首时,如果点击“上一首”,则停止播放。具体播放顺序逻辑应与iTurns一致。
现在的列表播放和循环播放没有区别,应该立即修复。
感觉依赖性太强了,依赖jquery ui和bootstrap.min.js,感觉不太方便,jquery是一般都有的,如果就单独在自己的player.js里面把这些功能都集成进来会好一点,这样子要引入的文件太多了。
现在只在第一次使用时有对具体播放内核的判定,但之后的异常处理基本没有。今后应该有自动的异常处理和内核切换机制,比如如果AudioCore内核多次重试不成功就应该自动切换到FlashCore内核,并记录日志。FlashCore亦然。
现有的实现中依赖了一些jQuery方法(比如$.getScript, $.isNumberic),但这些方法不是zepto的默认接口,需要提供一个兼容性扩展,保证在使用zepto的WebApp中可以顺利调用播放内核。
引入的CSS,js路径都不对,根本不能用!
本地测试没有问题,在jekyll serve下测试时,firebug报错TypeError: _mu.Player is not a constructor
,已在jquery之后引用<script src="../js/player.js"></script>
RT 以list mode 循环播放时 出现的切歌bug
命令行下通过flex-sdk编译,即便源文件没有变更,编译后的swf二进制文件也会不同。猜测是在编译时打了时间戳。这样会造成git ci时提交无用代码。考虑:
是否支持自定义皮肤!!和歌词的显示
之前写过简单的qunit测试以覆盖核心的播放暂停等功能。但好久没有维护,且无法再命令行下运行。
考虑迁移到Mocha,补充必要的测试用例
var player = new _mu.Player();
player.add('http://cdn.y.baidu.com/yinyueren/c6000a27abee2510722b4bb092c766a3.mp3');
player.play();
// 这时能正常从第10秒开始播放,此时 player._st 为 stop
player.play(10000);
// 之后调用 .play(pos) 无效,此时 player._st 为 play ,跳过了如下判断
// https://github.com/Baidu-Music-FE/muplayer/blob/master/src/js/player.coffee#L217
player.play(60000);
以插件形式支持LRC歌词解析及定位。相关issue: #41
当音频文件后缀名大写时,内核报错,Uncaught Can not play with: XXX
1.muplayer-master/doc/demo.html文件里直接写个“../src/doc/demo.html”怎么能打开?
2./muplayer-master/src/doc/demo.html 相同目录下就没有对应的css和js 文件,打开根本就没有样式,也播放不了!
现在默认Player都是单实例。但页面中,可能有需要同时初始化多个内核的需求。这时要让播放、UI渲染及事件监听互不干扰。
包括百度自己产品中使用的,及第三方同学开发的,如:http://fm.3sd.me/
比如使用 browserify 后可以直接使用 node 的 event 的库实现事件的部分而不需要考虑依赖问题。browserify 会自动把轻量的 event 实现插入到编译的代码中。很多其他 node 的库都可以直接使用。
@Javey 在使用中发现的问题。播放事件的派发应遵循应prebuffer -> buffering -> playing
的顺序。现在MP3Core在是先派发playing,然后置于buffering状态不会再变会playing,这样在应用端无法准确判断内核是否是在播放。
IE8- 都跑不通了.
通过断点看到报错:
function __flash__addCallback(instance, name) {
instance[name] = function () {
return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
}
}
对象不支持此属性或方法
排查了下,之前对AudioCore play方法的使用是依赖canplay事件,会先判断audio.readyState状态码,根据状态码监听canplay事件,直到audio派发了canplay事件才去调用audio.play。这样做是为了回避webkit内核的浏览器在audio未派发canplay事件时调用play,会导致报错的问题。
但是Firefox 31等浏览器对HTML 5规范的实现并不标准,即便readyState为0或1时,依然可能已经派发过canplay事件,导致内核对canplay事件的监听失效,无法播放。
有用户报错,但我本机不能复现,还需要进一步排查复测,以确定具体的复现条件后再做修复。
除了bower支持外,还要将编译好的静态文件直接放到CDN上,让使用更方便。
初步考虑添加到:http://www.staticfile.org/
考虑利用Web Audio API实现一个插件形式的音效增强均衡器,大概如:http://labs.music.baidu.com/demo/audiolab/?p=1
源码中会包括:
暂时不会包括:
非常棒的工具:smile:
使用过程中遇到点问题,比如只想在按钮点击后播放一次按钮声音该如何做。
目前的模式似乎都是循环的。
例如:http://cdn.y.baidu.com/yinyueren/c7220cbc0e1e4b5448e0c463c4a1c0a5.MP3
该音频资源会抛出 Can not play with: MP3
的异常。
RT,对下一首要播歌曲的计算可能有bug
demo源码看不到效果,但是还有页面乱码问题,另外在首页使用都没说要引入哪些js文件或css文件。还有那个签出源码依赖是linux上的shell脚本,lib/install.sh,那我在window上没有这一步,直接引用,没法实现,现在还是只能用jplayer了
因兼容性问题,audio.buffered可能为空,导致getBufferedEnd不能获得准确的缓冲进度。
有关buffer相关的规范解释,可以参考:
https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/buffering_seeking_time_ranges
通过构造参数的方式可以执行传入的代码,例如:
muplayer_mp4.swf?_instanceName=eval(%22if(!window.x)alert(x=7)%22)
错误信息如下:
$ cake build
...
js/player.js
/home/xxxx/develop/github/muplayer/node_modules/q/q.js:126
throw e;
^
Error: Error: ENOENT, no such file or directory '/home/xxxx/develop/github/muplayer/require_temp/js/plugin/audioNode.js'
In module tree:
muplayer/plugin/equalizer
at /home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:25976:19
at /home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:3005:39
at /home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:2945:25
at Function.prim.nextTick (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:25806:9)
at Object.p.errback (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:2944:26)
at Object.p.callback (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:2930:23)
at Object.p.promise.then (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:2984:23)
at build (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:25933:12)
at runBuild (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:27859:17)
at Object.context.execCb (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:1898:33)
at Object.Module.check (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:1114:51)
at Object.Module.enable (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:1391:22)
at Object.Module.init (/home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:1022:26)
at /home/xxxx/develop/github/muplayer/node_modules/requirejs/bin/r.js:1664:36
at process._tickCallback (node.js:415:13)
将 src/js/plugin/
下的 audionode.coffee
重命名为 audioNode.coffee
可以修复该问题。
是我安装的 node 或 CoffeeScript 的版本不对吗?
$ node --version
v0.10.26
$ coffee --version
CoffeeScript version 1.8.0
在本次FF浏览器更新到31.0版本后,muplayer不能正常工作,显示播放状态,但是不能正常播放~!
减少配置的复杂度。
比如是这样的音乐列表:
[
'http://m5.file.xiami.com/416/39416/434742/1770138305_2174201_l.mp3?auth_key=7e90cfc4579dc81a09d3f3b1b24ab1ed-1404604800-0-null',
'http://m5.file.xiami.com/1/232/10232/319903/3610946_467149_l.mp3?auth_key=b5a478fdefbf83f82b73aed4ded8d1ba-1404604800-0-null',
'http://m5.file.xiami.com/247/13247/105251/1333257_1777128_l.mp3?auth_key=1019a18c54b0f656ded2a95458d75f37-1404604800-0-null',
'http://m5.file.xiami.com/801/110801/1881462144/1772240319_10912275_l.mp3?auth_key=7697d220d0e366195e13410798ed19cf-1404604800-0-null']
只能播放第一首,后面的都是onerror了,如果无法解码的话,那应该第一首也是播不了才对。
现在的代码示例都是保存在gist中,这样有两个问题:
考虑找一个代码格式化库,在文档站本地去做示例代码的渲染
对jquery的依赖感觉太重了,如果网站没使用框架或使用别的基础框架就还需要额外引入jquery这样感觉不大好了
未启用 Flash 插件的情况下,无法播放音频文件。
P.S. 好像不支持 ogg 格式?
打算在移动设备上使用sound sprite 做背景播放
你好
utils.clone 方法第一行
unless $.isPlainObject(obj) then obj
我理解这个方法作用是复制对象或数组,在发布的player.js没有发现这个方法的使用,上面那行代码有什么用吗?
https://github.com/Baidu-Music-FE/muplayer/blob/master/src/js/core/utils.coffee#L69
现在的这个是从项目中摘出来的之前同事写的,但是看了看,还是有很多地方可以精简优化的,可以考虑重构一下。
define(['MuPlayer'], function(_mu) {
_mu // undefined..
});
确定MuPlayer已经加载了
发现_mu 是在全局对象上的一个空对象。。。
require.js 版本是 2.1.15
由于内核给第一次touchstart事件绑定了播放空音频的处理方法,导致在自动播放后的任意一次点击交互,空音频都会覆盖掉当前正在播放的音频. 解决方法是给播放空音频操作加上前置判断,仅当audio的url为空时才执行
建议将object元素加上tabindex=-1属性。原因:
tab键切换到播放器控件后,在IE下,非常容易卡焦点,导致tab无法离开播放器。这对使用键盘操作为主的用户,比如盲人用户有很大的影响。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.