?前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家:點擊跳轉(zhuǎn)
目錄
一,貓抓獲取視頻地址
二,安裝配置ffmpeg
1,windows使用
2,python使用
三,碧站視頻
四,合并ts文件
1,背景
2,實現(xiàn)
4,缺點
五,下載m3u8視頻
1,背景
2,實現(xiàn)V1
3,實現(xiàn)V2
六,分析m3u8鏈接
一,貓抓獲取視頻地址
鏈接:https://pan.baidu.com/s/1eEtZKdNQvB8C_Y_7yNx1hw?
提取碼:rff3
這里可以下載maozhua.rar,解壓之后添加到google或者edge瀏覽器,就能看到瀏覽器有一個貓貓:
對于m3u8的視頻、m4s的視頻,貓抓可以獲取視頻地址。
二,安裝配置ffmpeg
1,windows使用
官網(wǎng)下載ffmpeg-2023-08-07-git-d295b6b693-full_build
放到一個沒有空格的路徑中:
?再把bin目錄配置到環(huán)境變量。
2,python使用
官網(wǎng)下載ffmpeg
下載之后復(fù)制到site-packages中:
三,碧站視頻
碧站都是m4s的視頻,但是畫面和音頻是分開成2個m4s的。
用貓抓獲取資源鏈接:
視頻比較大,音頻比較小,還有個中間大小的不用管。
把視頻下下來,重命名為1.m4s,音頻下下來,重命名為2.m4s,然后用dos訪問文件所在目錄:
cd Downloads
再執(zhí)行一行命令:
ffmpeg -loglevel quiet -i 1.m4s -i 2.m4s -c copy -y out.mp4 & del 1.m4s 2.m4s
四,合并ts文件
1,背景
當(dāng)你從網(wǎng)站下載了一集動漫,然后發(fā)現(xiàn)是一堆ts文件,雖然可以打開,但是每個都是10秒左右,很不方便。
這時,可以用python合并ts文件。
2,實現(xiàn)
代碼:
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順序,和預(yù)期是否一致。
如果不一致,調(diào)整原有ts的命名,或者調(diào)整代碼,直到file_list.txt中的各個ts順序,和預(yù)期一致,才能得到正確的mp4文件。
4,缺點
貌似合并出來的視頻經(jīng)常有問題。。。
五,下載m3u8視頻
1,背景
當(dāng)你用貓抓一個m3u8視頻的地址,那就可以解析m3u8,獲取其中的ts列表,多線程下載所有ts文件。
全部下完之后,用ffmpeg合并成mp4
2,實現(xiàn)V1
Downloader把ts列表做循環(huán)拆分,近似均分給每個線程,同時下載1個m3u8視頻。
download_m3u8_video輸入m3u8視頻的地址,解析ts列表,調(diào)用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,實現(xiàn)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鏈接
有些網(wǎng)站的會員和非會員在同一個網(wǎng)址播放的視頻是不一樣的,比如非會員只有2分鐘可以看。文章來源:http://www.zghlxwxcb.cn/news/detail-637423.html
可以用個簡單的代碼分析m3u8鏈接里面的視頻是長視頻還是短視頻。文章來源地址http://www.zghlxwxcb.cn/news/detail-637423.html
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")
到了這里,關(guān)于python 批量下載m3u8的視頻的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!