芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

Pythonでtsファイルの結合

Pythonでのやり方は私の知る限り二つ. とはいえ,前者に関しては雑な結合だと思うので,オススメはしません. 後者は”ffmpeg.exe”を使う方法で,どっかからダウンロードしてくる必要があります. あと,私はPCにインストールとかパスを追加するとか,そういったことはしないで使ってます.”ffmpeg.exe”をPythonスクリプトと同じディレクトリに置いておけば,そういった作業はしなくて済みます.USBとかに入れて使いたい場合はこれが良いと思います.


例として,

  • test.py
  • tset1.ts
  • test2.ts
  • test3.ts
  • ffmpeg.exe

というディレクトリで行うことにします.”test.py”が以下で示すことが書かれているスクリプトファイルで,tsファイルを一つに結合します.

バイナリモードで読み書きする方法

# 初期化
with open("output.mp4",mode='wb') as f:
    pass
# 書き込み
with open("output.mp4",mode='ab') as f:
    for i in ['test1.ts','test2.ts','test3.ts']:
        with open(i,mode='rb') as g:
            f.write(g)

こんな感じ.一応これで再生は出来ます.しかし,つながりが悪いというか,雑な感じに. 何か足りないのかも. とはいえ,”ffmpeg.exe”を用意しなくていいというメリットがあります. ポイントはバイナリモードでファイルを開くことですね~

ffmpeg.exeを使う方法:subprocessモジュールを使う

ffmpeg.zeranoe.com
から”ffmpeg.exe”を取得します.ダウンロードしたzipファイルの中に入ってるはず. なかったら,”ffmpeg.exe”を使ってそうなフォルダをGitHubとかでダウンロードすればいいと思います. 準備ができたら,以下のスクリプト(test.py)を実行しましょう.

import subprocess

# Listファイルを作成するために,ファイル名が入ったリスト型変数を作成する
file_list = [ tset1.ts, test2.ts, test3.ts]

# ffmpegに渡すListファイルを作成
for key in file_list:
    with open("DLlist.txt","a") as f:
        f.write("file '{}'\n".format(key))

# ffmpegのコマンドを実行して結合
cmd = "ffmpeg -safe 0 -f concat -i DLlist.txt -c:v copy -c:a copy -map 0:v -map 0:a {}_ffmpeg.mp4".format(file_title)
proc = subprocess.Popen(
    cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
    )
stdout, stderr = proc.communicate()

最初に,結合するファイルをリストアップしたテキストファイルを作る必要があるので,for文を使って作成します. ここで,forに使用する”file_list”には,ファイル名がリストで入っていることが前提です. そして,for文を回せば,ffmpegの形式に合ったファイル名をリストアップしたテキストができます. また,ファイル名は何でもよいのですが,参考にしたサイト様のそのまま使わせていただくとして,”DLlist.txt”としましょう. ファイル名を変える場合は”cmd”に代入する文字列の該当する部分を変更しておいてください.
次に,例のごとく,subprocessモジュールを使ってコマンド実行したら,mp4ファイルが得られます. ”stdout”をprintメソッドで表示すると,コマンド入力で表示されるffmpegの結果が出力されます. 確認したい方は書いておいてください.

参考

一番参考にしたサイトを忘れてしまったかも...その場合はスミマセン...

余談:なぜtsファイル?

m3u8ファイルというのがあって,これにはtsファイルのパスが順番に書かれています. つまり,m3u8ファイルからtsファイルを得ることができるわけですが,tsファイルというのは元々のファイルを分割したものに なるので,順番通りに結合させる必要があります.そこで,上記の方法にたどり着いたわけです.