IronPython でビデオ編集

Windows Media Encoder の COM コンポーネントを使って IronPython でビデオファイルの編集を実施する。

複数の wmv ファイルからビデオの一部をそれぞれ取り出し連結するような編集処理を実施する場合の APIの使い方は以下の通り。

  1. wmv ファイルからビデオの一部を取り出す
    • IWMEncSource の MarkIn と MarkOut で取り出す範囲を指定
  2. 複数の wmv ファイルから取り出したビデオの一部分を連結する
    • IWMEncSourceGroupCollection の Activate プロパティに先頭になる IWEncSourceGroup2 を設定
    • IWMEncSourceGroup2 の SetAutoRollover メソッドの第一引数に -1、第二引数に次に連結するソースグループ名を設定
#test1.wmv の 0〜40秒目と test2.wmv の 20〜30秒目を連結して test_dest.wmv ファイルを生成するスクリプト

from System import *
from System.IO import *
from System.Threading import *

import clr
clr.AddReference("WMEncoderLib")
from WMEncoderLib import *

app = WMEncoderAppClass()
enc = app.Encoder
sgcol = enc.SourceGroupCollection

profile = WMEncProfile2Class()
profile.LoadFromFile(FileInfo("test.prx").FullName)

sg1 = sgcol.Add("sg1")
sg1.Profile = profile

#test1.wmv の先頭から 40秒目までトリミング
vsrc1 = sg1.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO)
vsrc1.SetInput(FileInfo("test1.wmv").FullName, "", "")
vsrc1.MarkIn = 0
vsrc1.MarkOut = 40000

#sg1 の後に sg2 を連結する
sg1.SetAutoRollover(-1, "sg2")

sg2 = sgcol.Add("sg2")
sg2.Profile = profile

#test2.wmv の 20秒目から 30秒目までをトリミング
vsrc2 = sg2.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO)
vsrc2.SetInput(FileInfo("test2.wmv").FullName, "", "")
vsrc2.MarkIn = 20000
vsrc2.MarkOut = 30000

#sg1 を先頭のソースグループとして設定
sgcol.Active = sg1

enc.File.LocalFileName = FileInfo("test_dest.wmv").FullName

enc.PrepareToEncode(True)
enc.Start()

print "Encode Start"

#エンコード処理が終了するまでループして待つ
while enc.RunState != WMENC_ENCODER_STATE.WMENC_ENCODER_STOPPED:
    Thread.Sleep(1000)
    print ".",

enc.Stop()