[教程] 关于CMP无法显示MP3声音频谱和无法读取ID3资料
CMP附带了大概10种声音频谱效果,以便在播放MP3时,视频窗口不会单调 同时CMP4还支持外载自定义频谱效果,具体可到索引帖子下载频谱插件 CMP还可以在mp3播放10秒左右,读取mp3的id3资料,包括歌名,专辑,歌手,并显示在status状态栏
但是,要显示声音频谱和读取id3资料都存在一个安全限制,这也是flashplayer的固有安全限制
flash官方文档是这样说明的:
当flash播放有声音的媒体时,可以通过调用
SoundMixer.computeSpectrum(www.jiepaitv.com)
,获取当前声音波形的快照,并将其放在指定的 ByteArray 对象中,注意:
此方法受本地文件安全性限制和跨域加载限制的约束。 如果正在使用本地 SWF 文件或从一个服务器(该服务器与执行调用的 SWF 位于不同的域中)上加载的声音,则可能需要通过URL策略文件(crossdomain.xml)来解决沙箱限制问题。
所以,我们一般远程调用并播放MP3地址时,一般都会有跨域安全限制问题,导致无法显示声音频谱和读取id3资料
因为一般mp3所在的服务器都不会特意放一个策略文件crossdomain.xml来允许读取频谱数据
既然能跨域播放mp3声音,为什么又不允许随便读取频谱数据呢,
这就要请大家自己去查阅adobe官方flashplayer的白皮
了
个人猜想是因为:
读取声音数据并播放是安全的,顶多就是哑巴,没有声音
但读取频谱数据的话(还有ID3数据),可以得到具体的二进制数据,这样如果不是MP3文件那么就是一个漏洞了,因为可以间接的通过这个跨域读取其他数据
如果上面的不是很明白,下面再举一个跨域的例子:
1,a有播放器
2,b有mp3音乐
3,a请求取得b的mp3频谱数据
4,那么a需要征求b的同意才能成功读取
所以b有权限制别人(如a)是否能读取频谱数据,这个权利可以放在crossdomain.xml跨域策略文件中
默认crossdomain.xml是不允许读取的,只有b在策略中设置了允许a读取才能显示频谱
也就是策略文件crossdomain.xml和mp3媒体文件必须是放在一个服务器上的,跨域时放在cmp所在服务器是没用的
当然在同一个域下不受此限制,这好比自己用自己的东西,无需他人同意 在本地file
或exe一类的环境中(如桌面版),也没有这些限制,可以读取频谱数据
策略文件crossdomain.xml设置信息例子,如:
1.
2.
3.
4.
复制代码
这表示放置crossdomain.xml所在的域允许所有其他站(*表示任意)读取 也可设置只允许某某站读取,如只允许www.cenfun.com上的CMP读取:
1.
2.
3.
4.
复制代码
to-ports为允许的端口号,*表示任意,这样的允许站点可以添加任意个数,如还允许www.163.com站读取,则:
1.
2.
3.
4.
5.
复制代码
相关结论:
1,如果直接播放其他域的MP3,一般是肯定不能把策略文件放到那个服务器上去的,所以也无法显示频谱和id3信息
2,除了这个,实际上flash其他一些跨域数据的加载都有同样的安全限制,比如歌词,列表,配置,皮肤包等等都不行
3,如果不能放置策略文件,那么我们还可以通过程序代理来解决跨域问题,把数据代理到了同域中,自然就没有跨域问题了
最新版本的CMP4支持新的取样播放设置,可以间接的播放MP3进而显示频谱,可以设置: sound_sample="true"