1. 解析目的
youtube视频在线观看时,经常会弹出广告,影响体验。且网站中不提供缓存视频方法,无法直接下载youtube视频到本地。对于网络状况不稳定墙内用户来说,下载视频到本地以便随时观看是极为迫切的需求。
但是youtube视频做了一些比较好的保密和封装,需要一定的手段去破解。本文将讲述youtube视频的解析流程,提供一种简易的解析方法。
2. 解析方法
视频格式
首先需要了解youtube的视频格式,youtube中音频跟视频文件是分开的,这就导致解析出来会有视频链接跟音频链接,两者需要一起下载,最后合成一个完整视频。当然不合成也可以播放,需要播放器支持单独设置音频流跟视频流即可,但是用起来还是不太方便。。
视频跟音频同时具有多种编码格式,比如视频有av1、vp9、h265、h264,音频有aac、opus等。这些格式分别有优劣,比如av1压缩率高、视频占用空间小,但是支持性低,在一些设备上播放不了;而h264广泛性好,设备兼容性高,但是压缩率低,在1080p以上的视频大小过高。youtube视频会同时包揽这些格式,可以根据实际的场景去选择最优的格式组合。
ITag
youtube中所有音视频格式都有一个自己的itag作为标记。参考这篇格式记录,列出一些常见的itag
解析接口
接着进入到解析流程,解析需要用到视频的一个唯一标识videoId,再调用一个youtube的player api,填上特定的参数和信息,就可以获取到视频的相关信息,包括下载链接。
以下是一些必要信息:
-
视频id:视频链接中watch?v=后面的部分,如www.youtube.com/watch?v=07yls_7jYHw中视频id为07yls_7jYHw
-
api:
https://m.youtube.com/youtubei/v1/player?prettyPrint="false" -
请求方法:POST
-
Headers部分:
-
X-Youtube-Client-Name:5
-
X-Youtube-Client-Version:19.29.1
-
User-Agent:com.google.ios.youtube/19.29.1 (iPhone16,2; U; CPU iOS 17_5_1 like Mac OS X;)
-
Origin:www.youtube.com
-
Body部分:{"context": {"client": {"clientName": "IOS", "clientVersion": "19.29.1", "deviceMake": "Apple", "deviceModel": "iPhone16,2", "userAgent": "com.google.ios.youtube/19.29.1 (iPhone16,2; U; CPU iOS 17_5_1 like Mac OS X;)", "osName": "iPhone", "osVersion": "17.5.1.21F90", "hl": "en", "timeZone": "UTC", "utcOffsetMinutes": 0}}, "videoId": "07yls_7jYHw", "playbackContext": {"contentPlaybackContext": {"html5Preference": "HTML5_PREF_WANTS"}}, "contentCheckOk": true, "racyCheckOk": true}
把Body中videoId替换为需要解析的视频id,根据规范发送请求,就可以得到视频的信息
该接口方法参考自开源库yt-dlp
获取下载链接
解析接口会返回一串json数据,找到其中的streamingData->adaptiveFormats,里面会有多项视频信息。比如其中一个视频格式信息如下:
{
"itag": 248,
"url": "https://rr2---sn-nx57ynsk.googlevideo.com/videoplayback?expire=1728489632&ei=QFQGZ_3IN_7u2roPl8TbmAw&ip=107.151.166.94&id=o-AOhW6iP6jqFG0Xqh-CaHxrmic1_yX4TKdp6cAHpqIjCn&itag=248&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1728468032%2C&mh=jR&mm=31%2C26&mn=sn-nx57ynsk%2Csn-o097znz7&ms=au%2Conr&mv=m&mvi=2&pl=23&rms=au%2Cau&initcwndbps=376250&vprv=1&svpuc=1&mime=video%2Fwebm&rqh=1&gir=yes&clen=75220641&dur=866.133&lmt=1728395241728708&mt=1728467585&fvip=1&keepalive=yes&fexp=51300760&c=IOS&txp=330F224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhAKqKStSK3841aY7EnctkIsfOxeL0CA2JsD-XdGiKij3YAiBNeglZm0BWULfdKxqnvvG_PFmztwiasF5lqbgLTLWIGw%3D%3D&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwndbps&lsig=ACJ0pHgwRQIgCLjizIbWyggkzGi65MZZjT9IhzrFlt81zN85ng6hQrYCIQC2pKFueIOytLPIBOYEyGx7_1qa2AdIYK6Kkq0wm7O6Sg%3D%3D",
"mimeType": "video/webm; codecs=\"vp09.00.40.08\"",
"bitrate": 1504789,
"width": 1920,
"height": 1080,
"initRange": {
"start": "0",
"end": "219"
},
"indexRange": {
"start": "220",
"end": "3161"
},
"lastModified": "1728395241728708",
"contentLength": "75220641",
"quality": "hd1080",
"fps": 30,
"qualityLabel": "1080p",
"projectionType": "RECTANGULAR",
"averageBitrate": 694772,
"colorInfo": {
"primaries": "COLOR_PRIMARIES_BT709",
"transferCharacteristics": "COLOR_TRANSFER_CHARACTERISTICS_BT709",
"matrixCoefficients": "COLOR_MATRIX_COEFFICIENTS_BT709"
},
"approxDurationMs": "866133"
}
itag为248,表示这是一个1080p的vp9格式视频,contentLength为75220641表示大小75M,视频长度approxDurationMs为866133,即14m26s。
其中url字段即为该单视频文件的下载链接,但是需要注意两点:
- 下载链接有过期时间,从解析开始持续6小时,超过这个时间后链接就会失效。在下载链接中expire=1728489632就是过期时间
- 该下载链接是一个dash视频,没有声音。需要再从adaptiveFormats中找到一个音频的下载链接,比如itag为139的音频格式
音视频合成
首先需要选取合适的音视频格式,推荐是vp9+opus,其次是vp9+aac、h264+aac,这几种组合的合成成功率跟兼容性都比较好
音视频合成工具使用ffmep,以mkv作为容器,将下载好的视频文件跟音频文件传入即可合成
合成命令:ffmpeg -i videoFile -i audioFile -c copy outputFile
总结
提供了一个简单的youtube视频解析方法参考,在yt-dlp库中还有一些需要动态解密的解析方法,感兴趣的可以自己查看。
youtube视频解析比一般的网站复杂,涉及的内容较多,一个文章可能没法讲述详尽。如果有需要的话,后面再写一个Android端的demo参考