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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python3 根据m3u8下载视频,批量下载ts文件并且合并

發布時間:2024/3/13 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python3 根据m3u8下载视频,批量下载ts文件并且合并 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python3 根據m3u8下載視頻,批量下載ts文件并且合并

m3u8是蘋果公司推出一種視頻播放標準,是一種文件檢索格式,將視頻切割成一小段一小段的ts格式的視頻文件,然后存在服務器中(現在為了減少I/o訪問次數,一般存在服務器的內存中),通過m3u8解析出來路徑,然后去請求,是現在比較流行的一種加載方式,諸如騰訊視頻之類大多都是切割成ts流進行加載。

示例代碼:

import os, shutil import urllib.request, urllib.error, requests# 打開并讀取網頁內容 def getUrlData(url):try:urlData = urllib.request.urlopen(url, timeout=20) # .read().decode('utf-8', 'ignore')return urlDataexcept Exception as err:print(f'err getUrlData({url})\n', err)return -1# 下載文件-urllib.request def getDown_urllib(url, file_path):try:urllib.request.urlretrieve(url, filename=file_path)return Trueexcept urllib.error.URLError as e:# hasttr(e, 'code'),判斷e 是否有.code屬性,因為不確定是不是HTTPError錯誤,URLError包含HTTPError,但是HTTPError以外的錯誤是不返回錯誤碼(狀態碼)的if hasattr(e, 'code'):print(e.code) # 打印服務器返回的錯誤碼(狀態碼),如403,404,501之類的elif hasattr(e, 'reason'):print(e.reason) # 打印錯誤原因def getVideo_urllib(url_m3u8, path, videoName):print('begin run ~~\n')# urlData = getUrlData(url_m3u8).readlines()urlData = getUrlData(url_m3u8)num = 0tempName_video = os.path.join(path, f'{videoName}.ts') # f'{}' 相當于'{}'.format() 或 '%s'%videoName# print(urlData)for line in urlData:# 解碼,由于是直接使用了所抓取的鏈接內容,所以需要按行解碼,如果提前解碼則不能使用直接進行for循環,會報錯# 改用上面的readlines()或readline()也可以,但更繁瑣些,同樣需要按行解碼,效率更低url_ts = line.decode('utf-8')tempName_ts = os.path.join(path, f'{num}.ts') # f'{}' 相當于'{}'.format()if not '.ts' in url_ts:continueelse:if not url_ts.startswith('http'): # 判斷字符串是否以'http'開頭,如果不是則說明url鏈接不完整,需要拼接# 拼接ts流視頻的urlurl_ts = url_m3u8.replace(url_m3u8.split('/')[-1], url_ts)print(url_ts)getDown_urllib(url_ts, tempName_ts) # 下載視頻流if num == 0:# 重命名,已存在則自動覆蓋 shutil.move(tempName_ts, tempName_video)num += 1continuecmd = f'copy /b {tempName_video}+{tempName_ts} {tempName_video}'res = os.system(cmd)if res == 0:os.system(f'del {tempName_ts}')if num == 20: # 限制下載的ts流個數,這個視頻挺長有四百多個.ts文件,所以限制一下breaknum += 1continueprint(f'Wrong, copy {num}.ts-->{videoName}.ts failure')return Falseos.system(f'del {path}/*.ts') # 調用windows命令行(即cmd)工具,運行命令filename = os.path.join(path, f'{videoName}.mp4')shutil.move(tempName_video, filename)print(f'{videoName}.mp4 finish down!')if __name__ == '__main__':url_m3u8 = 'http://wscdn.alhls.xiaoka.tv/201886/2f5/75a/HoHdTc1LjUaBjZbJ/index.m3u8'path = r'E:\pydevworkspaces\project\product\epgw\videos'videoName = url_m3u8.split('/')[-2]getVideo_urllib(url_m3u8, path, videoName)

注:(1)僅限windows下使用,如果要在Linux上使用需要修改合并命令;

? ? ? ? (2)修改文件名時,特意選擇shutil模塊(可以看作os的高級版)的move方法,雖然move主要是用來移動文件的,重命名算是附帶的,不過強制覆蓋的特點在這里很有用,避免中斷后重新下載時重命名產生異常。

轉載于:https://www.cnblogs.com/lizm166/p/10262394.html

總結

以上是生活随笔為你收集整理的Python3 根据m3u8下载视频,批量下载ts文件并且合并的全部內容,希望文章能夠幫你解決所遇到的問題。

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