日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用脚本下载.ts文件并合并

發布時間:2024/8/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用脚本下载.ts文件并合并 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 👑1.什么是.ts文件/.m3u8文件
  • 🐱?💻2. 使用腳本下載多個.ts文件(未加密)
    • 2.1 找到請求url地址
    • 2.2 代碼

👑1.什么是.ts文件/.m3u8文件

參考:

  • 【技術科普】HLS視頻流內m3u8文件和TS切片是什么關系?
  • 視頻文件M3U8和TS格式切片,討論一下?
  • Python通過m3u8文件下載合并ts視頻的操作

大概可以得出以下不太準確的一個描述:

m3u8是蘋果公司推出一種視頻播放標準,是一種文件檢索格式,將視頻切割成一小段一小段的ts格式的視頻文件,然后存在服務器中(現在為了減少I/o訪問次數,一般存在服務器的內存中),通過m3u8解析出來路徑,然后去請求,是現在比較流行的一種加載方式。目前,很多新聞視頻網站都是采用這種模式去加載視頻。

M3U8文件是指UTF-8編碼格式的M3U文件。M3U文件是記錄了一個索引純文本文件,打開它時播放軟件并不是播放它,而是根據它的索引找到對應的音視頻文件的網絡地址進行在線播放。原視頻數據分割為很多個TS流,每個TS流的地址記錄在m3u8文件列表中。

.ts文件是切片后的視頻文件,.m3u8文件實質是一個播放列表(playlist)

以百度百科-基金這一詞條中秒懂百科的視頻為例,其.m3u8文件使用文本文件打開后,內容如下:

#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

結合網絡資源面板的內容,不難得知,最上面那個.m3u8文件中記錄的是三種分辨率的.m3u8文件名稱,打開具體分辨率的.m3u8文件,可以看到,記錄的就是.ts文件的播放順序

🐱?💻2. 使用腳本下載多個.ts文件(未加密)

依然是以百度百科基金詞條中的秒懂百科視頻為例:

  • 參考CSDN文章:Python通過m3u8文件下載合并ts視頻
  • 參考CSDN文章:ts文件解密+python腳本m3u8下載
  • 參考CSDN文章:m3u8文件下載及合并

2.1 找到請求url地址

加載視頻時,一定先加載.m3u8文件,然后再根據這個文件去加載.ts文件,在Networks中點擊對應的資源,就可以看到請求地址(request url)了,類似的,可以去找找.ts文件的。

除了.m3u8文件中記錄的.ts文件的相對路徑(一般都只有文件名),還需要找到其完整的請求地址,如下(同時,可以看到.m3u8和.ts文件的url前綴都是一樣的):

2.2 代碼

確定地址之后,就可以開始進行下載和合并,代碼如下:

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):"""根據給出的m3u8文件和基礎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):"""根據上面得到的ts名稱列表,結合基礎url獲得ts文件真正的請求url,并保存到本地,每保存一個,就打印一下提示信息“保存完畢”"""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):"""可以通過使用命令行命令(或者命令行調用ffmpeg)也可以直接將視頻文件都粗暴寫入到一個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}文件結束")print("合并完成!!")

調用也很簡單,以百度百科基金的秒懂百科視頻為例,在找到基礎前綴url地址后

m3u8file="16978848c8546fb7bfe6156e6da07016_1280x720_1720000.m3u8" # 給出最直接包含ts文件名的m3u8文件的文件名 baseurl="https://baikevideo.cdn.bcebos.com/media/mda-Ofvt2U7ehu4iIlST" # 給出當前這個視頻的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. 結合基礎url和ts文件列表下載ts文件到savepath文件夾中 3. 將savepath文件夾中的ts文件合并,寫入savedVideoName文件中,同時還是保存在savepath文件夾中 """

寫個類,這樣以后調用起來就很方便了,哈哈,😊😊😊

總結

以上是生活随笔為你收集整理的使用脚本下载.ts文件并合并的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。