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 件のコメント:

コメントを投稿

Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3 で、 ddc-tabnine が使えそうです、などと書いたのですが、早速やってみました。 まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、 tabnine-nvim にあるダ...