NiVEプラグイン作成のためのメモ

書いてあること

NiVEに付属のテキストは詳しい代わりに長いので、 大雑把な階層構造だけHTMLでまとめてみました(nicoAE.History名前空間は略)。

ついでに、IEffectIMediaInputIMediaOutputインターフェースの仕様を 一番最後に付けておきました。

プラグイン作成の大雑把な流れはおまけのおまけを見てみてください。

注意事項

普通は使わないと思ったものは名前の紹介のみに留めました。
また、具体的な内容(どんなメソッドがあるか、など)には触れていません。 NiVEの付属テキストを検索してみてください。

なお、アルファベット順ではないです。気になったらすみません・・・

namespace nicoAE.Plugin.Interface
IHost プロジェクトの情報を提供します。 (本体で実装)
ITimeline タイムラインの情報を提供します。
IMediaInput ファイル入力プラグインを作成するときに実装します。
IMediaOutput ファイル出力プラグインを作成するときに実装します。
IEffect エフェクトプラグインを作成するときに実装します。
IEffectProperty エフェクトのプロパティ(の値)を表します。
IPropertyEditControl エフェクトプロパティ設定用コントロールのインターフェースです。 雑に言うと、ユーザがタイムラインにそのエフェクトを追加したときに 設定できる項目(1個ずつ)を表します。
その他諸々ありますが割愛します。
(IExtendEvent,IScalingTimeline,ISynchronizeKeyFrame,IViolateImageEffect)
namespace nicoAE.Plugin.Utils
KeyFrame キーフレームを表します。
MediaInfo メディアの情報を格納する構造体です。
MediaType メディアの種類を表します(列挙体)。
(MediaType.Video,MediaType.Audio,MediaType.Image)
KeyFrameType キーフレームのタイプを表します(列挙体)。
PresentState 現在のプログラムの状態を示します。
PluginUtils よく使用するであろう処理をまとめたクラスです。
その他諸々ありますが割愛します。
(AnchorImage,ReferenceData,UseTimelineAttribute)
namespace nicoAE.Plugin.Property
Int32Property Int32型の値を格納するプロパティです。
SingleProperty Single(float)型の値を格納するプロパティです。
SizeProperty Size型の値を格納するプロパティです。
SizeFProperty SizeF型の値を格納するプロパティです。
PointProperty Point型の値を格納するプロパティです。
PointFProperty PointF型の値を格納するプロパティです。
SelectableProperty 選択形式の値をInt32型で格納するプロパティです。
BooleanProperty Boolean型の値を格納するプロパティです。
StringProperty String型の値を格納するプロパティです。
ColorProperty Color型の値を格納するプロパティです。
RadianProperty 回転数、角度(Int32)を格納するプロパティです。
RadianFProperty 回転数、角度(float)を格納するプロパティです。
TimelineProperty 選択されたタイムラインを格納するプロパティです。
namespace nicoAE.Plugin.Property
Int32EditControl Int32Propertyを編集するコントロールです。
SingleEditControl SinglePropertyを編集するコントロールです。
SizeOrPointEditControl SizeProperty、PointPropertyを編集するコントロール。
どちらを扱うかはSoPEditType列挙体で指定します。
SizeOrPointFEditControl SizeFProperty、PointFPropertyを編集するコントロール。
どちらを扱うかはSoPEditType列挙体で指定します。
SelectableEditControl SelectablePropertyを編集するコントロールです。
BooleanEditControl BooleanPropertyを編集するコントロールです。
StringEditControl StringPropertyを編集するコントロールです。
ColorEditControl ColorPropertyを編集するコントロールです。
RadianEditControl RadianPropertyを編集するコントロールです。
RadianFEditControl RadianFPropertyを編集するコントロールです。
TimelineEditControl TimelinePropertyを編集するコントロールですです。
SoPEditType SizeOrPointEditControlなどの種類指定に使います。
(SoPEditType.Size,SoPEditType.Point)
その他諸々ありますが割愛します。
(KeyFramePoint,KeyFrameTypeWindow,TimelinePanel,PropertyEditSkeleton)

【おまけ】 IEffect/IMediaInput/IMediaOutputのメンバ

interface nicoAE.Plugin.IEffect
string PluginName プラグインの名前(プロパティ)。
string Category このプラグインを格納するカテゴリの名前(プロパティ)。
bool PresetProperty プリセットを利用するかどうか(プロパティ)。
MediaType CorrespondingType プラグインがサポートするメディアの形式(プロパティ)。
(例: MediaType.Video | MediaType.Image)
void
Initialize(
IHost host,
MediaInfo info
)
プラグインを初期化します。
void
Dispose()
プラグインが破棄されるときに呼び出されます。
IEffectProperty[]
GetDefaultProperty()
このエフェクトの初期プロパティを取得します。
IPropertyEditControl[]
GetControls()
エフェクトのプロパティ設定を行う全てのコントロールを取得します。 (基本的には、GetDefaultProperty() の実装に現れる「Property」を 対応する「Control」に置き換えたもの)
KeyFrame[]
GetPresetProperty(
int index,
string propertyName
)
プリセットされたプロパティが存在する場合、 そのフレームを返します(プリセットを利用する場合のみ実行されます)。
Bitmap
ProcessingImage(
Bitmap image,
IEffectProperty[] property
)
入力されたイメージにエフェクトを掛けます。 おそらく、image を直接いじって return image; でOKです(たぶん・・・)。
(イメージに対応しない場合は未実装で構いません)
byte[]
ProcessingAudio(
byte[] audio,
IEffectProperty[] property
)
入力されたオーディオにエフェクトを掛けます。
(オーディオに対応しない場合は未実装で構いません)

※注意

ProcessingImageなどに渡されるpropertyの中身の並び順は不定です。
必ずプロパティ名をチェックして、何がどれの値か調べてください。

GetDefaultPropertyが返したプロパティたちの名前と、GetControlsが返す コントロールたちの名前は同じものにしておかないと(順番は違ってもよい) エフェクトを追加した瞬間にエラーが出ます。(よくありますw)

interface nicoAE.Plugin.IMediaInput
string PluginName プラグインの名前(プロパティ)。
string CorrespondingType 「ファイルを開く」で選択できるファイルの種類(プロパティ)。 たとえば "画像ファイル(*.bmp,*.jpg)|*.bmp;*.jpg" のように、 表示名と拡張子を | で区切った文字列を返します。
string FileName 入力ファイルの名前(プロパティ)。 通常、LoadFileの引数に与えられた値をそのまま保持します。
void
Initialize(
IHost host
)
プラグインを初期化します。
void
Dispose()
プラグインが破棄されるときに呼び出されます。
bool
LoadFile(
string file
)
ファイルを読み込みます(成功時にtrue)。
MediaInfo
GetMediaInfo()
読み込んだファイルの情報をMediaInfoとして取得します。
int
GetLength()
入力ファイルの(プロジェクトにおける)長さを取得します。 プロジェクトのフレームレートに合わせて計算した値を使用してください。
Bitmap
GetFrame(
int index
)
指定位置のフレームを取得します。
(音声のみのメディアの場合は未実装で構いません)
byte[]
GetAudio()
ビデオからオーディオを取得します (オーディオのフォーマットはReferenceData.WaveFormatに変換して下さい)。
音声のないメディアの場合はnullを返してください。
byte[]
GetFrameAudio(
int index
)
オーディオをフレーム単位で切り出したデータを取得します。 (音声のないメディアの場合は未実装で構いません)

※注意

プロジェクトのフレームレートはいつでも変更されうるのでご注意ください。 Initializeに渡された host を保持しておいて、ProjectFrameRateを チェックすれば問題ないです(たぶん・・・)。

フレームの位置はPluginUtils.FrameIndex()を使用して計算できるようです。

CorrespondingTypeの値についてですが、複数セットを登録したい場合は、 "表示名1|拡張子1|表示名2|拡張子2|・・・" のようにしてください。

interface nicoAE.Plugin.IMediaOutput
string PluginName プラグインの名前(プロパティ)。
string CorrespondingType 「名前を付けて保存」で選べるファイルの種類(プロパティ)。 たとえば "AVIファイル(*.avi)|*.avi" といった具合に、 表示名と拡張子を | で区切った文字列を返します。
string FileName 書き出すファイルのフルパス名(プロパティ)。 通常、Initializeの引数に与えられた値をそのまま保持します。
MediaType InputType 出力処理時に要求するデータの種類(プロパティ)。
オーディオを含むビデオを出力する場合はMediaType.Video、
オーディオを含まないビデオの場合はMediaType.Image、
オーディオのみの場合はMediaType.Audioを返してください。
void
Initialize(
string filename,
IHost host
)
プラグインを初期化します。
void
Dispose()
プラグインが破棄されるときに呼び出されます。
bool
ShowSaveOption(
IntPtr hwnd
)
セーブオプションの設定画面がある場合は表示してください (設定成功→true、失敗orキャンセル→false)。
設定画面がない場合は単に true を返してください。
void
AddFrameImage(
Bitmap image
)
ファイルにフレームイメージを追加します。 (保存するときは、このメソッドを用いて1枚ずつフレームが送られてきます)
void
AddFrameAudio(
byte[] audio
)
ファイルにオーディオを追加します。
void
Close()
書き出し処理を全て完了し、ファイルハンドルを解放します。 ユーザが出力処理をキャンセルした場合、全てのフレームを 書き出す前にCloseが呼ばれる可能性があります。

おまけのおまけ: 結局どうやって作ればいいの?

  1. Visual C#のプロジェクトを作る(クラスライブラリ)
  2. NiVEのDLLを「参照の追加」で選ぶ(nicoAE.Plugin.dllを選択)
  3. サンプルプログラムを見ながら using 〜 を足す
  4. IEffectインターフェースなどを実装する(クラス名の後ろに : IEffect などを)
  5. ビルドする。「参照が足りない」って言われたら指示通りに足す
  6. どこかにDLLができたので、探してNiVEのpluginsフォルダにコピーする

いまさらですが、「未実装で構わない」というのは、NotImplementedException辺りを
投げておけばOKという意味です。

あと、このメモの転載・改変は自由ですが、間違いがあった場合や
NiVEのバージョンが上がって通用しなくなった場合は各自で直してくださいw