keyframe形式をaviutlで扱えるように変換する。

ビデオファイルの編集にはTMPGEnc MPEG Smart Renderer 5を使っていますが、これの出力するkeyframe形式は同じPEGASYSのTMPGEnc Video Mastering Worksなどでしか使えません。
aviutl(正確にはx264guiExプラグインなどから呼び出される muxer.exe / remuxer.exe)で扱うには、別の形式に変換する必要があります。

ということで、いつもどおりPythonでお助けスクリプトです。あらかじめ dateutil モジュールをインストールしておく必要があります。

#!python3
# -*- coding: utf-8 -*-
# vim:fenc=utf-8 ff=unix ft=python ts=4 sw=4 sts=4 si et fdm fdl=99:
# vim:cinw=if,elif,else,for,while,try,except,finally,def,class:
#
# makechap.py:
# カレントディレクトリからすべての.keyframeファイルを検索し
# 順次aviutl(muxer.exe, remuxer.exe)が取り込める形式の
# チャプターマークに変換する
#
# TMPGEnc MPEG Smart Rendereの.keyframe 出力形式
# [chap1]
# [chap2]
# ただし[chapx]はフレーム番号
# muxer / remuxer のチャプター形式
# CHAPTER01=00:03:00.000
# CHAPTER01NAME=タイトル1
# CHAPTER02=00:06:30.000
# 0CHAPTER02NAME=タイトル2

import sys
from glob import glob
from os.path import join, splitext
from os import close
from dateutil.relativedelta import *

# import pdb; pdb.set_trace()

if sys.version_info[0] != 3:
    print('This script requires Python 3')
    exit()

path = '.'
debug = 0
files = []
i = 0

files = glob(join(path, '*.keyframe'))
if debug:
    print('files:', files)

for kffile in files:
    f = open(kffile, 'r')
    outfile = open(splitext(kffile)[0]+'.chapter.txt', 'w')
    frames = f.readlines()
    base = splitext(kffile)[0]
    for frame in frames:
        i = i + 1
        rd = relativedelta(seconds=round(int(frame)*0.0333667))
        time = "{0.hours:02}:{0.minutes:02}:{0.seconds:02}.000".format(rd)
        if debug:
            print(f'CHAPTER{i:02}={time}')
            print(f'CHAPTER{i:02}NAME={i:02}\n')
        outfile.write(f'CHAPTER{i:02}={time}\n')
        outfile.write(f'CHAPTER{i:02}NAME={i:02}\n')
    i = 0
    f.close()
    outfile.close()

こうして作ったchapter.txtをチャプターとしてMP4ファイルに埋め込むには、x264guiExなどの設定パネルでチャプターを設定しておけばやってくれます。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...