Python TSビデオをMP4に変換

まずはTsフォーマットについて説明します

TS(TransportStream、トランスポートストリーム)はカプセル化されたフォーマットであり、正式名称はMPEG2-TSです。MPEG2-TS は、オーディオとビデオ、プログラム、およびシステム情報プロトコル データを送信および保存する標準データ コンテナ形式で、主に DVB、ATSC、IPTV などのデジタル放送システムで使用されます。トランスポート ストリームは、もともとブロードキャスト用に設計されました。その後、このパケットは標準の 188 バイトのパケットに 4 バイトのタイムコード (TC) を追加して 192 バイトのパケットとなり、デジタル カメラ、レコーダー、プレーヤーに適したものになりました。

現場を扱う

特定の魚や一部の Web サイトの動画をクロールすると、末尾が ts 形式の動画ファイルが大量に取得されます。このとき、それらを Ts 動画ファイルまたは MP4 形式の動画に合成する必要があります。自分のコンピュータでは Ts 拡張子形式を再生できませんそこで、Ts サフィックス形式のビデオを MP4 に変換しました。

OS 組み込みモジュールを直接使用するコードは次のとおりです。

import os


def merge_ts_video(ts_path, ts_path_):
    all_ts = os.listdir(ts_path)
    # 最好是对all_ts 进行排序处理一下
    # 我这里获取到后直接对ts视频文件进行了排序处理,所以没有加排序操作
    for file in all_ts:
        with open(ts_path + file, 'rb') as f1:  # 读取视频以二进制进行处理
            with open(ts_path_ + "VideoName.mp4", 'ab') as f2:  # 存储到指定位置,VideoName为变量值
                f2.write(f1.read())
        os.remove(os.path.join(ts_path, file))  # 将每次处理后的ts视频文件进行删除


merge_ts_video(r"./VideoPreliminaryStorage/", r"./VideoFinalStorage/")
# 函数调用:merge_ts_video
# 参数值:
#       参数1 存放 ts 的路径 VideoPreliminaryStorage
#       参数2 存放 mp4 的路径 VideoFinalStorage

上記の内容は Ts 形式の動画を MP4 形式に変換できますが、一部のプレーヤーでは認識できません。例:
変換後の音声ファイルは MP4 ですが、ビデオの形式がメディア ファイル (.mp4) (. mp4)
なので、まだffmpegを使用しています

"""
mp4 -->  ts  : ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ts  -->  mp4 : ffmpeg -i 2.ts -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
"""

まず、すべての Ts 形式のビデオを 1 つの Ts 形式のファイルに結合し、結合が完了したら mp4 に変換します。

def merge_ts_video(ts_path, ts_path_, ffmpeg_path, video_name):
    all_ts = os.listdir(ts_path)
    all_ts_mp4 = [ts_path + file for file in all_ts]
    for all_ in all_ts_mp4:
        with open(all_, 'rb') as f1:
            with open(ts_path + f"{
      
      video_name}.ts", 'ab') as f2:
                f2.write(f1.read())
        # 删除多余ts文件
        os.remove(os.path.join(all_))

    # Ts视频转MP4
    new_ts = os.listdir(ts_path)
    cmd = ffmpeg_path + " -i " + f"{
      
      ts_path + new_ts[0]}" + " -acodec copy -vcodec copy -absf aac_adtstoasc " + ts_path_ + "\\" + f"{
      
      video_name}.mp4"
    os.popen(cmd)

    # 删除多余ts文件,清空文件夹(VideoPreliminaryStorage)
    os.remove(video_name + '.ts')
    for i in range(0, len(all_ts_mp4)):
        ts_name = os.path.basename(all_ts_mp4[i])  # 去掉文件名前面的文件路径
        mp4_name = os.path.splitext(ts_name)[0]  # 去掉文件名的后缀
        """
        mp4 -->  ts  : ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
        ts  -->  mp4 : ffmpeg -i 2.ts -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
        """
        # # 拼接好运行ffmpeg的命令行语句
        cmd = ffmpeg_path + " -i " + all_ts_mp4[
            i] + " -acodec copy -vcodec copy -absf aac_adtstoasc " + ts_path_ + "\\" + mp4_name + ".mp4"
        os.popen(cmd)
# 函数调用:merge_ts_video
# 参数值:
#       参数1 存放 ts 的路径 ts_path
#       参数2 存放 mp4 的路径 ts_path_
#       参数3 ffpmpeg 的路径 ffmpeg_path
#       参数4 视频存储 的名称 video_name

おすすめ

転載: blog.csdn.net/weixin_43603846/article/details/128903008