视频技术的简单理解

前言

之前看到一些视频类APP可以播放VIP或者付费视频,当时很奇怪怎么做到的。只能确定一点,APP的作者肯定不是用的自己的服务器作为播放源。后来看到一些课程,才逐步明白了其中的一些道理。因此,记录一下这一历程。

思考

问题一、为什么不能直接使用<video src="xxx.mp4"></video>标签?

大部分懂点HTML的都会认为要想在网页上播放视频,肯定会优先直接使用video标签。但是大部分视频网站会直接这么用吗?

答案是不会,一部电影2个G,要让用户直接下载完才可以观看吗?用户肯定会骂街。此处的视频播放指在线视频,主动下载或缓存的不在讨论范围内。这时候有些人会想到流媒体,这的确是一个方向。

问题二、一般的视频网站是怎么来优化用户体验的?

用户上传视频后会有以下流程进行处理:

  1. 转码。将视频按照不同的分辨率处理,比如360P、720、1080P和2K等等,满足在不同网络环境下的加载速度
  2. 切片。比如把1小时的视频按分钟拆分为60份,用户在拖动进度条的时候可以快速加载,只需要加载三五个切片就可以了。快速加载,充分利用带宽,减少服务器压力。

需要文件记录:

  1. 视频播放顺序
  2. 视频存放路径

知识点: M3U文件。1. 文件是否有加密 2. 文件地址
视频播放顺序则是从上到下。

1664160498186.png

M3U、text、json => 文本

文件读写

问题三、抓取视频的套路?

基本步骤;

  1. 找到m3u8文件
  2. 通过m3u8下载ts文件
  3. 通过手段把ts文件合并为一个视频文件

实践

  1. 拿到页面源代码
  2. 从源代码提前m3u8文件的URL
  3. 下载m3u8
  4. 读取m3u8文件,下载视频
  5. 合并视频

以91kanju.com为例

首先打开目标视频的URL,查看源代码,然后从源代码里找到带有m3u8的部分
1664177762869.png

1664177786615.png

下载m3u8文件,获取其中内容。
1664177844442.png

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import requests
import re
#
# obj = re.compile(r"url: '(?P<url>.*?)',",re.S)
# url = 'https://www.91kanju.com/vod-play/54812-1-2.html'
#
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
#
# resp = requests.get(url=url,headers=headers).text
#
# m3u8_url = obj.search(resp).group("url")
#
# print(m3u8_url)
#
# #下载m3u8文件
#
# resp2 = requests.get(url=m3u8_url,headers=headers)
# with open("哲仁王后.m3u8",mode='wb') as fp:
# fp.write(resp2.content)
#本地缓存到m3u8文件后将上面注释掉
n = 1
with open("哲仁王后.m3u8",mode='r',encoding='utf-8') as fp:
for line in fp:
line = line.strip()
if line.startswith("#"):
continue
if n<10:

temp = '0' + '0' + str(n)
elif 10<=n<100:
temp = '0' + str(n)
resp3 = requests.get(url=line,headers=headers)
f = open(f"video/{temp}.ts",mode='wb')
f.write(resp3.content)
f.close()
resp3.close()
n+=1
print(temp)

最后一步合并视频的方式就各显神通吧。

总结

事实证明和最初预想的完全不一样。

------ 本文结束 ------

版权声明

Medivh's Notes by Medivh is licensed under a Creative Commons BY-NC-ND 4.0 International License.
Medivh创作并维护的Medivh's Notes博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Medivh 博客( http://www.mknight.cn ),版权所有,侵权必究。