面对好看的视频、好听的音乐什么的,我会用浏览器的开发人员工具捕捉媒体的URL,然后下载下来。

对于音乐,似乎没有什么问题,就算是各大音乐网站上的音乐,这个方法也能轻松下载。音乐有方便的破解软件可以用所以这个方法基本不用

但是视频就不是这么顺利了,得看脸,脸好的时候能够直接看到mp4之类的文件,脸不好就是一大串ts文件了。

很多时候,一个完整的视频是由很多很多.ts文件组成的,这时候想要直接完整下载视频下来几乎不可能。

这些.ts文件的名称似乎没什么规律,所以,一定有什么东西记录着这些.ts文件,不然播放器怎么知道什么时候应该播放哪个.ts文件呢?(卖关子)

这些信息都是记录在m3u8文件里面的,所以,先下载m3u8,剩下的事情慢慢解决。

m3u8下载器早就有很多了,但是我就是想写一个。

ts文件

传送流文件,流媒体文件。

这种文件具体结构没有了解,仅仅了解了需要的东西。

ts文件开头4字节的文件头,用于标识自己是ts文件,这四个字节是十进制的[47,40,11,10]

4字节后面是有效视频数据。

要合并很多ts文件成为一个ts文件,只需要简单粗暴地把所有ts文件的有效视频数据拼起来,最后为了符合规范,再加上4字节文件头。

m3u8文件

纯文本文件,第一行是#EXTM3U,用于标识自己是m3u8文件。

同样没有深入了解,够用就行。

文件里面“#”开头的是一些标识什么的,什么ts持续多长时间啦,m3u8文件版本啦,这些统统不需要,不是“#”全部都是ts的URL。

URL的顺序就是播放的正确顺序。

万事俱备,敲代码

这种事情交给Golang最好了,但是我想写完挂在Blog上面呢,JavaScript,开始!

css什么的抄一下之前在音高提取程序里面的代码,重点在JavaScript上面。

不得不说,JavaScript的异步用着真舒服,随随便便并发请求。

大体敲完代码之后,问题出现了。

跨域请求问题

浏览器默认不允许跨域请求,似乎是为了保证安全,通过JavaScript下载视频,毫无疑问是属于跨域请求,一些网站会在http的响应头里面表示允许跨域请求,这样的能够正常下载,但是多数都不能下载。

所以,怎么办?

跨域请求被拒绝是浏览器拒绝的,所以只需要让浏览器允许跨域请求就好了啊。

对于Firefox

在火狐的高级首选项about:config里面,搜索security.fileuri.strict_origin_policy这个设置,把它从true改成false

对于Chrome

启动时加上这样的命令行参数: --disable-web-security,像是 chrome.exe --disable-web-security 这样启动。


既然浏览器是为了安全考虑,那么用完记得改回去。

相对目录问题

在我编写程序的时候,看的m3u8文件里面全都是绝对URL,m3u8里面也是可以是相对URL的,刚刚写完程序测试的我就遇到相对URL的m3u8了。

相对路径也就两种,“/”开头的是相对于根目录,不以“/”开头的是相对于m3u8文件所在的目录,把相对目录拼成绝对目录就好了。


项目已经放到Github,依旧请原谅我的代码写的烂,在这里

我能想到的,最大的成功就是无愧于自己的心。