Pythonはm 3 u 8ファイルを通じて連結tsビデオの操作をダウンロードします。


この間、あるウェブサイトのビデオをダウンロードするように要求されました。そして自分はネットで関連資料を調べました。ここでまとめをします。
1.m 3 u 8ファイル
m 3 u 8は、アップルがビデオ再生規格を打ち出したファイル検索形式で、ビデオをセグメントの小さいts形式のビデオファイルにカットして、サーバに存在します。現在、多くのニュース動画サイトはこのようなモードで動画をロードしています。
M 3 U 8ファイルとは、UTF-8符号化フォーマットのM 3 Uファイルのことです。M 3 Uファイルはインデックスの純粋なテキストファイルを記録しています。それを開くと、ソフトを再生するのではなく、そのインデックスに基づいて対応する音声ビデオファイルのネットワークアドレスを見つけてオンラインで再生します。元ビデオデータは複数のTSストリームに分割され、各TSストリームのアドレスはm 3 u 8ファイルリストに記録される。
以下はm 3 u 8ファイルのフォーマットです。

#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ファイル処理
m 3 u 8ファイルだけがあります。tsファイルをダウンロードする必要があります。
tsファイルは正常に再生できますが、多すぎて小さいです。
暗号化されていて再生できません。復号する必要があります。
ここでは前の二つのステップだけを記録します。今は研究しているのが少ないので、tsが暗号化されている状況にはまだ遭遇していません。
3.分析例
それでは、私は正式にウェブサイトを挙げて、第一財経ネット(直接クリック)で皆さんと正式に説明します。
これはこのサイトの動画です。次の図のように
在这里插入图片描述
最初のビデオをクリックしてください。これが私達が今回登って取るビデオです。
在这里插入图片描述
マウスを右クリックし、「チェック」またはF 12ボタンを押して開発者モードに入り、ウェブページのコードを確認します。
そして、Networkをクリックして、otherをクリックして、m 3 u 8とtsマークが付いている請求住所を探します。
分かりません。下の図を見てください。ちょっと重要です。ウェブサイトがカットした後にtsを通じて(通って)ビデオをロードして、規則的ではありませんて、m 3 u 8ファイルを通じて(通って)付属したのです。つまり、ウェブサイトは必ずm 3 u 8ファイルを先にロードして、m 3 u 8ファイルによってtsファイルを要求します。ですから、m 3 u 8ファイルが見つからないなら、最初のtsファイルを探して、上にひっくり返してもいいです。m 3 u 8ファイルを見つけられます。
在这里插入图片描述
このm 3 u 8ファイルをクリックしてください。右側はその要求アドレスです。
在这里插入图片描述
要求住所は以下の通りです。
https://ycalvod.yicai.com/record/live/cbn/ca233887-1443-4bdf-b762-3b4b3a217085_LD.m 3 u 8auth_key=155703722-0-6 f 09 e 9 a 1569 f 027 a 035 e 31 c 238 c 48 c&ycfrom=yicaiwww
上の住所をブラウザのアドレスボックスに入力してダウンロードしてもいいです。ソースコードを確認することによって、対応するhtmlコードを見つけられます。
これはダウンロードしたm 3 u 8ファイルです。
在这里插入图片描述
在这里插入图片描述
写真から見れば、各tsファイルは相対的な住所ですので、以下の絶対住所を探さなければなりません。
在这里插入图片描述
tsファイルの住所は以下の通りです。
https://ycalvod.yicai.com/record/live/cbn_ylod/155111614_344608.ts
上で、私達はすでにこのウェブサイトのビデオをモードの分析のとても透徹していることをロードして、下でコードを搾り始めました。
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("ts
"): ts_Url = baseUrl + content.replace("
", "").replace("..", "") ts_url_list.append(ts_Url) print(ts_Url) return ts_url_list
5.tsファイルをダウンロードする

def download_ts_video(download_path, ts_url_list):
    download_path = r"C:\Users\Administrator\Desktop\AiShu\    \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("    :%s" % e.args)
            return
        ts_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カット動画です。
在这里插入图片描述
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("    !!")
最後の結果は以下の通りです。
在这里插入图片描述
7.完全なコード
興味のある仲間は研究してみてもいいです。

import requests,os
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("ts
"): ts_Url = baseUrl + content.replace("
", "").replace("..", "") ts_url_list.append(ts_Url) print(ts_Url) return ts_url_list def download_ts_video(download_path, ts_url_list): download_path = r"C:\Users\Administrator\Desktop\AiShu\ \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(" :%s" % e.args) return ts_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:\Users\Administrator\Desktop\AiShu\ \TS " hebing_path = r"C:\Users\Administrator\Desktop\AiShu\ \ TS \ .mp4" ts_url_list = getTsUrl() download_ts_video(download_path, ts_url_list) heBingTsVideo(download_path,hebing_path)
以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。