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の結果が出力されます.
確認したい方は書いておいてください.
参考
- Ffmpegで複数動画ファイルを無劣化で結合したり、無劣化で切り出したりする | Creazy!
- 最強!ffmpegを使ったtsファイルの連結・結合方法!【最新版】 - NAVER まとめ
- FFmpegでTSファイルをエンコード | EncTools
- ffmpegでMP4ファイルを結合する - Qiita
- それFFmpegで出来るよ! - Qiita
- ffmpegの使い方やコマンド一覧をまとめました。動画リサイズ・静止画変換・フレーム補間について|おちゃカメラ。
一番参考にしたサイトを忘れてしまったかも...その場合はスミマセン...
余談:なぜtsファイル?
m3u8ファイルというのがあって,これにはtsファイルのパスが順番に書かれています. つまり,m3u8ファイルからtsファイルを得ることができるわけですが,tsファイルというのは元々のファイルを分割したものに なるので,順番通りに結合させる必要があります.そこで,上記の方法にたどり着いたわけです.