Python下載ts文件視頻且合并的操作方法
一、ts文件的由來(lái)
ts文件,ts即"Transport Stream"的縮寫(xiě),特點(diǎn)就是要求從視頻流的任一片段開(kāi)始都是可以獨(dú)立解碼的,非常適合網(wǎng)絡(luò)視頻播放。
打開(kāi)網(wǎng)址:https://www.kan35.com/play/210314-3-1.html,要怎么才能把這個(gè)視頻下載到電腦上呢?
按F12發(fā)現(xiàn),這些視頻被切割成無(wú)數(shù)個(gè)細(xì)小的片斷,如圖:
上圖中,用紅框圈出來(lái)的部分很重要,.ts的文件就是被切割的視頻文件。但是這些視頻文件名字全是亂的,沒(méi)有規(guī)律。它們的順序是通過(guò)index.m3u8實(shí)現(xiàn)的,上圖中有兩個(gè)index.m3u8文件,一般是尺寸更大的那個(gè)才是存放視頻播放順序的文件。可以在瀏覽器中打開(kāi)看下:
可以看出,這個(gè)文件里面確實(shí)保存了ts文件播放順序,當(dāng)然一些其它的網(wǎng)站提供的index.m3u8文件格式會(huì)有些不一樣,這些都可以后期處理。
二、下載ts文件
1.下載index.m3u8,并做相應(yīng)處理
這個(gè)index.m3u8很重要,直接右鍵“Open in new tab”就可以下載下來(lái),但是該怎么處理呢?
首先,了解下什么是m3u8:
m3u8是蘋(píng)果公司推出的視頻播放標(biāo)準(zhǔn),是m3u的一種,只是編碼格式采用的是UTF-8。
m3u8準(zhǔn)確來(lái)說(shuō)是一種索引文件,使用m3u8文件實(shí)際上是通過(guò)它來(lái)解析對(duì)應(yīng)的放在服務(wù)器上的視頻網(wǎng)絡(luò)地址,從而實(shí)現(xiàn)在線播放。使用m3u8格式文件主要因?yàn)榭梢詫?shí)現(xiàn)多碼率視頻的適配,視頻網(wǎng)站可以根據(jù)用戶的網(wǎng)絡(luò)帶寬情況,自動(dòng)為客戶端匹配一個(gè)合適的碼率文件進(jìn)行播放,從而保證視頻的流暢度。
其次,怎么解析這個(gè)文件?
最簡(jiǎn)單的方式是復(fù)制里面的內(nèi)容,然后在excel中篩選包含“https”的字符串。
當(dāng)然,我們可以用更專業(yè)的方法,在python中用“pip install m3u8”安裝這個(gè)模塊,然后就可以用代碼解析了。
import m3u8 data = m3u8.load("index0.m3u8").data data
顯示內(nèi)容大概如下:
{'media_sequence': 0,
'is_variant': False,
'is_endlist': True,
'is_i_frames_only': False,
'is_independent_segments': False,
'playlist_type': 'vod',
'playlists': [],
'segments': [
{'duration': 2.667,
'title': '',
'uri': 'https://hey06.cjkypo.com/20211214/lIC8S3qZ1/1000kb/hls/MQJ9iKoM.ts',
'cue_in': False,
'cue_out': False,
'cue_out_start': False,
'scte35': None,
'oatcls_scte35': None,
'scte35_duration': None,
'scte35_elapsedtime': None,
'asset_metadata': None,
'discontinuity': False,
'dateranges': None,
'gap_tag': None},
{'duration': 1.667,
'title': '',
'uri': 'https://hey06.cjkypo.com/20211214/lIC83SqZ1/1000kb/hls/8LeDe7Wu.ts',
'cue_in': False,
'cue_out': False,
'cue_out_start': False,
'scte35': None,
'oatcls_scte35': None,
'scte35_duration': None,
'scte35_elapsedtime': None,
'asset_metadata': None,
'discontinuity': False,
'dateranges': None,
'gap_tag': None},
........................
可以看出,顯示的內(nèi)容很多,但是實(shí)際上只有“https://”那個(gè)字符串有用。
我們現(xiàn)在要做的是先提取每一個(gè)帶“https”的字符串,然后還要提取出每個(gè)https字符串中的ts文件名。代碼如下:
order_ts = [] #將所有的帶https的url存入order_ts for i in data["segments"]: order_ts.append(i["uri"]) #返回一個(gè)dict,將文件名作為key,將url作為value def read_name_url(): name_url = {} for url in order_ts: name = url.split("/")[-1] name_url[name] = url return name_url
這個(gè)dict內(nèi)容大概如下:
按理說(shuō),這個(gè)結(jié)果已經(jīng)非常好了,但是我們還要進(jìn)一步處理下,為我們最后一步的合并ts文件作準(zhǔn)備。
list_name= read_name_url().keys() file = open("order.m3u8", 'w') for name in list_name: file.write("file 'D:\\ProgramData\\study\\mov\\tsfiles\\" + name + "'") file.write("\n")
這個(gè)order.m3u8文件的內(nèi)容大概如下:
file 'D:\ProgramData\study\mov\tsfiles\MQJ9iKoM.ts'
file 'D:\ProgramData\study\mov\tsfiles\8LeDe7Wu.ts'
file 'D:\ProgramData\study\mov\tsfiles\WS72cnXO.ts'
file 'D:\ProgramData\study\mov\tsfiles\LXld1AUz.ts'
file 'D:\ProgramData\study\mov\tsfiles\Jc2FmbSf.ts'...........
2.下載ts文件
ts文件很小,只有幾百k,所以一個(gè)完整的視頻會(huì)被分成幾千個(gè)ts文件,我們可以采用多線程的方式來(lái)下載:
import urllib from concurrent.futures import ThreadPoolExecutor def download(url,name): #下載ts文件到D:\ProgramData\study\mov\tsfiles文件夾 urllib.request.urlretrieve(url,'D://ProgramData//study//mov//tsfiles//'+name) def download_tsfile(): #記錄創(chuàng)立的線程 task_list = [] dict_name_url = read_name_url() #線程池的創(chuàng)立 pool = ThreadPoolExecutor(max_workers=50) for name in dict_name_url: # 啟動(dòng)多個(gè)線程下載文件,download是函數(shù)名,后面兩個(gè)是參數(shù)值 task_list.append(pool.submit(download, dict_name_url[name],name)) # 判斷所有下載線程是否全部結(jié)束 while (True): if len(task_list) == 0: break for i in task_list: if i.done(): task_list.remove(i) print("剩下任務(wù)數(shù):{0}".format(len(task_list))) print("所有下載任務(wù)完成!")
下載完成后,就可以在tsfiles文件夾找到這些細(xì)小的文件:
三、合并ts文件
有了前面兩步的鋪墊,現(xiàn)在要進(jìn)行最重要的一個(gè)步驟了,那就是按order.m3u8里面的順序,依次把這些ts文件合并起來(lái)。該怎么合并呢?
我們需要借助ffmpeg這個(gè)工具,這個(gè)工具非常強(qiáng)大,專門(mén)用來(lái)處理音頻、視頻切割、合并、編輯等,當(dāng)然也非常復(fù)雜。安裝這個(gè)軟件,可以點(diǎn)擊后面參考文章中的第二篇文章,這里不細(xì)說(shuō)。下面來(lái)說(shuō)說(shuō)怎么合并這些ts文件。
代碼非常簡(jiǎn)單:
import os def mixTss(name): #string前面加上‘r',是為了告訴編譯器這個(gè)string是個(gè)raw string,不要轉(zhuǎn)義 backslash '\' 。 com = r'D:\\ffmpeg\\bin\\ffmpeg.exe -f concat -safe 0 -i D:\\ProgramData\\study\\mov\\order.m3u8 -c copy D:\\ProgramData\\study\\mov\\{}.mp4'.format(name) os.system(com) mixTss("hello") print("合并完成!")
可以看出上面的代碼中,最重要的就是執(zhí)行了一命令:
D:\ffmpeg\bin\ffmpeg.exe -f concat -safe 0 -i D:\ProgramData\study\mov\order.m3u8 -c copy D:\ProgramData\\study\\mov\\hello.mp4
ffmpeg很強(qiáng)大,但是也比較復(fù)雜,我也不是很懂這個(gè),大概解釋如下。
ffmpeg使用語(yǔ)法:
命令格式: ffmpeg -i [輸入文件名] [參數(shù)選項(xiàng)] -f [格式] [輸出文件] ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
具體一點(diǎn)來(lái)說(shuō):
1. -f concat,-f 一般設(shè)置輸出文件的格式,如-f psp(輸出psp專用格式),但是如果跟concat,則表示采用concat協(xié)議,對(duì)文件進(jìn)行連接合并。
2. -safe 0,用于忽略一些文件名錯(cuò)誤,如長(zhǎng)路徑、空格、非ANSIC字符
3. -i D:\ProgramData\study\mov\order.m3u8,-i后面加輸入文件名,當(dāng)然也可以加輸入文件名組成的文件名,即order.m3u8,但是要滿足文件格式,即類似于下面這種:
file 'D:\ProgramData\study\mov\tsfiles\MQJ9iKoM.ts'
file 'D:\ProgramData\study\mov\tsfiles\8LeDe7Wu.ts'
4. -c copy D:\ProgramData\\study\\mov\\hello.mp4,-c表示輸出文件采用的編碼器,后面跟copy,表示不重新編碼。
參考文章:
ts視頻下載 準(zhǔn)備下載視頻的你確定不進(jìn)來(lái)看看嗎
到此這篇關(guān)于Python下載ts文件視頻且合并的文章就介紹到這了,更多相關(guān)Python下載ts文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+Turtle制作七夕愛(ài)心光波表白的示例代碼
七夕要來(lái)啦,小編在閑暇之余創(chuàng)作了一個(gè)基于Python+Turtle的愛(ài)心光波表白,文中有詳細(xì)的代碼示例,對(duì)我們七夕表白有很大的幫助,感興趣的小伙伴們快來(lái)來(lái)看看吧2023-08-08Python基于機(jī)器學(xué)習(xí)方法實(shí)現(xiàn)的電影推薦系統(tǒng)實(shí)例詳解
這篇文章主要介紹了Python基于機(jī)器學(xué)習(xí)方法實(shí)現(xiàn)的電影推薦系統(tǒng),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06詳解Python中用于計(jì)算指數(shù)的exp()方法
這篇文章主要介紹了詳解Python中用于計(jì)算指數(shù)的exp()方法,是Python入門(mén)中必會(huì)的基本方法,需要的朋友可以參考下2015-05-05python 統(tǒng)計(jì)一個(gè)列表當(dāng)中的每一個(gè)元素出現(xiàn)了多少次的方法
今天小編就為大家分享一篇python 統(tǒng)計(jì)一個(gè)列表當(dāng)中的每一個(gè)元素出現(xiàn)了多少次的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11python 返回一個(gè)列表中第二大的數(shù)方法
今天小編就為大家分享一篇python 返回一個(gè)列表中第二大的數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python模擬新浪微博登陸功能(新浪微博爬蟲(chóng))
使用Python編寫(xiě)一個(gè)模擬登陸的程序,利用這個(gè)原來(lái)可以設(shè)計(jì)自己的爬蟲(chóng),大家參考使用吧2013-12-12