選択範囲の指定方法 のバックアップの現在との差分(No.5)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#contents
#br
**AviSynthにおける選択範囲の指定 [#o4e79ee6]
AviSynthで選択範囲の指定を行う方法には、次の3つがあります。

* AviSynthにおける選択範囲の指定方法 [#hda30851]

AviSynthでは、以下の方法で、選択範囲の指定を行うことができます。

-[[Trimフィルタ>#bbe71594]]
-[[AddRangeプラグイン>#ff5fcec1]]
-[[AddRange関数>#w56b7f38]]
#br

**フレーム番号の数え方 [#fe0dd18f]
AviSynthではフレーム番号は0から始まります。編集ソフトによっては1から始まるものもありますので注意してください。~
AviUtlでは、「1から数える」か「0から数える」かをシステム設定で変更することができます(デフォルトは1から)。
#br
* Trimフィルタ [#bbe71594]

**Trimフィルタ [#bbe71594]
AviSynth内蔵のTrimフィルタを使って、選択範囲を指定することができます。
AviSynth内蔵のTrimフィルタを使って、選択範囲を指定することができます。詳しくは、[[Trim]]を参照。

Trimフィルタの書式は、次の2通りです。
以下のTipsは、[[Trim]]の補足を目的として書かれています。

 Trim(clip clip, int first_frame, int last_frame)
 Trim(clip clip, int first_frame, int -num_frames)
** フレーム数を指定して範囲を選択する [#rb6846ce]

***書式1: Trim(clip clip, int first_frame, int last_frame) [#ub568d60]
-書式: Trim(clip clip, int first_frame, int last_frame)
--clip: クリップ
--first_frame: 選択開始フレーム
--last_frame: 選択終了フレーム
#br
#br
例: 100番のフレームから199番のフレームまでを選択したい場合~
 Trim(100, 199)
#br
3番目の引数を負の値にすることにより、選択するフレーム数を指定することができます。

***書式2: Trim(clip clip, int first_frame, int -num_frames) [#rb6846ce]
-書式: Trim(clip clip, int first_frame, int -num_frames)
--clip: クリップ
--first_frame: 選択開始フレーム
--num_frames: 選択フレーム数(負の符号が必要)
#br
#br
例: 100番のフレームから100フレーム分を指定したい場合~
 Trim(100, -100)
#br
「100番のフレームから199番のフレームまでを選択」するのと「100番のフレームから100フレーム分を指定」するのは同じことを意味します。~
このため、「Trim(100, 199)」と「Trim(100, -100)」は、まったく同じことを表していることになります。
#br
-使用例: フレーム100から100フレーム分を指定したい場合
#pre{{
Trim(100, -100) # Trim(100, 199)と同じ
}}
「フレーム100からフレーム199までを選択」するのと「フレーム100から100フレーム分を指定」するのは同じことを意味します。このため、「Trim(100, 199)」と「Trim(100, -100)」は、まったく同じことを表していることになります。

***書式1において、last_frame=0のとき [#vc16da6c]
選択終了フレーム番号を0にした場合、フレーム番号0ではなくクリップの最後を意味します。~
このため、たとえばフレーム番号0のみ(1フレーム分)を選択したいときは、
** 複数の選択範囲を結合する [#fbb5adc4]

 Trim(0, 0)
たとえば、フレーム100から199まで、200から299まで、300から399までを一つのクリップにしたい場合、

ではなく、
#pre{{
Trim(100,199) ++ Trim(200,299) ++ Trim(300,399)
}}

 Trim(0, -1)
というように、+ または ++ で連結させます。

と記述する必要があります。~
「Trim(0,0)」は、0番〜最終フレームまでを選択範囲として指定してしまうからです。
#br
+ と ++ の違いについては、オリジナルFAQの「[[+と++の違いは何ですか?>オリジナルFAQ#g2436d0e]]」を参照。

***複数の選択範囲を結合する [#fbb5adc4]
複数の選択範囲をつなげて、一つのクリップとしてエンコードしたい場合には、次のように記述します。
*** pad_audioオプションについて(AviSynth 2.5.6以降) [#q3b36133]

 Trim(A,B) ++ Trim(C,D) ++ Trim(E,F) ...
AviSynth 2.5.6から、pad_audioオプションが追加されました。pad_audioオプションをtrueに設定すると、映像の長さにあわせて音声が調整されます(映像より音声が短い場合、音声が水増しされる)。

たとえば、フレーム番号100から199まで、200から299まで、300から399までを一つのクリップにする場合、
デフォルトでpad_audio=trueとなっているため、AviSynth 2.5.6以降のバージョンでは、

 Trim(100,199) ++ Trim(200,299) ++ Trim(300,399)
#pre{{
Trim(100,199) + Trim(200,299) + Trim(300,399)
}}

と書きます。
と記述しても、各選択範囲の音声の長さが自動的に調整されることになります。

***+ と ++ の違い [#b43c5c41]
ビデオクリップの結合に使われる符号(演算子)には、+と++があります。
** Trimフィルタの設定をより簡単に [#dfeb5b5b]

+は映像と音声の同期を考えずに単純に結合します。これに対し、++は映像と音声の長さが合わない場合に、音声をカットしたり無音を挿入することで同期をはかります。
Trimフィルタの設定を容易にする方法が、いくつかあります。ここでは、AviUtl用のTrim エクスポートプラグインとVirtualDubModのスクリプトエディタを使った方法を紹介します。

一般的に、AVIファイルなどの結合には+が、Trimフィルタによる選択範囲どうしの結合には++が用いられます。
*** Trim エクスポートプラグイン [#j2dc7f04]

**AddRangeプラグイン [#ff5fcec1]
Kiraru2002さん作成のAddRangeプラグインを使って、選択範囲の指定を行います。~
VirtualDub、VirtualDubModやNanDubなどの編集設定ファイル(*.vcf)と組み合わせて使用します。
あじ氏作のTrim エクスポートプラグイン(「AviSynth Script エクスポート」に収録)は、AviUtl上で行った編集内容を、Trimフィルタの形式でクリップボード上にエクスポートします。

AddRangeプラグインは、Kiraru2002の部屋から入手してください。
詳しくは、[[AviSynth Script エクスポート]]と[[Trim エクスポートプラグインの使い方]]を参照。

-AddRangeプラグイン(Kiraru2002の部屋)
--http://members.at.infoseek.co.jp/kiraru2002/
*** VirtualDubModの編集内容をスクリプトエディタにインポート [#m5dbcc1b]

AddRangeプラグインは、vcfファイル内に次のような記述があるものに対応しています((AddRangeプラグインの説明書からの引用。AddFrameはNanDubのvcfファイルで使われている形式です。AddFrameとAddMaskedRangeはVer0.5以降で対応。))

 VirtualDub.subset.AddRange ( 999 , 999 )
 VirtualDub.subset.AddFrame ( 999 , 999 )
 VirtualDub.subset.AddMaskedRange ( 999 , 999 )

#br
***AddRangeプラグインの使用手順 [#bc7a5b0c]
''(1)AVSファイルを開く''

#ref(open_avs.png)
VirtualDubModで編集したいAVSファイルを開きます((ここではVirtualDubModを使って説明していますが、VirtualDubやNanDubでも同様の手順で行うことができます。))。

フィルタをかけた状態のAVSファイルだとシークが重くなりますので、フィルタをかけないか、必要最低限のフィルタのみ有効にしておくことをおすすめします。
#br

''(2)不要な範囲の削除''

#ref(vdubmod_delete.png)
不要な範囲を選択して、削除していきます。

 (1)選択開始(''[Edit]->[Set selection start]/[Home]'')
 (2)選択終了(''[Edit]->[Set selection end]/[End]'')
 (3)選択範囲の削除(''[Delete]'')
 (4)選択範囲をマスク(選択開始フレームと同じ画像に)することもできます。

(1)(2)(3)(または(4))を繰り返します。
#br

''(3)vcfファイルの保存''

#ref(vdubmod_save_vcf.png)
選択範囲の指定を終えたら、''[File]->[Save processing settings]''から、VirtualDubModの編集設定ファイル(*.vcf)を保存します。

ここでVirtualDubMod上での編集作業は終わりになります。つづいてAVSファイルを再編集します。
#br

''(4)AVSファイルの再編集''

AVSファイルに次の2行を追加します((オートローディング機能を使ってプラグインを読み込む場合、一行目のLoadPlugin()は必要ありません。))。

 LoadPlugin("AddRange_for_25.dll") #Avisynth1.0/2.0用はAddRange.dll
 AddRange("hoge.vcf")

これで、さきほど行った選択範囲の設定が、AVSファイルに反映されます。

#br
***VirtualDub1.5.8/VirtualDubMod1.5.10.1以降におけるvcf保存時の注意 [#e5078fdf]
#ref(vdub_save_option.png)
VirtualDub1.5.8/VirtualDubMod1.5.10.1以降の場合、vcfファイルの保存ダイアログ画面左下にあるチェックボックスを有効にしてください。ここにチェックを入れないと、vcfファイルに選択範囲指定の情報が保存されません。

#br
**AddRange関数 [#w56b7f38]
***AddRange関数について [#r192ac98]
AddRange関数は、2ちゃんねるDTV板「DivX & Avisynth を絶賛しよう 3」スレッドの236さん作の関数です。

この関数も、VirtualDubなどの編集設定ファイル(*.vcf)を利用して、選択範囲を適用します。

ただし、[[AddRangeプラグイン>#ff5fcec1]]とは、使用手順が異なります。~
詳しくは[[AddRange関数の使用手順>#s164b310]]をご覧下さい。

***AddRange関数 [#f4f09c4b]
-関数
 function AddRange(clip clip, int "startframe", int "offset")
 {
 return clip.Trim( default(startframe,0), ((default(offset,0)==0) ? 0 : startframe+offset-1) )
 }

-書式
 AddRange(clip clip, int "startframe", int "offset")

-引数
--startframe: 開始フレーム
--offset: オフセット

-使用例
 AddRange(0,6) + AddRange(13,3) + AddRange(20,4)

***AddRange関数の使用手順 [#s164b310]
''(1)vcfファイルの作成''

まず、[[AddRangeプラグインの使用手順>#bc7a5b0c]]の(1)〜(3)を参考にして、vcfファイルを作成してください。
#br

''(2)AddRange()の抽出''

#ref(dd_vcf.png)
(1)で作成したvcfファイルを、メモ帳で開きます。~
メモ帳のウィンドウ上に、vcfファイルのアイコンをドラッグ&ドロップするなどして開いてください。

#ref(vdubmod_vcf.png)
vcfファイルには
 VirtualDub.subset.AddRange ( *** , *** )
のように記された部分が含まれていると思います(([[VirtualDub1.5.8/VirtualDubMod1.5.10.1以降におけるvcf保存時の注意>#e5078fdf]]を参照。))。

このうち、AddRange()の部分(図の赤丸で囲んでいる部分)((最後の;(セミコロン)は必要ありません。))をコピーして、AVSファイル内の選択範囲を指定したい行に貼り付けてください。

選択範囲が複数ある場合は、次のように+(または++)で連結する形で、記述します。
 AddRange(0,6) + AddRange(13,3) + AddRange(20,4)
#br

''(3)スクリプトの変更''

vcfファイル内のAddRange()をすべてコピー&ペーストすることができたら、今度は、AddRange関数をスクリプト内に貼り付けます((あらかじめ記述しておいてもかまいません))。~
関数を貼り付ける位置は、どこでもかまいません。

#ref(addrange_f_avs.png)
AddRange関数の使用例。

AVSファイルを上書き保存すれば、VirtualDub上での編集作業が適用された状態になります。

#br
**VirtualDubModの編集内容を、スクリプトエディタにインポートする [#m5dbcc1b]

VirtualDubMod上で行った編集内容(選択範囲)を、同ソフト内蔵のスクリプトエディタに、Trimフィルタのフォーマットでインポートすることができます。

手順は、以下の通りです。
詳しくは、「[[VirtualDubModの編集内容をスクリプトエディタにインポート]]」を参照。

''(1)VirtualDubModで選択範囲の指定''
* AddRangeプラグイン [#ff5fcec1]

#ref(vdubmod_edit_001.png)
まず、VirtualDubModでAVSファイルを開き、選択範囲を指定します。
Kiraru2002氏作成のAddRangeプラグインを使用する方法です。

VirtualDubModにおける選択範囲の指定方法については、[[[AddRangeプラグインの使用手順]>#bc7a5b0c]]の(2)を参考にしてください。
AddRangeプラグインは、VirtualDub系のソフトウェア(VirtualDubModやNanDubなどを含む)の編集設定ファイル(*.vcf)を利用して、選択範囲の指定を行います。

''(2)スクリプトエディタの起動''
詳しくは、[[AddRangeプラグイン]]を参照。

#ref(vdubmod_edit_002.png)
メニューの''[Tools] -> [Script editor...]''から、スクリプトエディタを起動します。
* AddRange関数 [#w56b7f38]

''(3)選択範囲のインポート''
AddRange関数は、AddRangeプラグインと同様に、VirtualDub系ソフトウェアの編集設定ファイル(*.vcf)を利用して、選択範囲を指定するための関数です。

#ref(vdubmod_edit_003.png)
Trimフィルタを挿入したい箇所にポインタを移動させてから、スクリプトエディタのメニューの''[Edit] -> [Import Framset as Trims]''を選択します。
詳しくは、AddRangeを参照。

#ref(vdubmod_edit_004.png)
すると、VirtualDubMod上で編集した選択範囲が、Trimフィルタのフォーマットで挿入されます。複数の選択範囲を指定していた場合は、++で連結された形で挿入されます(上図参照)。
* 備考 [#u0cc3826]

***スクリプトエディタのバグについて [#sba56bbc]
バージョン1.4.13から1.5.10.1((2004年10月末の時点での話です。それ以降のバージョンではバグ修正される可能性があります。))までのスクリプトエディタでは、上記の方法を利用した際に、選択範囲が正常に反映されないバグがあることがわかっています。
** AviSynthにおけるフレーム番号の数え方 [#fe0dd18f]

たとえば、全100フレームのクリップから10フレーム目のみを削除して、0フレームから9フレームまでと11フレームから99フレームまでを選択した場合、
AviSynthでは、フレーム番号は、0からカウントされます。編集ソフトによっては1から始まる場合がありますので、注意してください。

 Trim(0,9) ++ Trim(11,99)
*** AviUtlにおけるフレーム番号の表示を0からに変更 [#e7af14d1]

となるべきところが、
AviUtlでは、「1から数える」か「0から数える」かを、システム設定で変更することができます(デフォルトは1から)。

 Trim(0,10) ++ Trim(11,100)
#ref(aviutl_menu_system_setting.png)

というように1フレーム水増しされてしまいます。
設定を変更したい場合は、「ファイル」 > 「環境設定」 > 「システムの設定」をクリックして、システムの設定画面を起動します。

***VirtualDubMod バグ修正版 by Fizick [#fddf3d89]
#ref(aviutl_setting_to_count_from_1.png)

上記のバグを修正したVirtualDubMod 1.5.4.2が公開されています。
デフォルトでは1から数えるようになっています。

-VirtualDubMod~
Special bug fixed version 1.5.4.2 Build 2070 October 13, 2004 by Fizick.~
--http://bag.hotmail.ru/vdubmod/vdubmod.dhtml
0から数えるように設定したい場合は、「フレーム番号の表示を1からにする」のチェックを外してから、AviUtlを再起動します。変更は、再起動後に有効になります。

この1.5.4.2を利用するためには、1.5.4.1のフルパッケージをインストールした後に、1.5.4.2のファイルを上書きする必要があります。