浏览网页,有时会碰到一些我们喜欢的视频,例如一些公司的创意广告,又或者是一些精彩的爱情动作片^_^,因此产生了保存到本地来反复观摩的庸俗想法!亲爱的网友,不知道你是否有同样的想法???
网页播放的视频,有些可以下载,有些则无法直接下载,做前端网页设计的应该了解这些能不能下载的背后原理。有懂的可以给普及一下,如何控制允许/禁止客户端下载。。。
作为一个多媒体从业者,我从后端技术角度上来分析一下。服务器应该是不断给我们的浏览器客户端推送编码数据,而不是解码后的yuv数据,因为带宽太大!送来的编码数据会先放到一个缓冲区,去等待解码,解码后得到的yuv数据则可以送render模块进行一帧帧显示,这是总体过程。
先针对一些情况有一些技术性思考,后面再介绍下载网页视频文件的小技巧。
一些思考:
1. 文件完整播放一遍后,再seek到开头就能不卡顿流畅播放。内在原理?
当然,备份解码后的yuv图太占空间,这个首先排除掉。那么,就备份从服务端传来的编码数据,这是一个好的选择,播放就不用再从网络拉流了。
但这里还是面临着一些艰难选择的问题,是备份到内存还是硬盘呢?如果备份到内存则内存很快耗尽,如果备份到硬盘,则对于某些有版权片源面临着泄露的风险(观看付费的电影)。
个人认为,相对来说,备份到硬盘更合理,可以拆分成小片段(用户即使拿到了但是不容易整合成一个单独的视频文件),或者给编码数据再加密,那么即便你拷贝走了也没用。这点不知道推测的准确不?
2. 如何窃走片源?
专业视频网站都使用各种奇巧淫技来禁止用户下载视频,例如大名鼎鼎的youtube和国内的一些视频网站。但是即使这样,仍有一些工具可以下载这些视频,最简单粗暴的方法就是录屏!
录屏这种方法可以是可以,但质量差,例如你请求播放的是1080p的片源,而你用手机软件去录屏时,录出来的分辨率都是跟你的手机屏幕分辨率一样,并且还会录到其他的不想要的东西,例如进入播放界面的操作过程以及广告!
有没有其他好的方法呢?如果你在手机vendor厂商工作,例如qcom或mtk,肯定知道一些方法:第三方app的最终图像和声音数据总归要送到显示模块和声音播放模块,那么就可以进行拦截了!例如声音的AudioTrack和图像的surfaceflinger,那么对送过来的数据进行编码再保存就可以了。如果第三方app进行视频播放时,使用的是手机平台厂商的硬件解码器而非自带的软件解码器,那么有更好的方法了,就是直接保存待解码的编码数据。这些方法也仅限于你有sdk,可以直接编译源码去替换掉手机中的库文件。
3. PC网页中送来的视频到底如何保存?
浏览器的工作反正总归要:收编码数据流+解码。如果你对浏览器实现有研究的话,你可以利用源码再重新编译出一个浏览器。那么浏览器肯定知道远端服务器送来的哪些数据是视频流,那么把它保存下来就OK了。但是这种方法太曲折,估计没几个人研究和编译过浏览器源码!
下载技巧:
1. 进入网页视频界面
2. F12进入开发者模式,点击最上面菜单窗口的Network
3. 如果不出现xx.mp4,那么ctrl+r,再重新开始播放,直到出现xx.mp4
4. 右键点击xx.mp4进行,选择其链接地址。
5. 拷贝到另外一个tab中打开
6. 点击视频窗口右下角的更多图标中的下载,即可。如果嫌chrome的下载速度慢,可以把链接拷到迅雷中下载。