IronPython でスクリーンキャプチャのビデオを作成

Windows Media Encoder の COM コンポーネントIronPython から使用すれば、IronPython で WMV の動画処理が可能となる。

とりあえず、今回は IronPython でスクリーンキャプチャの WMV ファイル作ってみる事にする。

主な手順は以下の通り。

  1. Windows Media Encoder 9 のインストール
  2. Windows Media Encoder の COM ラッパー作成
  3. IronPython のスクリプト作成

Windows Media Encoder 9 のインストール

Microsoft の Windows Media のダウンロードサイトから Windows Media Encoder 9 をダウンロードしてインストールする

http://www.microsoft.com/japan/windows/windowsmedia/download/default.aspx

Windows Media Encoder の COM ラッパー作成

.NET Framework SDK に含まれる tlbimp.exe を使って、wmenc.exe の COM ラッパーを作成する。(wmenc.exe は Windows Media Encoder のインストールディレクトリ内にあるはず)

>tlbimp.exe C:\Windows Media Components\Encoder\wmenc.exe

これで、カレントディレクトリに WMEncoderLib.dll が生成される

IronPython でスクリーンキャプチャのスクリプト作成

スクリーンキャプチャ実施のおおまかな手順は以下の通り。

  1. WMEncoderAppClass の Encoder プロパティから、もしくは WMEncoderClass でIWMEncoder2 オブジェクトを取得
  2. IWMEncSourceGroupCollection にIWMEncSourceGroup オブジェクトを追加
  3. IWMEncSourceGroup に IWMEncSource を追加
  4. IWMEncSource に入力デバイス(スクリーンキャプチャ)を設定
  5. IWMEncSourceGroup オブジェクトにエンコード用のプロファイル IWMEncProfile オブジェクトを設定
  6. IWMEncoder2 の PrepareToEncode メソッドで準備、Start メソッドで録画の開始、Stop メソッドで終了
import sys

if len(sys.argv) < 2:
    print "%s [output file name]" % sys.argv[0]
    sys.exit()

from System import *
from System.IO import *

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

enc = WMEncoderClass()

#こちらでも可
#app = WMEncoderAppClass()
#enc = app.Encoder

sg = enc.SourceGroupCollection.Add("sg1")

src = sg.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO)

#スクリーンキャプチャの場合は ScreenCap:// という記述を使用
src.SetInput("ScreenCap://test1", "", "")

#Webカメラ等のデバイスから録画する場合は以下のようにする
#src.SetInput("Default_Video_Device", "Device", "")

#出力ファイル名を設定
enc.File.LocalFileName = FileInfo(sys.argv[1]).FullName

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

sg.Profile = profile

#エンコード(録画)の準備、Start を呼び出す前に必ず実行する必要有り
enc.PrepareToEncode(True)

#エンコードの開始
enc.Start()

Console.ReadLine()

#エンコード終了
enc.Stop()

WMEncoderAppClass の Encoder プロパティから WMEncoder を取得する場合は、サービスの「DCOM Server Process Launcher」が開始されていなければならない模様。(開始していないと 800706ba エラーが発生した)

エンコード用のプロファイルは、Windows Media Encoder 9 のユーティリティ「Windows Media プロファイルエディタ」を使って事前に作成(test.prx ファイル)したが、スクリプト上で作成することも、WMEncoder の ProfileCollection から取得することも可能。

プロファイル名を出力するスクリプト

ProfileCollection のプロファイル名を出力する

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

enc = WMEncoderClass()

for pf in enc.ProfileCollection:
    print pf.Name