浏览网页,有时会碰到一些我们喜欢的视频,例如一些公司的创意广告,又或者是一些精彩的爱情动作片,因此产生了保存到本地来反复观摩的想法!亲爱的网友,不知道你是否有同样的想法???

  • 网页播放的视频,有些可以下载,有些则无法直接下载,做前端网页设计的应该了解这些能不能下载的背后原理。有懂的可以给普及一下,如何控制允许/禁止客户端下载。。。
  • 作为一个多媒体从业者,我从后端技术角度上来分析一下。服务器应该是不断给我们的浏览器客户端推送编码数据,而不是解码后的yuv数据,因为带宽太大!送来的编码数据会先放到一个缓冲区,去等待解码,解码后得到的yuv数据则可以送render模块进行一帧帧显示,这是总体过程。

因此有了这篇博文,记录下闪现而来的灵感。

先针对一些情况有一些技术性思考,后面再介绍下载网页视频文件的小技巧。

一些思考:

1. 在线视频完整播放一遍后,再seek到开头就能不卡顿流畅播放。内在原理?

  当然,备份解码后的yuv图太占空间,这个首先排除掉。那么,就备份从服务端传来的编码数据,这是一个好的选择,播放就不用再从网络拉流了。

但这里还是面临着一些艰难选择的问题,是备份到内存还是硬盘呢?如果备份到内存则内存很快耗尽,如果备份到硬盘,则对于某些有版权片源面临着泄露的风险(观看付费的电影)。

个人认为,相对来说,备份到硬盘更合理,可以拆分成小片段(用户即使拿到了但是不容易整合成一个单独的视频文件),或者给编码数据再加密,那么即便你拷贝走了也没用。这点不知道推测的准确不?

2. 如何窃走片源?

  专业视频网站都使用各种奇巧淫技来禁止用户下载视频,例如大名鼎鼎的youtube和国内的一些视频网站。但是即使这样,仍有一些工具可以下载这些视频,最简单粗暴的方法就是录屏!

录屏这种方法可以是可以,但质量差,例如你请求播放的是1080p的片源,而你用手机软件去录屏时,录出来的分辨率都是跟你的手机屏幕分辨率一样,并且还会录到其他的不想要的东西,例如进入播放界面的操作过程以及广告!

  有没有其他好的方法呢?如果你在手机厂商或芯片厂商工作,例如小米、oppo、qcom或mtk,肯定知道一些方法:第三方app的最终图像和声音数据总归要送到显示模块和声音播放模块,那么就可以进行拦截了!例如声音的AudioTrack和图像的surfaceflinger,那么对送过来的数据进行编码再保存就可以了。如果第三方app进行视频播放时,使用的是soc的硬件解码器而非自带的软件解码器,那么有更好的方法了,就是直接保存待解码的编码数据。这些方法也仅限于你有sdk,可以直接编译源码去替换掉手机中的库文件,或者有什么命令可以dump出码流数据。

3. PC网页中送来的视频到底如何保存?

  浏览器的工作反正总归这个逻辑:接收编码数据流+解码。如果你对浏览器实现有研究的话,你可以利用源码再重新编译出一个浏览器。那么浏览器肯定知道远端服务器送来的哪些数据是视频流,那么把它保存下来就OK了。但是这种方法太曲折,估计没几个人研究和编译过浏览器源码!(本人最近因工作需要,编译了chrome的源码,11代i7的处理器8核16线程,使用16线程全速编译,一次完整的构建花费了2~3小时,编译完后机箱都烫得够呛,我觉得冬天干这事情比较好,可以省掉个暖手宝了。说下源码情况,仓库50G左右,需要编译近5w个源文件。)

 

下载技巧:

针对一些网站提供的在线视频,而其又禁止我们下载,那么我们该如何获取这些片源呢?而不是通过录屏这种粗糙的方式。下面我给大家介绍一种我摸索出来的方法。

1. 进入网页视频界面

2. F12进入开发者模式,点击最上面菜单窗口的Network

3. 如果不出现xx.mp4,那么ctrl+r,再重新开始播放,直到出现xx.mp4

4. 右键点击xx.mp4进行,选择其链接地址。

5. 拷贝到另外一个tab中打开

6. 点击视频窗口右下角的更多图标中的下载,即可。如果嫌chrome的下载速度慢,可以把链接拷到迅雷中下载。