使用脚本下载.ts文件并合并
文章目錄
- 👑1.什么是.ts文件/.m3u8文件
- 🐱?💻2. 使用腳本下載多個(gè).ts文件(未加密)
- 2.1 找到請求url地址
- 2.2 代碼
👑1.什么是.ts文件/.m3u8文件
參考:
- 【技術(shù)科普】HLS視頻流內(nèi)m3u8文件和TS切片是什么關(guān)系?
- 視頻文件M3U8和TS格式切片,討論一下?
- Python通過m3u8文件下載合并ts視頻的操作
大概可以得出以下不太準(zhǔn)確的一個(gè)描述:
m3u8是蘋果公司推出一種視頻播放標(biāo)準(zhǔn),是一種文件檢索格式,將視頻切割成一小段一小段的ts格式的視頻文件,然后存在服務(wù)器中(現(xiàn)在為了減少I/o訪問次數(shù),一般存在服務(wù)器的內(nèi)存中),通過m3u8解析出來路徑,然后去請求,是現(xiàn)在比較流行的一種加載方式。目前,很多新聞視頻網(wǎng)站都是采用這種模式去加載視頻。
M3U8文件是指UTF-8編碼格式的M3U文件。M3U文件是記錄了一個(gè)索引純文本文件,打開它時(shí)播放軟件并不是播放它,而是根據(jù)它的索引找到對應(yīng)的音視頻文件的網(wǎng)絡(luò)地址進(jìn)行在線播放。原視頻數(shù)據(jù)分割為很多個(gè)TS流,每個(gè)TS流的地址記錄在m3u8文件列表中。
.ts文件是切片后的視頻文件,.m3u8文件實(shí)質(zhì)是一個(gè)播放列表(playlist)
以百度百科-基金這一詞條中秒懂百科的視頻為例,其.m3u8文件使用文本文件打開后,內(nèi)容如下:
#EXTM3U #EXT-X-VERSION:3#EXT-X-STREAM-INF:BANDWIDTH=1720000,RESOLUTION=1280x720 16978848c8546fb7bfe6156e6da07016_1280x720_1720000.m3u8#EXT-X-STREAM-INF:BANDWIDTH=803000,RESOLUTION=852x480 16978848c8546fb7bfe6156e6da07016_852x480_803000.m3u8#EXT-X-STREAM-INF:BANDWIDTH=448000,RESOLUTION=568x320 16978848c8546fb7bfe6156e6da07016_568x320_448000.m3u8#EXT-X-ENDLIST結(jié)合網(wǎng)絡(luò)資源面板的內(nèi)容,不難得知,最上面那個(gè).m3u8文件中記錄的是三種分辨率的.m3u8文件名稱,打開具體分辨率的.m3u8文件,可以看到,記錄的就是.ts文件的播放順序
🐱?💻2. 使用腳本下載多個(gè).ts文件(未加密)
依然是以百度百科基金詞條中的秒懂百科視頻為例:
- 參考CSDN文章:Python通過m3u8文件下載合并ts視頻
- 參考CSDN文章:ts文件解密+python腳本m3u8下載
- 參考CSDN文章:m3u8文件下載及合并
2.1 找到請求url地址
加載視頻時(shí),一定先加載.m3u8文件,然后再根據(jù)這個(gè)文件去加載.ts文件,在Networks中點(diǎn)擊對應(yīng)的資源,就可以看到請求地址(request url)了,類似的,可以去找找.ts文件的。
除了.m3u8文件中記錄的.ts文件的相對路徑(一般都只有文件名),還需要找到其完整的請求地址,如下(同時(shí),可以看到.m3u8和.ts文件的url前綴都是一樣的):
2.2 代碼
確定地址之后,就可以開始進(jìn)行下載和合并,代碼如下:
import requests import osclass GetTsVideo():def __init__(self,m3u8_name,base_url,saved_path,savedVideoName):self.m3u8_name=m3u8_nameself.base_url=base_urlself.saved_path=saved_pathself.savedVideoName=savedVideoNamedef getTsList(self):"""根據(jù)給出的m3u8文件和基礎(chǔ)url地址,得到ts名稱列表"""response = requests.get(self.base_url+"/"+self.m3u8_name, stream=True, verify=False)rslist=response.text.split('\n')self.tslist=[]for i in rslist:if i.endswith(".ts"):self.tslist.append(i)return self.tslistdef downloadTsFile(self):"""根據(jù)上面得到的ts名稱列表,結(jié)合基礎(chǔ)url獲得ts文件真正的請求url,并保存到本地,每保存一個(gè),就打印一下提示信息“保存完畢”"""for i in self.tslist:tsURL=self.base_url+"/"+itry:response = requests.get(tsURL, stream=True, verify=False)except Exception as e:print("異常請求:%s" % e.args)returntsSavedPath = self.saved_path + "/"+ iwith open(tsSavedPath, "wb+") as file:for chunk in response.iter_content(chunk_size=1024):if chunk:file.write(chunk) print(f"TS文件:{tsURL}下載完畢!!") def mergeTsFile(self):"""可以通過使用命令行命令(或者命令行調(diào)用ffmpeg)也可以直接將視頻文件都粗暴寫入到一個(gè)mp4文件中(不考慮文件格式等問題)"""savedFile=os.path.join(self.saved_path,self.savedVideoName)+".mp4"with open(savedFile, 'wb+') as f:for i in self.tslist:ts_video_path = os.path.join(self.saved_path, i)f.write(open(ts_video_path, 'rb').read())print(f"寫入{i}文件結(jié)束")print("合并完成!!")調(diào)用也很簡單,以百度百科基金的秒懂百科視頻為例,在找到基礎(chǔ)前綴url地址后
m3u8file="16978848c8546fb7bfe6156e6da07016_1280x720_1720000.m3u8" # 給出最直接包含ts文件名的m3u8文件的文件名 baseurl="https://baikevideo.cdn.bcebos.com/media/mda-Ofvt2U7ehu4iIlST" # 給出當(dāng)前這個(gè)視頻的m3u8和ts前綴rul savepath="C:/1.learning/spider/download" # 給出要保存ts文件的位置 savedVideoName="rs" # 給出要保存的合并后的mp4文件的名稱obget=GetTsVideo(m3u8_name=m3u8file,base_url=baseurl,saved_path=savepath,savedVideoName=savedVideoName) tslist=obget.getTsList() obget.downloadTsFile() obget.mergeTsFile() """ 1. 從m3u8文件中獲取ts文件列表 2. 結(jié)合基礎(chǔ)url和ts文件列表下載ts文件到savepath文件夾中 3. 將savepath文件夾中的ts文件合并,寫入savedVideoName文件中,同時(shí)還是保存在savepath文件夾中 """寫個(gè)類,這樣以后調(diào)用起來就很方便了,哈哈,😊😊😊
總結(jié)
以上是生活随笔為你收集整理的使用脚本下载.ts文件并合并的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记:12864液晶模块的详细使用
- 下一篇: ZigBee协议栈点播