国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python通過(guò)m3u8文件下載合并ts視頻的操作

瀏覽:3日期:2022-06-22 11:57:34

前段時(shí)間,接到一個(gè)需求,要求下載某一個(gè)網(wǎng)站的視頻,然后自己從網(wǎng)上查閱了相關(guān)的資料,在這里做一個(gè)總結(jié)。

1. m3u8文件

m3u8是蘋(píng)果公司推出一種視頻播放標(biāo)準(zhǔn),是一種文件檢索格式,將視頻切割成一小段一小段的ts格式的視頻文件,然后存在服務(wù)器中(現(xiàn)在為了減少I(mǎi)/o訪(fǎng)問(wèn)次數(shù),一般存在服務(wù)器的內(nèi)存中),通過(guò)m3u8解析出來(lái)路徑,然后去請(qǐng)求,是現(xiàn)在比較流行的一種加載方式。目前,很多新聞視頻網(wǎng)站都是采用這種模式去加載視頻。

M3U8文件是指UTF-8編碼格式的M3U文件。M3U文件是記錄了一個(gè)索引純文本文件,打開(kāi)它時(shí)播放軟件并不是播放它,而是根據(jù)它的索引找到對(duì)應(yīng)的音視頻文件的網(wǎng)絡(luò)地址進(jìn)行在線(xiàn)播放。原視頻數(shù)據(jù)分割為很多個(gè)TS流,每個(gè)TS流的地址記錄在m3u8文件列表中。

下面就是m3u8文件的格式。

#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:0#EXT-X-ALLOW-CACHE:YES#EXT-X-TARGETDURATION:15#EXTINF:6.916667,out000.ts#EXTINF:10.416667,out001.ts#EXTINF:10.416667,out002.ts#EXTINF:1.375000,out003.ts#EXTINF:1.541667,out004.ts#EXTINF:7.666667,out005.ts#EXTINF:10.416667,2. ts文件處理

只有m3u8文件,需要下載ts文件

ts文件能正常播放,但太多而小,需要合并 有ts文件

但因?yàn)楸患用軣o(wú)法播放,需要解碼

在這里我只記錄下前兩個(gè)步驟,因?yàn)?,我目前研究的比較少,還沒(méi)有遇到ts被加密的情況。

3. 分析舉例

那么下面,我就正式舉一個(gè)網(wǎng)站,第一財(cái)經(jīng)網(wǎng)(直接點(diǎn)擊)跟大家正式的講解下。

這是該網(wǎng)站的視頻。如下圖:

Python通過(guò)m3u8文件下載合并ts視頻的操作

點(diǎn)擊第一個(gè)視頻,這就是我們這次要爬取的視頻。

Python通過(guò)m3u8文件下載合并ts視頻的操作

然后鼠標(biāo)右鍵點(diǎn)擊,選擇'檢查' 或者按F12鍵,進(jìn)入開(kāi)發(fā)者模式,查看網(wǎng)頁(yè)代碼。

然后,點(diǎn)擊Network ,再點(diǎn)擊other,尋找請(qǐng)求地址中帶有m3u8和ts標(biāo)記的請(qǐng)求地址。

不懂,請(qǐng)看下圖。有一點(diǎn),很重要。網(wǎng)站通過(guò)切割后ts加載視頻,并不是沒(méi)有規(guī)律的,而是通過(guò)m3u8文件附帶的。也就說(shuō),網(wǎng)站一定是先加載m3u8文件,然后根據(jù)m3u8文件,去請(qǐng)求ts文件。所以,如果你找不到m3u8文件的話(huà),你可以先找第一個(gè)ts文件,然后往上面翻,一定能找到m3u8文件。

Python通過(guò)m3u8文件下載合并ts視頻的操作

再點(diǎn)擊這個(gè)m3u8文件,右側(cè)對(duì)應(yīng)的就是它的請(qǐng)求地址。

Python通過(guò)m3u8文件下載合并ts視頻的操作

請(qǐng)求地址如下:

https://ycalvod.yicai.com/record/live/cbn/ca233887-1443-4bdf-b762-3b4b3a217085_LD.m3u8?auth_key=1575703722-0-0-6f09e9a156491f027a035e31c238c48c&ycfrom=yicaiwww

你可以把上面那個(gè)地址,輸入瀏覽器地址框內(nèi),下載下來(lái)。也可以通過(guò)查看源碼,找到該功能的對(duì)應(yīng)的html代碼。

這是下載下來(lái)的m3u8文件。

Python通過(guò)m3u8文件下載合并ts視頻的操作

Python通過(guò)m3u8文件下載合并ts視頻的操作

從圖片可以看出來(lái),每一個(gè)ts文件都是相對(duì)的地址,所以下面我們就需要找到絕對(duì)地址。

Python通過(guò)m3u8文件下載合并ts視頻的操作

ts文件地址如下:

https://ycalvod.yicai.com/record/live/cbn_yld/1575111614_3446078.ts

上面,我們已經(jīng)把這個(gè)網(wǎng)站的視頻加載模式分析的很透徹,下面就開(kāi)始擼代碼了。

4. 獲取ts文件

def getTsUrl(): ts_url_list = [] baseUrl = 'https://ycalvod.yicai.com/record/live' with open('ca233887-1443-4bdf-b762-3b4b3a217085_LD.m3u8', 'r', encoding='utf-8') as f:m3u8Contents = f.readlines()for content in m3u8Contents: if content.endswith('tsn'):ts_Url = baseUrl + content.replace('n', '').replace('..', '')ts_url_list.append(ts_Url)print(ts_Url) return ts_url_list5. 下載ts文件

def download_ts_video(download_path, ts_url_list): download_path = r'C:UsersAdministratorDesktopAiShu下載視頻TS視頻' for i in range(len(ts_url_list)):ts_url = ts_url_list[i]try: response = requests.get(ts_url, stream=True, verify=False)except Exception as e: print('異常請(qǐng)求:%s' % e.args) returnts_path = download_path + '{}.ts'.format(i)with open(ts_path, 'wb+') as file: for chunk in response.iter_content(chunk_size=1024):if chunk: file.write(chunk) print('TS文件下載完畢!!')

這就是我本地下載好的ts切割視頻

Python通過(guò)m3u8文件下載合并ts視頻的操作

6. 合并TS視頻

def heBingTsVideo(download_path,hebing_path): all_ts = os.listdir(download_path) with open(hebing_path, ’wb+’) as f:for i in range(len(all_ts)): ts_video_path = os.path.join(download_path, all_ts[i]) f.write(open(ts_video_path, ’rb’).read()) print('合并完成??!')

最后的結(jié)果如下:

Python通過(guò)m3u8文件下載合并ts視頻的操作

7. 完整的代碼

有興趣的小伙伴,可以研究下。

import requests,osdef getTsUrl(): ts_url_list = [] baseUrl = 'https://ycalvod.yicai.com/record/live' with open('ca233887-1443-4bdf-b762-3b4b3a217085_LD.m3u8', 'r', encoding='utf-8') as f:m3u8Contents = f.readlines()for content in m3u8Contents: if content.endswith('tsn'):ts_Url = baseUrl + content.replace('n', '').replace('..', '')ts_url_list.append(ts_Url)print(ts_Url) return ts_url_listdef download_ts_video(download_path, ts_url_list): download_path = r'C:UsersAdministratorDesktopAiShu下載視頻TS視頻' for i in range(len(ts_url_list)):ts_url = ts_url_list[i]try: response = requests.get(ts_url, stream=True, verify=False)except Exception as e: print('異常請(qǐng)求:%s' % e.args) returnts_path = download_path + '{}.ts'.format(i)with open(ts_path, 'wb+') as file: for chunk in response.iter_content(chunk_size=1024):if chunk: file.write(chunk) print('TS文件下載完畢?。?)def heBingTsVideo(download_path,hebing_path): all_ts = os.listdir(download_path) with open(hebing_path, ’wb+’) as f:for i in range(len(all_ts)): ts_video_path = os.path.join(download_path, all_ts[i]) f.write(open(ts_video_path, ’rb’).read()) print('合并完成!!')if __name__ == ’__main__’: download_path = r'C:UsersAdministratorDesktopAiShu下載視頻TS視頻' hebing_path = r'C:UsersAdministratorDesktopAiShu下載視頻合并TS視頻第一財(cái)經(jīng).mp4' ts_url_list = getTsUrl() download_ts_video(download_path, ts_url_list) heBingTsVideo(download_path,hebing_path)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲精品区在线播放一区二区 | 国产成人久久精品 | 国产精品国产三级国产an不卡 | 国产91在线 | 亚洲 | 成熟女人免费一级毛片 | 亚洲精品高清国产一线久久97 | 国产成人综合洲欧美在线 | 亚洲精品第一国产综合野 | 欧美一级片免费观看 | 国产欧美二区三区 | 久9青青cao精品视频在线 | 欧美成人手机视频 | 免费在线一级片 | 国产夫妇精品自在线 | 亚洲综合免费视频 | 亚洲人成毛片线播放 | 亚洲 [12p]| 欧美日韩精品国产一区二区 | 99视频精品在线 | 国产美女操 | 一个人看的www日本高清视频 | 欧美性视频一区二区三区 | 欧美国产在线一区 | 波多野结衣中文一区二区免费 | 日韩一级视频在线观看播放 | 国内9l视频自拍 | 狠狠狠狠狠 | 亚洲精品一区二三区在线观看 | 美国做受三级的视频播放 | 欧美资源在线观看 | 久久免视频 | 在线亚洲播放 | 涩里番资源网站在线观看 | 国产成人在线影院 | 美女张开大腿让男人捅 | 欧美国产日韩在线播放 | 日本一级特黄aa毛片免费观看 | 成人合成mv福利视频网站 | www.亚洲在线 | 亚洲精品国产一区二区在线 | 越南高清幻女bbwxxxx |