前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转
目录
一,猫抓获取视频地址
这里可以下载maozhua.rar,解压之后添加到google或者edge浏览器,就能看到浏览器有一个猫猫:
对于m3u8的视频、m4s的视频,猫抓可以获取视频地址。
二,安装配置ffmpeg
1,windows使用
官网下载ffmpeg-2023-08-07-git-d295b6b693-full_build
放到一个没有空格的路径中:
再把bin目录配置到环境变量。
2,python使用
官网下载ffmpeg
下载之后复制到site-packages中:
三,碧站视频
碧站都是m4s的视频,但是画面和音频是分开成2个m4s的。
用猫抓获取资源链接:
视频比较大,音频比较小,还有个中间大小的不用管。
把视频下下来,重命名为1.m4s,音频下下来,重命名为2.m4s,然后用dos访问文件所在目录:
cd Downloads
再执行一行命令:
ffmpeg -loglevel quiet -i 1.m4s -i 2.m4s -c copy -y out.mp4 & del 1.m4s 2.m4s
四,合并ts文件
1,背景
当你从网站下载了一集动漫,然后发现是一堆ts文件,虽然可以打开,但是每个都是10秒左右,很不方便。
这时,可以用python合并ts文件。
2,实现
代码:
def merge_file(path, save_path):
file_names = os.listdir(path)
if 'file_list.txt' in file_names:
os.remove(path+'file_list.txt')
f = open(path+'file_list.txt', 'w+')
for one in file_names:
f.write("file '" + one + "'\n")
f.close()
ffmpeg_bin_dic = 'C:/ffmpeg-2023-08-07-git-d295b6b693-full_build/bin/'
os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path)
注意,需要看一下file_list.txt中的各个ts顺序,和预期是否一致。
如果不一致,调整原有ts的命名,或者调整代码,直到file_list.txt中的各个ts顺序,和预期一致,才能得到正确的mp4文件。
4,缺点
貌似合并出来的视频经常有问题。。。
五,下载m3u8视频
1,背景
当你用猫抓一个m3u8视频的地址,那就可以解析m3u8,获取其中的ts列表,多线程下载所有ts文件。
全部下完之后,用ffmpeg合并成mp4
2,实现V1
Downloader把ts列表做循环拆分,近似均分给每个线程,同时下载1个m3u8视频。
download_m3u8_video输入m3u8视频的地址,解析ts列表,调用Downloader并控制多线程。
import requests
import os
import threading
tnum = 64
class Downloader(threading.Thread):
def __init__(self, id, url, ts_list, file_path):
threading.Thread.__init__(self)
self.id = id
self.url = url
self.ts_list = ts_list
self.file_path = file_path
def run(self):
for i in range(self.id, len(self.ts_list), tnum):
ts_url = self.ts_list[i]
r = requests.get(ts_url, stream=True)
if r.status_code == 200:
with open(self.file_path + f'_{i}.ts', 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
def download_m3u8_video(url, file_path):
r = requests.get(url)
if r.status_code != 200:
print('m3u8视频下载链接无效')
return False
m3u8_list = r.text.split('\n')
m3u8_list = [i for i in m3u8_list if i and i[0] != '#']
ts_list = []
for ts_url in m3u8_list:
ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
ts_list.append(ts_url)
f = open(file_path+'file_list.txt', 'w+')
for i in range(len(ts_list)):
f.write('file \'' + f'_{i}.ts' + "'\n")
f.close()
threads = []
for i in range(0, tnum):
thread = Downloader(i, url, ts_list, file_path.rsplit('.', 1)[0])
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
return not endflag
def merge_file(path, save_path):
ffmpeg_bin_dic = 'C:/ffmpeg-2023-08-07-git-d295b6b693-full_build/bin/'
os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path)
def down(url):
name = url[-41:-5]
print(name)
ts_file_path = 'D:/v/' + name+'/'
os.makedirs(ts_file_path)
mp4_file_path = 'D:/v2/'+name+'.mp4'
global endflag
endflag = False
if download_m3u8_video(url, ts_file_path):
print('m3u8视频下载完成')
merge_file(ts_file_path, mp4_file_path)
else :
print('error!!!!')
print(url)
url_list = [
'https://sth.com/videos/202305091/d63b006e-c6fb-4997-8d43-7ebd086e9c75.m3u8',
'https://sth.com/videos/202305081/2c9fa41b-e25b-4371-908f-d246628d7bed.m3u8',
]
for url in url_list:
down(url)
3,实现V2
import requests
import os
import threading
tnum = 64
def download_m3u8_video(url, file_path):
r = requests.get(url)
if r.status_code != 200:
return False
m3u8_list = r.text.split('\n')
m3u8_list = [i for i in m3u8_list if i and i[0] != '#']
ts_list = []
for ts_url in m3u8_list:
ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
ts_list.append(ts_url)
f = open(file_path + 'file_list.txt', 'w+')
for i in range(len(ts_list)):
f.write('file \'' + f'_{i}.ts' + "'\n")
f.close()
for i in range(0, len(ts_list)):
ts_url = ts_list[i]
r = requests.get(ts_url, stream=True)
if r.status_code == 200:
with open(file_path + f'_{i}.ts', 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
return True
def merge_file(path, save_path):
ffmpeg_bin_dic = 'C:/ffmpeg-2023-08-07-git-d295b6b693-full_build/bin/'
os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path)
def down(url):
name = url[-41:-5]
print(name)
ts_file_path = 'D:/v/' + name+'/'
os.makedirs(ts_file_path)
mp4_file_path = 'D:/v2/'+name+'.mp4'
ret = download_m3u8_video(url, ts_file_path)
print(name, end=' ')
if ret:
print('m3u8视频下载完成')
merge_file(ts_file_path, mp4_file_path)
else :
print('error!!!!')
class down_list(threading.Thread):
def __init__(self, url_list, id):
threading.Thread.__init__(self)
self.id = id
self.url_list = url_list
def run(self):
for i in range(self.id, len(self.url_list), tnum):
url = self.url_list[i]
down(url)
def down_all(url_list):
threads=[]
for i in range(0, tnum):
thread = down_list(url_list,i)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
url_list = [
]
down_all(url_list)
六,分析m3u8链接
有些网站的会员和非会员在同一个网址播放的视频是不一样的,比如非会员只有2分钟可以看。
可以用个简单的代码分析m3u8链接里面的视频是长视频还是短视频。
def testUrl(url):
print(url)
print('ans:')
r = requests.get(url)
m3u8_list = r.text.split('\n')
m3u8_list = [i for i in m3u8_list if i and i[0] != '#']
if len(m3u8_list) < 50:
file = open('D:\\out.txt', 'a')
file.write(url+"\n")
file.close()
else:
print(url+" ok")