youtube是如何前后端分离音视频的?

背景:做一个视频网站,让用户无法下载视频,像 YouTube 一样,以下是问题描述,

目前我是可以做到很多m3u8插件无法检测到视频了,但是有一个油猴的插件:https://greasyfork.org/zh-CN/...
竟然能做到捕获video标签的视频流,我用这个插件去试了试 YouTube,发现下载下来两个文件,一个是音频文件,一个是视频文件,小于等于720P的视频音视频是一起的。

我一直以为 YouTube 是一个 video 标签和一个 audio 标签,暂停就都暂停,播放就都播放
但是,YouTube的播放页只有一个video标签,它是怎么做到一个video标签音视频分离的呢?而且它的文件流还都是post请求,我更百思不得其解

阅读 3k
2 个回答

虽然没做过这方面的开发,不过你发的脚本源码很简单,可以很轻易的分析出关键点 addSourceBuffer 方法的 mime 中。

再到 youtube 的页面随便找一个视频,打开控制台找到插件打印的日志:

MediaSource.addSourceBuffer  audio/webm; codecs="opus"

这说明肯定是有 audio 数据被添加了。

再分析 youtube 的页面代码,查找 audio,就可以看到 audio 的数据链接,youtube 还很贴心的做了不同的码率,点击就能播放。

这说明它是单独的 audio,只不过没有用 audio 标签实现。
image.png

那么来到 google 搜索:javascript play audio without tag,就得到了答案。

至于为什么 youtube 要这样用,可能可以使码率的选择更加灵活,当然这也带来了更多需要的编码工作。


视频网站无法让用户下载视频

这是没办法的,只要你用网络传输,就一定能被下载,只不过是难度大小问题。

但也不是没有方法,我知道的最根本的解决办法就是回到 IE 时代,自己写播放插件,这样你就能自定义加密解密视频流,即使是抓包也不好破解。

我没记错的话,youtube应该是采用DASH,B站好像也采用了这种技术。你可以参考这个仓库:

至于更深入的,可能需要找个音视频的大佬来了orz.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏