云南網(wǎng)站建設(shè)優(yōu)選平臺(tái)專業(yè)seo整站優(yōu)化
網(wǎng)上給娃找了些好看的電影和一些有趣的短視頻,如何保存下來呢?從網(wǎng)上找各種工具?都不方便。于是想到何不編程搞定,搞個(gè)腳本。對(duì)程序員來說這都不是事兒。且我有華為云服務(wù)器,完全可以把地址記下,后臺(tái)自動(dòng)下載有空再看。這里總結(jié)分享下方法給有需要的小伙伴。
前言
【轉(zhuǎn)載請(qǐng)注明出處】本文鏈接:https://blog.csdn.net/yyz_1987/article/details/133783787
很多網(wǎng)站視頻不提供下載功能,遇到好的視頻素材就難以下載。現(xiàn)在的好多在線視頻都不是mp4的格式的了,查看鏈接是m3u8的鏈接。m3u8是一種播放列表文件格式,通常用于流媒體傳輸。它包含一系列的.ts(Transport Stream)文件的鏈接,這些文件包含了視頻和音頻的分段數(shù)據(jù)。m3u8文件本身并不包含實(shí)際的視頻數(shù)據(jù),而是指示播放器在何處獲取分段視頻文件。 為了防止盜版,以及流量和帶寬的濫用,ts文件格式是一種視頻分段的的技術(shù),主要是需要一個(gè)索引文件列出該視頻所有的分段信息,有時(shí)長(zhǎng)和一些ts文件名的信息。
ts文件是一種常見的視頻文件格式,用于存儲(chǔ)音頻、視頻和其他多媒體數(shù)據(jù)。它是MPEG-2傳輸流的基礎(chǔ),也被廣泛用于流媒體傳輸。ts文件通常是視頻流的分段文件,每個(gè)文件包含一小段視頻和音頻數(shù)據(jù)。 在使用m3u8和ts文件時(shí),m3u8文件作為播放列表提供給播放器,播放器會(huì)根據(jù)m3u8文件中的鏈接逐個(gè)下載ts文件,并按順序播放這些分段視頻文件,從而實(shí)現(xiàn)流媒體的播放。
ffmpeg介紹
ffmpeg是一個(gè)十分強(qiáng)大的音視頻處理工具,提供轉(zhuǎn)碼、播放等基礎(chǔ)功能,功能十分全面、強(qiáng)大。是一款非常好用處理音視頻的軟件工具包,在Win10中使用ffmpeg需要下載后再添加環(huán)境變量,下載網(wǎng)站:Download FFmpe
使用ffmpeg下載m3u8并轉(zhuǎn)換為mp4格式:
ffmpeg -i "https://v.rnaa.xyz/hls2/cl6z9guvr000212g0w9omylow/oRrc4hpOpuO/index.m3u8?auth=4skJHep0Po6jo0ieZpY2pgc_JktDisWQ3fIRk000Gds&exp=1697072400&v=6" -bsf:a aac_adtstoasc -c copy out.mp4 -http_persistent 0
VLC播放器介紹
可以用VLC播放器來播放m3u8的網(wǎng)絡(luò)流視頻。?
VLC是一款功能強(qiáng)大的開源播放器,VLC的全名為Video Lan Client,是一個(gè)開源的、跨平臺(tái)的視頻播放器。VLS支持多種常見音視頻格式,支持多種流媒體傳輸協(xié)議,也可當(dāng)作本地流媒體服務(wù)器使用。其官方下載地址為?https://www.videolan.org/
VLC: Official site - Free multimedia solutions for all OS! - VideoLAN
VLC功能很強(qiáng)大,不僅是一個(gè)視頻播放器,也可以作為小型的視頻服務(wù)器,一邊播放一邊轉(zhuǎn)碼,把視頻流發(fā)送到網(wǎng)絡(luò)上。
m3u8介紹
m3u8文件是指UTF8編碼格式的M3U文件。m3u8文件是記錄了一個(gè)索引純文本文件,打開它時(shí)播放軟件并不是播放它,而是根據(jù)它的索引找到對(duì)應(yīng)的音視頻文件的網(wǎng)絡(luò)地址進(jìn)行在線播放。m3u是包含媒體文件URL的一個(gè)事實(shí)上的播放列表標(biāo)準(zhǔn),這種格式被用來作為HTTPLive媒體流索引文件的格式。
M3U8這種文件格式本質(zhì)上不是音視頻文件,而是一種音視頻文件的列表文件,本身文件很小,采用的是用Latin1字符集編碼,是純文本文件。它并不能在脫機(jī)模式下讀取網(wǎng)絡(luò)資源音頻。設(shè)計(jì)的初衷也是為了播放音頻文件。而后來采用了UTF8編碼就形成了M3U8格式文件,把一個(gè)大視頻文件分割成若干小文件,通過M3U8記錄保存音頻,視頻分塊的列表地址。
我們只需在瀏覽器下載列表中選中需要合并轉(zhuǎn)碼的M3U8文件,簡(jiǎn)單操作即可將其轉(zhuǎn)換成常見的MP4格式。
MP4格式,曾經(jīng)是互聯(lián)網(wǎng)上在線視頻運(yùn)用最廣泛的一種格式,但是隨著移動(dòng)互聯(lián)網(wǎng)用戶日益增多,MP4文件格式的弊端也日益凸顯,比如文件容量大需要加載很長(zhǎng)時(shí)間才能播放,甚至有的播放器必須完全下載完畢才能播放。
反觀M3U8格式,將視頻文件切分成小片并建立索引文件,用戶根據(jù)自己的網(wǎng)絡(luò)帶寬,可以選擇適合自己碼率的文件進(jìn)行播放,從而保證了視頻的流暢。雖然在網(wǎng)絡(luò)播放過程中,M3U8格式比MP4格式更具優(yōu)勢(shì)。
其他網(wǎng)絡(luò)短視頻下載神器
瀏覽器的Video DownloadHelper插件:
https://download.csdn.net/download/u014519384/74704686
Chrome瀏覽器媒體網(wǎng)站的視頻下載幫助插件,下載該插件壓縮包,解壓得到該插件.Crx文件,復(fù)制chrome://extensions/粘貼到Chrome瀏覽器地址欄,打開擴(kuò)展程序界面,然后直接拖動(dòng)解壓得到的.Crx文件到瀏覽器打開的擴(kuò)展程序窗口內(nèi),按提示,即可完成本插件安裝。
如何找m3u8視頻的文件地址?
1。搜索你的電影并打開正在播放的頁面
2。打開“開發(fā)者工具” ,瀏覽器一般快捷鍵是:F12 。 如果沒有反應(yīng),就找設(shè)置菜單的工具里找,什么?你瀏覽器沒有? 那你換個(gè)正常點(diǎn)的瀏覽器吧。 我反正用谷歌、傲游、還有win10 自帶的Microsoft Edge都是有的!
3。找到網(wǎng)絡(luò)(Network)一欄,在搜索過渡欄里輸入m3u8 。記得,這里要按 F5把頁面重新打開刷新一次,因?yàn)閯傞_始打開時(shí)沒開工具欄,所以看不到之前下載的信息。
如圖:
注意上圖中的 index.m3u8 , 不一定所有網(wǎng)站都是這名字,只要看后輟是m3u8就可以了,如果是有多個(gè),就點(diǎn)最下面那一個(gè)。 在上面點(diǎn)右鍵 》 復(fù)制 》復(fù)制鏈接地址。 然后把復(fù)制的地址先存起來。 也可以放到本機(jī)上的VLC播放器里播放網(wǎng)絡(luò)流試試。
其他短視頻下載方式
如果是如頭條或抖音的短視頻,如何查看地址:
選擇過濾類型media,然后復(fù)制下面的鏈接地址在瀏覽器里打開試試。
查看到類似如下內(nèi)容,可以單獨(dú)復(fù)制到瀏覽器中播放查看。
https://v26-web.toutiaovod.com/bf217da9d3d1faef4154643e118cff90/65276756/video/tos/cn/tos-cn-ve-4/o8BjgCDn6GbA2AZA1l2eArcRDl8n7RAHSCBCeg/?a=24&ch=0&cr=0&dr=0&er=0&lr=unwatermarked&net=5&cd=0%7C0%7C0%7C0&cv=1&br=440&bt=440&cs=0&ds=3&eid=21760&ft=7X_QHBWGUUmfzSdFD02D1YswHAX1tGDkdh49eFuBBR2D12nz&mime_type=video_mp4&qs=0&rc=Zzo6OTM7OTgzaTVkZDpkZkBpamRsdTM6ZmpwbjMzNDczM0BjMTY2LzEwNi4xYGFiL2EuYSNvb2otcjRnZWNgLS1kLS9zcw%3D%3D&btag=e00028000&dy_q=1697077398&l=20231012102318359BDF54C771C3838312
或者使用you-get
You-Get是一個(gè)基于 Python 3 的下載工具。使用 You-Get 可以很輕松的下載到網(wǎng)絡(luò)上的視頻、圖片及音樂。
pip3 install you-get
#或者
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple you-get
如:下載一段B站Python教學(xué)視頻并保存在E:\Desktop
you-get -o E:/Desktop https://www.bilibili.com/video/av36938586
?帶參數(shù)下載視頻:
參數(shù):-o 文件絕對(duì)路徑
參數(shù):-O 文件重命名
參數(shù):--format=flv 需要下載的版本號(hào)
運(yùn)行命令后,you-get將開始解析頭條短視頻的頁面并提取視頻的下載鏈接。然后,它將自動(dòng)下載視頻文件到您的當(dāng)前工作目錄中。 請(qǐng)注意,you-get可能無法支持所有頭條短視頻的下載,因?yàn)橐曨l網(wǎng)站可能會(huì)進(jìn)行更改或添加反爬蟲機(jī)制。如果不能下載,則要尋找其他方式了。
python腳本下載m3u8視頻
python環(huán)境依賴安裝
pip install m3u8
pip install pycryptodome
Python代碼:
#這是一個(gè)下載m3u8 視頻資源的腳本 無指定序號(hào)版,根據(jù)資源數(shù)組排序 非ffmpeg合并版
import os
import re
import sys
import m3u8
import glob
import time
import requests
import concurrent.futures
from Crypto.Cipher import AES
from concurrent.futures import as_completed#請(qǐng)求頭
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Language': 'Zh-CN, zh;q=0.9, en-gb;q=0.8, en;q=0.7'
} #判斷是否為網(wǎng)站地址
def reurl(url):pattern = re.compile(r'^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+')m=pattern.search(url)if m is None:return Falseelse:return True#獲取密鑰(針對(duì)有些m3u8文件中的視頻需要key去解密下載的視頻)
def getKey(keystr,url):keyinfo= str(keystr)method_pos= keyinfo.find('METHOD')comma_pos = keyinfo.find(",")method = keyinfo[method_pos:comma_pos].split('=')[1]uri_pos = keyinfo.find("URI")quotation_mark_pos = keyinfo.rfind('"')key_url = keyinfo[uri_pos:quotation_mark_pos].split('"')[1]if reurl(key_url) == False:key_url = url.rsplit("/", 1)[0] + "/" + key_urlres = requests.get(key_url,headers=headers)key = res.contentprint(method)print(key.decode('utf-8','ignore'))return method, key#下載文件
#down_url:ts文件地址
#url:*.m3u8文件地址
#decrypt:是否加密
#down_path:下載地址
#key:密鑰
def download(down_url,url,decrypt,down_path,key,nameid):if reurl(down_url) == False:if len(down_url.rsplit("/", 1))>1:filename = down_url.rsplit("/", 1)[1]else:filename = down_urldown_url = url.rsplit("/", 1)[0] + "/" + down_urlelse:filename = down_url.rsplit("/", 1)[1]down_ts_path = down_path+"/{0}".format(filename)if os.path.exists(down_ts_path):print('文件 '+filename+' 已經(jīng)存在,跳過下載.')else: try:res = requests.get(down_url, stream=True, verify=False,headers=headers)print('正在下載資源:'+filename+'')except Exception as e:print('requests error:',e)returnif decrypt:cryptor = AES.new(key, AES.MODE_CBC, key)with open(down_ts_path,"wb+") as file:for chunk in res.iter_content(chunk_size=1024):if chunk:if decrypt:file.write(cryptor.decrypt(chunk))else:file.write(chunk)print('文件:['+filename+']已保存到['+down_path+']目錄.')#合并ts文件
#dest_file:合成文件名
#source_path:ts文件目錄
#ts_list:文件列表
#delete:合成結(jié)束是否刪除ts文件
def merge_to_mp4(dest_file, source_path,ts_list, delete=False):files = glob.glob(source_path + '/*.ts')if len(files)!=len(ts_list):print("文件不完整,已取消合并!請(qǐng)重新執(zhí)行一次腳本,完成未下載的文件。\n如果確認(rèn)已下載完所有文件,請(qǐng)檢查下載目錄移除其它無關(guān)的ts文件。")returnprint('開始合并['+source_path+']目錄的ts視頻...')with open(dest_file, 'wb') as fw:for file in ts_list:with open(source_path+"/"+file, 'rb') as fr:fw.write(fr.read())if delete:os.remove(file)print('合并完成! 文件名:'+dest_file+'')def main(): url = "https://xxxx/hls/index.m3u8" #下載地址,通過 cmd 傳入或輸入print('\n')print('參數(shù)說明:腳本后面面添加 m3u8地址參數(shù),如打開CMD(終端命令)模式輸入:m3u8dl http://xxx.xxx.com/xxx.m3u8')print('\n')print(' 如果m3u8地址訪問不到,提示錯(cuò)誤,多重復(fù)幾次就好。前提是確認(rèn)在線能觀看可下載到m3u8文件。')print(' 下載中途不動(dòng)了或者關(guān)機(jī),可關(guān)閉取消下載,再次打開繼續(xù)下載。')print(' 有些文件一次下載不到,需要多次執(zhí)行下載。')print(' 等所有文件下載完后自動(dòng)合成一個(gè)視頻,注意看提示。')print('\n')if len(sys.argv)>1:url=(sys.argv[1])else:print('親,沒有添加m3u8地址,請(qǐng)?jiān)谙路捷斎?')url=input()#禁止安全誰提示信息requests.packages.urllib3.disable_warnings() print('開始分析m3u8文件資源...')#使用m3u8庫獲取文件信息 try:video = m3u8.load(url, timeout=20, headers=headers)except Exception as e:print('m3u8文件資源連接失敗!請(qǐng)檢查m3u8文件地址并重試.錯(cuò)誤代碼:',e)return#設(shè)置下載路徑down_path="tmp"#設(shè)置是否加密標(biāo)志decrypt = False#ts列表ts_list=[]#判斷是否加密key=''if video.keys[0] is not None:method,key =getKey(video.keys[0],url)decrypt = True#判斷是否需要?jiǎng)?chuàng)建文件夾if not os.path.exists(down_path):os.mkdir(down_path)#把ts文件名添加到列表中for filename in video.segments:if len(filename.uri.rsplit("/", 1))>1:ts_list.append(filename.uri.rsplit("/", 1)[1])else:ts_list.append(filename.uri) #開啟線程池with concurrent.futures.ThreadPoolExecutor() as executor:obj_list = []begin = time.time()#記錄線程開始時(shí)間for i in range(len(video.segments)):obj = executor.submit(download,video.segments[i].uri,url,decrypt,down_path,key,i)obj_list.append(obj)#查看線程池是否結(jié)束for future in as_completed(obj_list):data = future.result()# print('completed result:',data)merge_to_mp4('finalvideo.mp4', down_path,ts_list)#合并ts文件times = time.time() - begin #記錄線程完成時(shí)間print('總消耗時(shí)間:'+str(times)+'')if __name__ == "__main__":main()
其他資源
【音視頻基礎(chǔ)】VLC播放器 - 知乎
使用Python腳本調(diào)用ffmpeg下載ts分段視頻文件_python下載ts文件-CSDN博客
https://www.cnblogs.com/bjguanmu/articles/13044378.html
使用Python腳本調(diào)用ffmpeg下載ts分段視頻文件 - 知乎
VideoDownloadHelper插件安裝與使用 - 知乎
曲線救國(guó)-解決FFmpeg下載m3u8視頻中途卡住的問題_ffmpeg下載m3u8太慢_myth long的博客-CSDN博客
VideoDownloadhelper無限制_網(wǎng)絡(luò)視頻解析下載_MP4_支持多平臺(tái) - 知乎
使用EasyDarwin + ffmpeg 搭建流媒體服務(wù)器,實(shí)現(xiàn)多臺(tái)智能電視同步播放宣傳視頻_ffmpeg推流多個(gè)視頻_三棵樹機(jī)務(wù)段的博客-CSDN博客
常見流媒體服務(wù)器方案對(duì)比分析 - 知乎?