精华帖 (0) :: 良好帖 (17) :: 新手帖 (3) :: 隐藏帖 (7)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-06
最后修改:2010-09-06
《读者》电子出版平台有个附属项目,需求描述是这样的: 1.《读者》发行了电纸书,附带着一个集成的机子,可以方便用户更新资料,每一个资源都附有MP3音频文件,读者可以在线免费试听,也可以下载音频文件,但是下载的时候要付费下载! 2.对于购买了电纸书的,是优惠下载一年,之后按照本站VIP会员优惠条件下载! ................................................................. 其他的描述省略了! 讨论下如何实现MP3音频试听不能下载这功能呢? 实现MP3播放最简单的功能是使用windows media player 插件代码如下:
<object id=MediaPlayer1 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading type=application/x-oleobject height=65 width=480 classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 viewastext> <param name="URL" value="<%=request.getContextPath()%>/servlet/ListernOrDownLoad?productId=<%=request.getParameter("productId")%>&action=<%=request.getParameter("action") %>" /> <param name="webURLPlayer" value="false" /> <param name="AudioStream" value="-1" /> <param name="AutoSize" value="0" /> <param name="AutoStart" value="-1" /> <param name="AnimationAtStart" value="-1" /> <param name="AllowScan" value="-1" /> <param name="AllowChangeDisplaySize" value="-1" /> <param name="AutoRewind" value="0" /> <param name="Balance" value="0" /> <param name="BaseURL" value /> <param name="BufferingTime" value="5" /> <param name="CaptioningID" value /> <param name="ClickToPlay" value="-1" /> <param name="CursorType" value="0" /> <param name="CurrentPosition" value="-1" /> <param name="CurrentMarker" value="0" /> <param name="DefaultFrame" value /> <param name="DisplayBackColor" value="0" /> <param name="DisplayForeColor" value="16777215" /> <param name="DisplayMode" value="0" /> <param name="DisplaySize" value="4" /> <param name="Enabled" value="-1" /> <param name="EnableContextMenu" value="-1" /> <param name="EnablePositionControls" value="0" /> <param name="EnableFullScreenControls" value="0" /> <param name="EnableTracker" value="-1" /> <param name="InvokeURLs" value="-1" /> <param name="Language" value="-1" /> <param name="Mute" value="0" /> <param name="PlayCount" value="5" /> <param name="PreviewMode" value="0" /> <param name="Rate" value="1" /> <param name="SAMILang" value /> <param name="SAMIStyle" value /> <param name="SAMIFileName" value /> <param name="SelectionStart" value="-1" /> <param name="SelectionEnd" value="-1" /> <param name="SendOpenStateChangeEvents" value="-1" /> <param name="SendWarningEvents" value="-1" /> <param name="SendErrorEvents" value="-1" /> <param name="SendKeyboardEvents" value="0" /> <param name="SendMouseClickEvents" value="0" /> <param name="SendMouseMoveEvents" value="0" /> <param name="SendPlayStateChangeEvents" value="-1" /> <param name="ShowCaptioning" value="0" /> <param name="ShowControls" value="-1" /> <param name="ShowAudioControls" value="-1" /> <param name="ShowDisplay" value="0" /> <param name="ShowGotoBar" value="0" /> <param name="ShowPositionControls" value="-1" /> <param name="ShowStatusBar" value="-1" /> <param name="ShowTracker" value="-1" /> <param name="TransparentAtStart" value="-1" /> <param name="VideoBorderWidth" value="0" /> <param name="VideoBorderColor" value="0" /> <param name="VideoBorder3D" value="0" /> <param name="Volume" value="100" /> <param name="WindowlessVideo" value="0" /> </object> 参数URL直接放置MP3音频文件的地址即可播放!但是这样的话,会将地址暴露给用户, 未登录的用户或者是费用不足的用户可以直接看见地址,使用迅雷等工具进行下载! 再简单一点处理加密地址的话,将URL参数使用成如下地址:
<param name="URL" value="<%=request.getContextPath()%>/servlet/ListernOrDownLoad?productId=<%=request.getParameter("productId")%>&action=<%=request.getParameter("action") %>" /> 使用一个Servlet去请求地址,代码示例如下:
public class ListernOrDownLoad extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); String action = request.getParameter("action"); User hideUser = (User) session.getAttribute("user"); int userId = null != hideUser ? hideUser.getId() : 0; int productId = Integer.parseInt(request.getParameter("productId")); Product product = ProductMgr.getInstance().loadById(productId); String musicUrl = MusicMgr.getInstance().findByProductId(productId).getUrl(); if (action.equals("listen")) { out.print(getMMSHostName(request) + musicUrl); } if (action.equals("download")) { if (0 == userId) { out.print("你还没有登录,请<a href='" + getHttpHostName(request) + "userAdmin/userLogin.jsp'>登录</a>!"); return; } Integral integral = IntegralMgr.getInstance().findByUserId(userId); if (null == integral || integral.getIntegral() < 0 || integral.getIntegral() < product.getMemberPrice()) { out.print("您的余额不足!,请<a href='" + getHttpHostName(request) + "integral/add.jsp'>充值</a>!"); return; } integral.setIntegral(integral.getIntegral() - product.getMemberPrice()); integral.setUserId(userId); IntegralMgr.getInstance().update(integral); out.print("<a href='" + getHttpHostName(request) + "/servlet/getAdress?userId="+userId+"&url=" + musicUrl + "&now=" + DateUtils.getDate(userId,new Date()) + "'>点击下载</a>"); } out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } private String getMMSHostName(HttpServletRequest request) { String basePath = "mms://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + ""; return basePath; } private String getHttpHostName(HttpServletRequest request) { String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + ""; return basePath; } }哪位朋友也许说了,为设么不自己开发一个player呢?使用Flex等?嘿嘿,要是自己去开发的话就没有必要讨论这个问题了,项目的经费就那么一点,什么都自己开发那可真是赔大了!嘿嘿! 方式二:使用js文件来控制参数传递: 使用js文件控制选择不同的播放器来播放不同的音频文件,支持如下格式
"WMA" : "WMP", "MP3" : "MP3", "WMV" : "WMP", "ASF" : "WMP", "MPG" : "WMP", "MPEG" : "WMP", "AVI" : "WMP", "ASX" : "WMP", "RM" : "Real", "RMVB" : "Real", "RAM" : "Real", "RA" : "Real", "SWF" : "Flash", "FLV" : "Flv" 核心是一个js文件依据不同的文件格式来调用不同的播放器来实现!参见附件中。 但是这样实现之后,文件一依然是暴露在外面的!还得使用Servlet等方式返回一个地址,或使用Ajax的方式在播放的时候去请求地址!这也是一个办法! 这里就没有继续往下写!
源文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> new document </title> <meta name="author" content="" /> <meta name="keywords" content="" /> <meta name="description" content="" /> </head> <body> <script type="text/javascript" src="player.js"></script> <script type="text/javascript"> <!-- var myPlayer = new Player(); myPlayer.play("1.mp3",800,600,true); //--> </script> </body> </html> 也许以上想法是很粗糙的,很原始的,或是很傻瓜式的实现方式,我们称其为障眼法实现方式,只能蒙蔽一般的使用者,但是对于稍微懂点程序代码的人来说,就是小儿科了! 以上料中想法优缺点,相信大家都很明了,我也就不说了,我这里说这个问题,只是抛砖引玉,希望大家有好的办法,既经济又快速的办法,或好的思路能与大家分享!因为现在这方面还比较流行,随便一个什么网站,什么管理类的系统,尤其是政府部门的办公管理系统,功能不多,类似要求辅助功能不少,希望大家多多交流跟帖!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-06
加密播放地址/解密请求串,加入用户权限等级标识.
|
|
返回顶楼 | |
发表时间:2010-09-07
不知道IE的缓存是否也能找到MP3的文件,
|
|
返回顶楼 | |
发表时间:2010-09-07
没有这方面的经验,
只是在考虑几个问题: 1.怎么控制Windows Media Player不会在本地缓存音频文件; 2.要实现的功能和www.songtaste.com上的视听文件管理有相似需求吗,www.rayfile.com功能上是不是已经满足了你的需求; 3.无论使用servlet还是jsp、ajax,最终返回来的页面都是html,对音频地址有隐藏作用吗 Good luck! |
|
返回顶楼 | |
发表时间:2010-09-07
ghyghost 写道 不知道IE的缓存是否也能找到MP3的文件,
这个肯定是会缓存的!所以有一系列的问题要考虑! |
|
返回顶楼 | |
发表时间:2010-09-07
最后修改:2010-09-07
xiaoxiaoniao 写道 没有这方面的经验,
只是在考虑几个问题: 1.怎么控制Windows Media Player不会在本地缓存音频文件; 2.要实现的功能和www.songtaste.com上的视听文件管理有相似需求吗,www.rayfile.com功能上是不是已经满足了你的需求; 3.无论使用servlet还是jsp、ajax,最终返回来的页面都是html,对音频地址有隐藏作用吗 Good luck! 看了看www.songtaste.com 他的音乐播放,可以通过右键看到如下链接: http://224.cachefile34.rayfile.com/a9a6/zh-cn/download/87d871824559efb55ff90f80e8abc7ae/preview.mp3 使用迅雷下载可以下载下来! rayfile的音乐播放功能是利用http://www.top100.cn/他的库和数据库实现的播放! 参见:http://partner.top100.cn/audition/popup/flplayer.html?album=gc3dypbzgo&logo=music.rayfile.com/music/dist/image/logo_player.gif&reurl=www.rayfile.com&zid=24 核心是:http://partner.top100.cn/audition/popup/flplayer.html?zid=24; 不适合我的要求!其实我要做的,就是使用单曲播放的mp3,功能如 http://gswt.com.cn/bestupon/player/player_mp3.html http://gswt.com.cn/bestupon/player/index.html 旨在加密,不让用户通过其他非法途径下载(浏览器缓存、利用查看源码拼凑地址等方式)! 非常感谢你的热心的关注! |
|
返回顶楼 | |
发表时间:2010-09-07
最后修改:2010-09-07
Ps:古曲网做的很好!就是不知道他是怎么实现的!
参见http://music.guqu.net/guquplayer1.asp?Musicid=14725&urlid=1 其源码是:http://music4.guqu.net/guqumusic/mengmeng/zhuanji/guzheng/funa_zg/14hrz.wma 迅雷下载:但是缓存依然存在! 更正下: 刚才只是错略的看了下缓存文件的地址:以为是有缓存文件了,但是把缓存文件取出来的话,是一个bat文件,不能播放! 其利用的也是mms://协议来播放的,但不知为什么显示的时候是http://协议,这个中间的转换是怎么实现的呢?深思中!不由的赞叹古曲网这方面做得很成功! |
|
返回顶楼 | |
发表时间:2010-09-07
我想知道豆瓣音乐台是如何实现的,是否有办法抓取音乐下载,不是采用对机器的硬件录音的形式
|
|
返回顶楼 | |
发表时间:2010-09-08
最后修改:2010-09-08
我从未有过经验,关于这个问题我有这样的想法:
1.主要还是在服务器端进行控制!用过滤器验证用户的权限等相关限制条件。 2.可否用流的形式,将文件从服务器端加载到客户端,进行播放。就类似于好多视频网站一样,你只能看下载不到源文件一样! |
|
返回顶楼 | |
发表时间:2010-09-08
BestUpon 写道 xiaoxiaoniao 写道 没有这方面的经验,
只是在考虑几个问题: 1.怎么控制Windows Media Player不会在本地缓存音频文件; 2.要实现的功能和www.songtaste.com上的视听文件管理有相似需求吗,www.rayfile.com功能上是不是已经满足了你的需求; 3.无论使用servlet还是jsp、ajax,最终返回来的页面都是html,对音频地址有隐藏作用吗 Good luck! 看了看www.songtaste.com 他的音乐播放,可以通过右键看到如下链接: http://224.cachefile34.rayfile.com/a9a6/zh-cn/download/87d871824559efb55ff90f80e8abc7ae/preview.mp3 使用迅雷下载可以下载下来! rayfile的音乐播放功能是利用http://www.top100.cn/他的库和数据库实现的播放! 参见:http://partner.top100.cn/audition/popup/flplayer.html?album=gc3dypbzgo&logo=music.rayfile.com/music/dist/image/logo_player.gif&reurl=www.rayfile.com&zid=24 核心是:http://partner.top100.cn/audition/popup/flplayer.html?zid=24; 不适合我的要求!其实我要做的,就是使用单曲播放的mp3,功能如 http://gswt.com.cn/bestupon/player/player_mp3.html http://gswt.com.cn/bestupon/player/index.html 旨在加密,不让用户通过其他非法途径下载(浏览器缓存、利用查看源码拼凑地址等方式)! 非常感谢你的热心的关注! 必须登录才能下载呗,验证session,或者设一些token |
|
返回顶楼 | |