最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python下載ts文件視頻且合并的操作方法

 更新時(shí)間:2023年01月10日 10:30:42   作者:格物致理,  
ts文件,ts即"Transport?Stream"的縮寫,特點(diǎn)就是要求從視頻流的任一片段開始都是可以獨(dú)立解碼的,非常適合網(wǎng)絡(luò)視頻播放,這篇文章主要介紹了Python下載ts文件視頻且合并,需要的朋友可以參考下

一、ts文件的由來

ts文件,ts即"Transport Stream"的縮寫,特點(diǎn)就是要求從視頻流的任一片段開始都是可以獨(dú)立解碼的,非常適合網(wǎng)絡(luò)視頻播放。

打開網(wǎng)址:https://www.kan35.com/play/210314-3-1.html,要怎么才能把這個視頻下載到電腦上呢?

按F12發(fā)現(xiàn),這些視頻被切割成無數(shù)個細(xì)小的片斷,如圖:

上圖中,用紅框圈出來的部分很重要,.ts的文件就是被切割的視頻文件。但是這些視頻文件名字全是亂的,沒有規(guī)律。它們的順序是通過index.m3u8實(shí)現(xiàn)的,上圖中有兩個index.m3u8文件,一般是尺寸更大的那個才是存放視頻播放順序的文件??梢栽跒g覽器中打開看下:

 可以看出,這個文件里面確實(shí)保存了ts文件播放順序,當(dāng)然一些其它的網(wǎng)站提供的index.m3u8文件格式會有些不一樣,這些都可以后期處理。

二、下載ts文件

1.下載index.m3u8,并做相應(yīng)處理

這個index.m3u8很重要,直接右鍵“Open in new tab”就可以下載下來,但是該怎么處理呢?

首先,了解下什么是m3u8:

        m3u8是蘋果公司推出的視頻播放標(biāo)準(zhǔn),是m3u的一種,只是編碼格式采用的是UTF-8。

        m3u8準(zhǔn)確來說是一種索引文件,使用m3u8文件實(shí)際上是通過它來解析對應(yīng)的放在服務(wù)器上的視頻網(wǎng)絡(luò)地址,從而實(shí)現(xiàn)在線播放。使用m3u8格式文件主要因?yàn)榭梢詫?shí)現(xiàn)多碼率視頻的適配,視頻網(wǎng)站可以根據(jù)用戶的網(wǎng)絡(luò)帶寬情況,自動為客戶端匹配一個合適的碼率文件進(jìn)行播放,從而保證視頻的流暢度。

其次,怎么解析這個文件?

最簡單的方式是復(fù)制里面的內(nèi)容,然后在excel中篩選包含“https”的字符串。

當(dāng)然,我們可以用更專業(yè)的方法,在python中用“pip install m3u8”安裝這個模塊,然后就可以用代碼解析了。

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://”那個字符串有用。

我們現(xiàn)在要做的是先提取每一個帶“https”的字符串,然后還要提取出每個https字符串中的ts文件名。代碼如下:

order_ts = []
#將所有的帶https的url存入order_ts
for i in data["segments"]:
    order_ts.append(i["uri"])
 
#返回一個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

這個dict內(nèi)容大概如下:

按理說,這個結(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")

這個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,所以一個完整的視頻會被分成幾千個ts文件,我們可以采用多線程的方式來下載:

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:
        # 啟動多個線程下載文件,download是函數(shù)名,后面兩個是參數(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)行最重要的一個步驟了,那就是按order.m3u8里面的順序,依次把這些ts文件合并起來。該怎么合并呢?

我們需要借助ffmpeg這個工具,這個工具非常強(qiáng)大,專門用來處理音頻、視頻切割、合并、編輯等,當(dāng)然也非常復(fù)雜。安裝這個軟件,可以點(diǎn)擊后面參考文章中的第二篇文章,這里不細(xì)說。下面來說說怎么合并這些ts文件。

代碼非常簡單:

import os
 
def mixTss(name):
    #string前面加上‘r',是為了告訴編譯器這個string是個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ù)雜,我也不是很懂這個,大概解釋如下。

ffmpeg使用語法:

命令格式: ffmpeg -i [輸入文件名] [參數(shù)選項(xiàng)] -f [格式] [輸出文件] ffmpeg [[options][`-i' input_file]]... {[options] output_file}... 

具體一點(diǎn)來說:

1. -f concat,-f 一般設(shè)置輸出文件的格式,如-f psp(輸出psp專用格式),但是如果跟concat,則表示采用concat協(xié)議,對文件進(jìn)行連接合并。

2. -safe 0,用于忽略一些文件名錯誤,如長路徑、空格、非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)來看看嗎

ffmpeg安裝教程

到此這篇關(guān)于Python下載ts文件視頻且合并的文章就介紹到這了,更多相關(guān)Python下載ts文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python環(huán)境安裝配置實(shí)用的提示

    Python環(huán)境安裝配置實(shí)用的提示

    想要使用Python語言編寫程序,我們必須下載Python安裝包并配置Python環(huán)境,這篇文章主要給大家介紹了關(guān)于Python環(huán)境安裝配置實(shí)用提示的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Python tkinter 樹形列表控件(Treeview)的使用方法

    Python tkinter 樹形列表控件(Treeview)的使用方法

    這篇文章主要介紹了Python tkinter 樹形列表控件(Treeview)的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python中max函數(shù)用于二維列表的實(shí)例

    Python中max函數(shù)用于二維列表的實(shí)例

    下面小編就為大家分享一篇Python中max函數(shù)用于二維列表的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 圖解Python中的淺拷貝和深拷貝

    圖解Python中的淺拷貝和深拷貝

    這篇文章主要介紹了圖解Python中的淺拷貝和深拷貝,深拷貝,拷貝的程度深,自己新開辟了一塊內(nèi)存,將被拷貝內(nèi)容全部拷貝過來了,淺拷貝,拷貝的程度淺,只拷貝原數(shù)據(jù)的首地址,然后通過原數(shù)據(jù)的首地址,去獲取內(nèi)容,需要的朋友可以參考下
    2023-11-11
  • python中字典增加和刪除使用方法

    python中字典增加和刪除使用方法

    這篇文章主要介紹了python中字典增加和刪除使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • django-simple-captcha多種驗(yàn)證碼的實(shí)現(xiàn)方法

    django-simple-captcha多種驗(yàn)證碼的實(shí)現(xiàn)方法

    本文介紹了如何在Django項(xiàng)目中配置和使用不同類型的驗(yàn)證碼,包括數(shù)字驗(yàn)證碼、字母驗(yàn)證碼和算術(shù)驗(yàn)證碼,每種驗(yàn)證碼結(jié)合實(shí)例代碼給大家介紹得非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Python中使用logging模塊代替print(logging簡明指南)

    Python中使用logging模塊代替print(logging簡明指南)

    這篇文章主要介紹了Python中使用logging模塊代替print的好處說明,主旨是logging模塊簡明指南,logging模塊的使用方法介紹,需要的朋友可以參考下
    2014-07-07
  • 關(guān)于Python排序問題(冒泡/選擇/插入)

    關(guān)于Python排序問題(冒泡/選擇/插入)

    這篇文章主要介紹了關(guān)于Python排序問題(冒泡/選擇/插入),學(xué)過C語言肯定接觸過排序問題,我們最常用的也就是冒泡排序、選擇排序、插入排序,需要的朋友可以參考下
    2023-04-04
  • 快速排序的算法思想及Python版快速排序的實(shí)現(xiàn)示例

    快速排序的算法思想及Python版快速排序的實(shí)現(xiàn)示例

    快速排序算法來源于分治法的思想策略,這里我們將來為大家簡單解析一下快速排序的算法思想及Python版快速排序的實(shí)現(xiàn)示例:
    2016-07-07
  • Python入門教程(七)Python數(shù)字類型

    Python入門教程(七)Python數(shù)字類型

    這篇文章主要介紹了Python入門教程(七)Python數(shù)字類型,Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04

最新評論

阿克苏市| 蓬溪县| 子洲县| 晋中市| 瓮安县| 辉南县| 利津县| 林周县| 扶绥县| 平阴县| 巴楚县| 固原市| 阿坝县| 冕宁县| 桃江县| 舟山市| 石景山区| 齐河县| 天长市| 蒙城县| 始兴县| 望江县| 巫山县| 皋兰县| 邵武市| 罗城| 儋州市| 马尔康县| 宁津县| 沧州市| 抚顺市| 全南县| 基隆市| 德保县| 玉溪市| 同德县| 鲜城| 沁水县| 玉屏| 双辽市| 六枝特区|