目前而言Youtube视频分为三类,各有不同保护措施 第一类:最开放的,直接可获取真实地址 第二类:版权保护的,无法从第三方站点播放的视频,也可通过直接获取youtube播放页获取真实地址 第三类:签名保护的,这类地址需要通过转换一个key来获取真实地址

首先,youtube播放页关于视频信息是一段javascript,从ytplayer.config = 到;ytplayer.load为止。

其中args的adaptive_fmts是各种分辨率的视频和音频(注意Youtube目前音视频分离)地址。对于第一和第二类,直接解析adaptive_fmts内容即可,每个视频以及音频之间是以逗号为分隔,URL编码。

重点在于第三类视频,这类视频可以发现通过上述方法获取到的地址中,缺少signature这个URL参数,而且提供了名为s的一个参数。 阅读html5player.js后可以发现Youtube针对这类视频是通过javascript将s参数转换为signature,附加到URL后的,而Youtube为了增加被解密的难度,通常几天就会更换一次播放器的js,如本文编写时,地址是https://s.ytimg.com/yts/jsbin/html5player-zh_CN-vflU-xyD7/html5player.js

其中的html5player-zh_CN-vflU-xyD7会经常变化表示不同的播放器版本,除了修正Bug新增特性外,几乎每次都会更换加密的几个参数。所以如果编写Youtube视频解析地址工具,不应该将参数写死在代码中,而应该通过获取javascript内容解析执行。

对于Python而言可通过pyexecjs这个库方便的办到这个事情。

Python代码如下(不保证今后可用) https://gist.github.com/nightcoffee/dad38232a532b36a61b6

修改VIDEO_ID为你的视频ID(就是播放页后跟着的那个字符串) 执行结果

Using javascript interpreter: JavaScriptCore
Title: [MV/HD 4K] SECRET (시크릿) – YOOHOO (유후)
video/webm; codecs=”vp9″ |3840×2160 60fps|611.41MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/webm; codecs=”vp9″ |2560×1440 60fps|261.93MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/mp4; codecs=”avc1.64002a” |1920×1080 60fps|138.53MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/webm; codecs=”vp9″ |1920×1080 60fps|107.17MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/mp4; codecs=”avc1.4d4020″ |1280×720 60fps|82.11MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/webm; codecs=”vp9″ |1280×720 60fps|63.44MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/mp4; codecs=”avc1.4d401f” |854×480 30fps|27.45MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/webm; codecs=”vp9″ |854×480 30fps|19.84MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/mp4; codecs=”avc1.4d401e” |640×360 30fps|14.80MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/webm; codecs=”vp9″ |640×360 30fps|10.78MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/mp4; codecs=”avc1.4d4015″ |426×240 30fps|6.21MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/webm; codecs=”vp9″ |426×240 30fps|5.95MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
video/mp4; codecs=”avc1.4d400c” |256×144 15fps|2.76MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
audio/mp4; codecs=”mp4a.40.2″ | |3.25MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……
audio/webm; codecs=”vorbis” | |3.39MiB |https://r4—sn-nwj7knl7.googlevideo.com/videoplayback……

使用任何工具下载对应格式后的视频和音频后,通过ffmpeg合并

ffmpeg -i 视频文件名 -i 音频文件名 -acodec copy -vcodec copy 输出文件名.mkv