2014年3月30日日曜日

Ffmぺsync ver.1.0 気の迷いが招いた不具合”回避”修正 動画や動画格納フォルダ以外は投入回避でorz

Ffmぺsync ver.1.0  ffmpeg.exeを手軽に使うためのファイル同期風フロントエンドVBスクリプト 本編

 何を考えてたんだろう。今なぜこんな事をしたのか思い出せない、、、、きっと気の迷いに違いない。 気がついたらCドライブをffmpesync.vbsにドロップしていた。
 最初は形式別カウントが景気よくまわっていく様子が見えた。 出てくるファイルは明らかに動画とは関係ないファイルばかり。 これは二文字制限だからそれにヒットする拡張子のファイルみんな通してるんだろーなー。 下手な鉄砲も数打ちゃ当たるってやつ。 Windowsとかフォルダやファイル多いだろうからな。 間口広げてチェック速度を出来るだけ早くした弊害か。それでもキッチリ動作してるのを喜ぶべきか、、、と思いつつみてたら。ガンッ!!

 はいエラー。 原因は形式別カウントの格納インデックスの上限を超えたためですたorz
行位置が大きいのはコメント入ってるオリジナルコードでの実行だからです。ブログにはっつけてるのはコメントをそぎ落として貼り付けてますからまた違ったエラー番号が出ます。
 何にしても、とりあえず格納インデックスの上限を99にして再実行。
 順調に処理は進みソシテッ
 事前カウントが真っ白になり俺の頭も真っ白~。
 ちと考えたけど原因ワカラン。

 とりあえず、Windowsシステムフォルダとか、Program Filesとか、動画格納フォルダでないフォルダは投入しないでください。 何が起こるかわかりませんですだすどすorz

2014年3月29日土曜日

Ffmぺsync ver.1.0 実行タイムと画質比較

Ffmぺsync ver.1.0  ffmpeg.exeを手軽に使うためのファイル同期風フロントエンドVBスクリプト 本編   実行タイムと画質比較 

 Ffmpesyncは自分の動画環境である「PT某録画ファイルを元にAvitul+x264でエンコードした高画質動画」を、「仕分けしてるフォルダごと指定して一気にほどほど画質のコンパクトなファイルに指定先に変換出力するフロントエンドVBS」です。
 自分はPT某からFfmpesyncを使って直接変換したファイルを保管用とする事はないのだが、普通はAviutlでゲツした番組を片っ端からエンコードしてる人はまずいないわけで、それを考えると録画ファイルを直接Ffmpesyncに放り込んで、処理時間とかファイルサイズとか画質とかどうなるか、残しとくのも意味あるかなと、今回の記事を立ち上げて見ました。

 念のため言っておくとFfmpesyncは変換パラメータを渡してるだけなので実際の処理はFFmpeg.exeまかせです。同じ性能のパソコンでも使用するFFmpegのバージョンやビルドしたライブラリとかにより時間に違いが出るかもしれません。

 ちなにみ私はここらへんから環境にあったFfmpegのビルドを利用させてもらっています。
Zeranoe FFmpeg
お気に入りの動画を携帯で見よう
感謝です。


テストに使用した30分の動画TSファイル。 ※プロテクトのかかった動画ファイルは変換できません。
処理(元)ファイル名:2014032907000101-.ts
  サイズ:4390.92MB
長さ(時間):00:30:13
データ速度:‎24000kbps
フレーム高:1080
フレーム率:‎29 フレーム/秒
フレーム幅:1920 


 画質の比較はこのシーンでします。もっとも本当は動画で見てもらうのがいいんだけどね。最近何かとアレだからなー ワンシーン300%拡大です。


Win8.1とWin7sp1それぞれでファイル詳細を取得したらこうなります。※濃い背景部分は出力ログからのコピペです。

プロパティ表示
Win8.1とWin7sp1の詳細項目を並べると気がつくと思いますが、詳細項目位置が「属性」以降で異なっている、、、この状態は同じパソコン内でも発生する場合があります。これは機会があったら述べようと思います。
 このファイルを元に最初から最後まで1280x720へ変換しています。


 まずは参考までに自分が保管用エンコードとして使っているAviutl+拡張x264出力(GUI)Ex
 
 
パラメータは1Pass品質25
処理(元)ファイル名:C:\Video\2014032907000101-妖怪ウォッチ25aviutl.mp4
  サイズ:272.79MB (6.21%)
長さ(時間):00:30:12
データ速度:‎1163kbps
フレーム高:720
フレーム率:‎29 フレーム/秒
フレーム幅:1280

処理時間34:30 (ファイルの作成日時と更新日時の差分より)
 ソースがフルHDだからかなーこんなもんかと思っていたら、そーいや保管用フィルターかけたままだなーと気がついてリサイズと音声最大化以外のフィルターをOFFして実行
  サイズ:259.23MB (5.9%)
データ速度:‎1101kbps
処理時間31:17
 フィルターがなくなった分少し時間短くなったな。うん。 ファイルサイズもぼちぼち。画質もボヤけてはいるが誤魔化しが上手いと思う。


市販品もサンプル取らないトナーと、自分が保管用エンコードでロスレス音声wavを作成するのにつかっている変換ソフトの「YOUTUBEプロファイル1280x720通常」で変換をしてみた、のだが
  サイズ:1385.19MB(31.5%)
データ速度:‎6276kbps
処理時間7:33 変換速度はAviutlの時と比べて1/3切ってるのだがなにぶんファイルサイズと画質のバランスがザンネンすぐる。、、、、プロファイルの選択間違えたかなーなんで製品名は出しません。いやホント 音声変換ではお世話になってるのよ。。。。。。


 ここまでは実行環境の関係からエンコード用PCでしていたのだが、Ffmpesync+FFmpegを品質毎にするにあたって、今時の一般的であろうCPUのパソコン(i7-2600k 3.4GHz Mem8GB SSD)
でエンコードしようと思う。品質はFfmpesync自動設定初期値の34
  サイズ:172.74MB(3.94%)
データ速度:‎663kbps
処理時間5:27

 ファイルサイズと処理時間は文句はほとんどない、、、が画質的にはどーかというと。これは以下エンコードマシンで各品質ごとにしていった結果を見て欲しい。でも拡大した静止画だからアラは目立つんだけど、実際はもっと小さくて動きがあるわけで、結構誤魔化されるんだよね。

 以下はFfmpesync+FFmpegにてサイズ固定で品質のみ変更しておこなった。処理はメインエンコードマシン(i7-3930k 3.2GHz Mem8GB SSD)。 CPU速度は2600kより遅く設定しているのにも関わらず12スレッドの威力かどーか不明だが、処理時間は総じて4:30~5:00と短くなった。

ffmpesyncの指定は 
画質 ←  01,11,21,31,41 → 圧縮率(ファイルサイズ)
な感じで、バランスがいいのが21.品質31-1280x720。ファイルサイズを優先したいなら31.品質34-1280x720。
  低めの品質にして画面サイズを一回り小さくするのもアリ。ファイルサイズが小さくなり画面も落ち着く感じがします。

01.品質25-1280x720 2010kbps 464.32MB(10.57%)
 11.品質28-1280x720 1343kbps 320.13MB(7.29%)
21.品質31-1280x720 931kbps 231.05MB(5.26%)
31.品質34-1280x720 663kbps 173.04MB(3.94%)
41.品質37-1280x720 481kbps 133.65MB(3.04%)

 品質を固定して画面サイズを小さくした全体サンプル。 (自動判定ロジックでは変換元のファイルサイズが先より小さくなった場合、画面サイズを一回り小さく設定するようにしてある)
33.品質34-960x540 443kbps 126.11MB(3.01%)

 このように画面サイズを小さくするとファイルサイズも小さくなり、画質もいくぶん落ち着く、、、気がするかもしれない。 結局慣れとかもあるかもしれないねー。
 後、出力先の画面サイズが小さくなると処理時間も短くなる。1280x720の時と比べて30秒は短くなっている。 ある程度割り切れば気軽に動画を持ち出すことが出来るわけだ。

 それなりのスペックのPCなら一時間番組くらいまでなら少しの時間で変換できるので、自分好みの妥協できる「画質」と「画面サイズ」と「ファイルサイズ」のを見つけてください。

Ffmぺsync ver.1.0 プロシージャ解説1 ファイルの動画形式判定(おおまか版)について

Ffmぺsync ver.1.0  ffmpeg.exeを手軽に使うためのファイル同期風フロントエンドVBスクリプト 本編 プロシージャ解説1 ファイルの高速動画判定についてです。
本編のこの部分を修正した。具体的には動画として判断するファイル形式の追加。
'***2014/3/29 update st
Function bDogaTypeExt( poItem )
Dim sType , bType , sExt , bExt, bExt1
 sType = Lcase(Trim(poItem.Type))
 bType  = Instr(sType , "ビデオ") > 0 or Instr(sType , "ムービー") > 0
 sExt = Lcase(Trim(oWSFSO.GetExtensionName(poItem.path)))
 bExt = Instr(sExt , "av") > 0  or Instr(sExt , "as") > 0 or Instr(sExt , "wm") > 0 or Instr(sExt , "mp") > 0  or Instr(sExt , "mo") > 0  or Instr(sExt , "ts") > 0
 bExt1 = Instr(sExt , "rm") > 0 or Instr(sExt , "fl") > 0 or Instr(sExt , "sw") > 0 or  Instr(sExt , "ps") > 0 or Instr(sExt , "vo") > 0   or Instr(sExt , "og") > 0
 '***↑↑↑↑↑Windowsで非動画判定ファイルは拡張子をここに登録すれば動画判定が真↑↑↑↑
bDogaTypeExt = bType or bExt or bExt1
End Function
'***2014/3/29 update ed

この修正でFfmpegで変換できる動画ファイルの形式を増やす事ができました。
 .avi
 .mpa
 .mp4
 .mpeg
 .mpg
 .mov 
 .asf
 .wmv
 .ps
 .ts
 .m2ts
 .vob
 .ogv
 .flv
 .swf
FFmpeg - ウィキペディア の「2 サポートしているファイル形式」を見ると、多いよねーサポートしてるファイル形式。知らないのもかなりある。
 
 面倒くさがってワイルドカードでファイルを何でも無節操に片っ端からFFmpegに放り込むと、当然サポートしていないファイルは変換エラーとなるわけで、その分処理は遅くなるし不安定にもなる。
 最初は判定に拡張子は利用せずFileObject.Typeのファイル種類に"ビデオ"や"ムービー"な文字列があった場合は拡張子に関係なく動画として判断するようにしていたが、調べると動画として判断してくれるファイルはかな~り少なく、またパソコンにより(OSの違いか?)結構な違いが出た。メインパソコンは動画として判断しても違うパソコンでは動画として判断してくれないとかorz
 素早く確実に判定するにはやっぱりファイル形式で見るのがいいなーとGetExtensionName(FileObject.Path)でファイルの拡張子を取得。 拡張子の中に動画な文字が入っているなら動画と判断するようにした。
 ただしリリース直後のバージョンは最低限自分のパソコンにあった動画形式のファイルの取り込みと変換ができるように調整したにすぎないので、それ以外はFFmpegで変換可能動画ファイルであっても動画ファイルと判断されずに門前払いヨロシクと跳ねられていた。
 仕事も落ち着いて週末になり時間が取れたので、各種形式のファイルを集めてFfmpesyncを通してそれなりに変換できた拡張子の差分を追加したのがついさっき。
 ちなみに用意した中でダメはDV形式だった。音声は出たんだけどねー映像が真っ黒orz

 ちなみに動画判定はエンコード時にもう一つかけていて、それちらはMP4限定で間口をかなり狭く作っています。

※追記
 次のネタに各種変換していたら縦横サイズ自動判定にミスを見つけてコソット修正

2014年3月24日月曜日

BloggerをGoogle Chrome で編集したら、VBスクリプトが勝手に翻訳された件について 他、Ffmぺsync1.vbs今後について

ナンデヤロ~ ナンデヤロ。 まぁIEで編集したら回避できるし まーイイカ。

個人的には、Ffmぺsync1.vbs に現状考えうる全ての機能を盛り込む事が出来ました。
設定のファイルへのセーブ・ロードとかも考えなくも無かったのですが、必要性ないなーと。

「あの処理」までのVBScript (その1) 指定フォルダ内のアイテムのプロパティ情報を抜き出し Echo する。

 から始まった、Ffmpeg.exeのフロントエンドVBスクリプトですが、これ以上新規機能は終わり。後はバグ見つけたら修正とか、Ffmpesync1.vbsの各プロシージャの解説とかでお茶を濁してノンビリいきます。
 最後に、自分動画PC内の録画、エンコの総数をカウントしてみるとコーナッタ。これをFfmぺsyncで変換したらどれだけのサイズというか、さすがにどれくらいの時間かかるのやら。 パソコンやFfmpeg.exeの進化に期待するしかねーな。 というか10TBくらいのパーソナルドライブが出来たらいちいちFfmぺsyncで変換しなくてもいーんだがなw
 
 
 
 今度はJavaスクリプトいってみよーかなー

####開始#### #2014/03/24 6:37:57#
VBS実行パス:C:\Users\zeze\Desktop\ffmpesync1.vbs
"A:\" は 2 です。
ドライブの種類    :2
ファイルシステムの種類:NTFS
ドライブ全体の容量  :3725.9GB
ドライブの空き容量  :285.25GB
処理(元)パス:A:\
出力(先)パス:C:\Users\zeze
処理ログパス:C:\Users\zeze\.log
対象ファイル処理数計:16662
 1(未)処理ファイル数:16661(3522125.67MB)
 2(済)損壊ファイル数:※事前カウント対象外
 3(済)小大ファイル数:0(0MB)⇒0%(0MB)
 4(済)新旧ファイル数:0(0MB)⇒0%(0MB)
 5(済)処理ファイル数:1(234.5MB)⇒8.32%(19.52MB)
- - - - - - - - -
処理済(345計)進捗率:0.01%
対象外ファイル数:158
検索フォルダ数:951
- - - - - - - - -
形式別カウント(計:16662)
.mp4 :15600
.avi :890
.flv :84
.mpeg :80
.mpg :5
.wmv :2
.mpa :1
処理モード選択を選択を『キャンセル』しました。
####終了#### #2014/03/24 6:39:00#
####開始#### #2014/03/24 6:39:48#
VBS実行パス:C:\Users\zeze\Desktop\ffmpesync1.vbs
"B:\" は 2 です。
ドライブの種類    :2
ファイルシステムの種類:NTFS
ドライブ全体の容量  :3725.9GB
ドライブの空き容量  :1694.43GB
処理(元)パス:B:\
出力(先)パス:C:\Users\zeze
処理ログパス:C:\Users\zeze\.log
対象ファイル処理数計:8622
 1(未)処理ファイル数:8622(2079983.29MB)
 2(済)損壊ファイル数:※事前カウント対象外
 3(済)小大ファイル数:0(0MB)⇒0%(0MB)
 4(済)新旧ファイル数:0(0MB)⇒0%(0MB)
 5(済)処理ファイル数:0(0MB)⇒0%(0MB)
- - - - - - - - -
処理済(345計)進捗率:0%
対象外ファイル数:57
検索フォルダ数:271
- - - - - - - - -
形式別カウント(計:8622)
.mp4 :8587
.avi :29
.flv :5
.wmv :1
処理モード選択を選択を『キャンセル』しました。
####終了#### #2014/03/24 6:40:08#
####開始#### #2014/03/24 6:41:01#
VBS実行パス:C:\Users\zeze\Desktop\ffmpesync1.vbs
"S:\" は 2 です。
ドライブの種類    :2
ファイルシステムの種類:NTFS
ドライブ全体の容量  :2794.39GB
ドライブの空き容量  :207.62GB
処理(元)パス:S:\
出力(先)パス:C:\Users\zeze
処理ログパス:C:\Users\zeze\.log
対象ファイル処理数計:2003
 1(未)処理ファイル数:2003(2634750.62MB)
 2(済)損壊ファイル数:※事前カウント対象外
 3(済)小大ファイル数:0(0MB)⇒0%(0MB)
 4(済)新旧ファイル数:0(0MB)⇒0%(0MB)
 5(済)処理ファイル数:0(0MB)⇒0%(0MB)
- - - - - - - - -
処理済(345計)進捗率:0%
対象外ファイル数:1146
検索フォルダ数:162
- - - - - - - - -
形式別カウント(計:2003)
.mp4 :440
.flv :242
.avi :823
.m2ts :318
.ts :180
処理モード選択を選択を『キャンセル』しました。
####終了#### #2014/03/24 6:41:14#

Ffmぺsync ver.1  ffmpeg.exeを手軽に使うためのファイル同期風フロントエンドVBスクリプト 本編 (2014/4/8 update)

'FFMぺ同期Ver.1.0をffmpeg.exeを手軽に使うためのファイル同期風フロントエンドのVBスクリプト前説 より続き
'***Ffmぺsync ver.1.2 (C)是々録画 http://zezerokuga.blogspot.jp/
'***2014/4/8 Update
Option Explicit
Dim oWSSHEL , oWSFSO , oWSAPP , oWARGU , oIEAPP
Set oWSSHEL = WScript.CreateObject("WScript.Shell")
Set oWSFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set oWSAPP = WScript.CreateObject("Shell.Application")
Set oWARGU = WScript.Arguments
Set oIEAPP = Nothing
Const cIEREFRESH = 20
Const cMP4 = ".mp4" 
Const cNULL = ""
Dim cDC
cDC = Chr(34)
Const cF12345 = "12345"
Const cF1234 = "1234"
Dim vFP(6)
Const cP0 = 0
Const cP1 = 1
Const cP2 = 2
Const cP3 = 3
Const cP4 = 4
Const cP5 = 5
Const cDD1 = 0
Const cDD2 = 1
Dim iDETAILt(1),iDETAILb(1),iDETAILh(1),iDETAILf(1),iDETAILw(1)
Dim sDETAILt(1),sDETAILb(1),sDETAILh(1),sDETAILf(1),sDETAILw(1)
Dim vDETAILt(1),vDETAILb(1),vDETAILh(1),vDETAILf(1),vDETAILw(1),vDETAILs(1),vDETAILd(1),bDETAIL(1)
Const cF1 = 1
Const cF2 = 2
Const cF3 = 3
Const cF4 = 4
Const cF5 = 5
Const cF0 = 0
Dim iDC(6) , i1DS(6), i2DS(6)
Dim iPATHCOUNT 
Dim iITEMCOUNT , iITEMERROR , iIEREFRESH , i0CONVCOUNT , i0CONVERROR , i2CONVERROR
iITEMCOUNT = 0 : iITEMERROR = 0 : iIEREFRESH = 0 : i0CONVCOUNT = 0 : i0CONVERROR = 0 : i2CONVERROR = 0 
Dim rsLOGPRINT(50)
Dim iLOGPRINT
 iLOGPRINT = 0
Dim rsEXT(99)
Dim riEXT(99)
Dim iEXTMAX
 iEXTMAX = 0
Dim sFFMPeLOGPATH
Dim sMainLog
Dim bIECANCEL
 bIECANCEL = False
 sFFMPeLOGPATH = cNULL
 Call sGETLOG("####開始#### #" & Now() & "#")
 Call sGETLOG("VBS実行パス:" & WScript.Scriptfullname)
 If oWARGU.count > 0 Then
  sMainLog = sMAIN( oWARGU.item(0) )
 Else
  sMainLog = "引数が不正です。実行例:Cscript " & WScript.Scriptname & " 動画パス"
 End If
 Call bWriteLog(sFFMPeLOGPATH , cNULL)
 Call bWriteLog(sFFMPeLOGPATH , sGETLOG(sMainLog))
 Call bWriteLog(sFFMPeLOGPATH , cNULL)
 Call bWriteLog(sFFMPeLOGPATH , sGETLOG("####終了#### #" & Now() & "#"))
 if Not bIESHOW(True, WScript.Scriptname , sPUTLOG(False)) Then
  Call WScript.Echo( sPUTLOG(False) )
 End if
Set oWSFSO = Nothing
Set oWARGU = Nothing
Set oWSAPP = Nothing
Set oIEAPP = Nothing
Wscript.Quit

Function sMAIN( psParaItem0 )
Dim o1Dirve , o1Folder , o1File , o2Folder , o2File , s2File , s2Folder
Dim sInpRes , sInpPpt , sInpTtl , sInpDef , bInpRes , vInpHMS , vInpVF
Dim sLogItem1 , sLogItemN , sLogItemIO , sLogExec1 , sLogExec2
 Set o1Dirve = Nothing
 Set o1Folder = Nothing
 Set o1File = Nothing
 Set o2Folder = Nothing
 Set o2File = Nothing
 Call FfmpegParaReset
 iPATHCOUNT = 0 
 Call DogaCountSizeReset()
 Call ExtReset()
 Call DogaDetailReset(cDD1)
 Call DogaDetailReset(cDD2)
 Select case True
 Case oWSFSO.DriveExists( psParaItem0 ) 
  Set o1Folder = oWSFSO.GetFolder( psParaItem0 )
  Set o1Dirve = oWSFSO.GetDrive(psParaItem0) 
  sLogItem1 =cDC & psParaItem0 & cDC & " は " & o1Dirve.DriveType & " です。"
  sLogItemN = sSHOW_ItemDetails( o1Dirve )
 Case oWSFSO.FolderExists( psParaItem0 )
  Set o1Folder = oWSFSO.GetFolder( psParaItem0 )
  sLogItem1 = cDC & o1Folder.Name & cDC & " は " & o1Folder.Type & " です。"
  sLogItemN = sSHOW_ItemDetails( o1Folder )
 Case oWSFSO.FileExists( psParaItem0 )
  Set o1File = oWSFSO.GetFile( psParaItem0 )
  sLogItem1 = cDC & o1File.Name & cDC & " は " & o1File.Type  & " 。" & oWSFSO.GetExtensionName(psParaItem0)
  Call bDogaDetailIndex(cDD1 , Cstr(o1File.ParentFolder))
  If bDogaTypeExt( o1File ) or bDogaDetailValue(cDD1 , o1File) Then
   Set o1Folder = o1File.ParentFolder
   sLogItem1 = sLogItem1 & " で、動画ファイルです。"
  Else
   sLogItem1 = sLogItem1 & " で、非動画ファイルです。" 
  End if
  sLogItemN = sSHOW_ItemDetails( o1File )
 End Select
 Call sGETLOG(sLogItem1)
 Call sGETLOG(sLogItemN)
 if Not bIESHOW(True , WScript.Scriptname , sPUTLOG(False)) Then
  Call WScript.Echo(sPUTLOG(False))
 End if
 If Not o1Folder Is Nothing Then
  Set o2Folder = oWSAPP.BrowseForFolder(0, sLogItem1 & vbCrlf & "出力先フォルダを選択してください。『キャンセル』で中止します。", 0)
  If Not o2Folder Is Nothing Then
         If o2Folder = "デスクトップ" Then
    s2Folder = oWSSHEL.SpecialFolders("Desktop")
         Else
    s2Folder = o2Folder.Items.Item.Path
         End if
   If Not o1File is Nothing Then
    sFFMPeLOGPATH = oWSFSO.BuildPath(s2Folder , o1File.Name) & ".log"
   Else
    sFFMPeLOGPATH = oWSFSO.BuildPath(s2Folder , o1Folder.Name & ".log")
   End if
   If bWriteLog(sFFMPeLOGPATH , sPUTLOG(True)) Then
    sLogItemIO = "処理(元)パス:" & o1Folder.Path & vbCrlf & "出力(先)パス:" & s2Folder &  vbCrlf & "処理ログパス:" & sFFMPeLOGPATH
    Call bWriteLog(sFFMPeLOGPATH , cNULL)
    Call bWriteLog(sFFMPeLOGPATH , sGETLOG(sLogItemIO)) 
    Call bWriteLog(sFFMPeLOGPATH , cNULL)
    Call bWriteLog(sFFMPeLOGPATH , sGETLOG( sITEMCOUNT(o1Folder , s2Folder , o1File) ) )
    sLogExec1 = sGETLOG(cNULL)
    If Not bIECANCEL Then
     If Not o1File Is Nothing Then
      Call bWriteLog(sFFMPeLOGPATH , cNULL)
      Call bWriteLog(sFFMPeLOGPATH , sGETLOG( "処理(元)" & sDogaDetailEcho( cDD1 , o1File) ) )
      sLogExec1 = sGETLOG(cNULL)
      s2File = oWSFSO.BuildPath( s2Folder , o1File.Name )
      s2File = sConvertMovieName( o1File.Path , s2File)
      If oWSFSO.FileExists( s2File ) Then
       Call  bDogaDetailIndex(cDD2 , s2Folder)
       Set o2File = oWSFSO.GetFile( s2File )
       Call bDogaDetailValue(cDD2 , o2File)
       Call bWriteLog(sFFMPeLOGPATH , cNULL)
       Call bWriteLog(sFFMPeLOGPATH , sGETLOG("出力(先)" & sDogaDetailEcho(cDD2 , o2File)))
       sLogExec1 = sLogExec1 & vbCrlf & vbCrlf &  sGETLOG(cNULL)
      End if
     End if
     If Not bIESHOW(True , WScript.Scriptname , sPUTLOG(False)) Then
      Call bWriteLog(sFFMPeLOGPATH , cNULL)
      Call bWriteLog(sFFMPeLOGPATH , sGETLOG("IEが起動できないと、以降の停止処理に支障があります。ご注意ください。"))
      Call WScript.Echo(sPUTLOG(False))
     End if
      If Not o1File Is Nothing Then
       sInpTtl = "変換モードの入力"
       sInpDef = vGetConvertMode( )
       sInpPpt = sLogItem1 & vbCrlf& vbCrlf & sLogItemIO & vbCrlf & vbCrlf & sLogExec1
       sInpPpt = sInpPpt & vbCrlf 
       sInpPpt = sInpPpt & vbCrlf & "### " & sInpTtl & " ###" 
       sInpPpt = sInpPpt & vbCrlf & "__:品質" & sGetConvertCrf(0) & " (例:4 品質" & sGetConvertCrf(4) & "-" & sGetConvertSiz(4)
       sInpPpt = sInpPpt & vbCrlf & "1_:品質" & sGetConvertCrf(10) & " (例:11 品質" & sGetConvertCrf(11) & "-" & sGetConvertSiz(11)
       sInpPpt = sInpPpt & vbCrlf & "2_:品質" & sGetConvertCrf(20) & " (例:20 品質" & sGetConvertCrf(20) & "-" & sGetConvertSiz(20)
       sInpPpt = sInpPpt & vbCrlf & "3_:品質" & sGetConvertCrf(30) & " (例:33 品質" & sGetConvertCrf(33) & "-" & sGetConvertSiz(33)
       sInpPpt = sInpPpt & vbCrlf & "4_:品質" & sGetConvertCrf(40) & " (例:42 品質" & sGetConvertCrf(42) & "-" & sGetConvertSiz(42)
       sInpPpt = sInpPpt & vbCrlf & " (16:9)   , ( 4:3)"
       sInpPpt = sInpPpt & vbCrlf & " _1:" &  sGetConvertSiz(1) & " , _2:" &  sGetConvertSiz(2)
       sInpPpt = sInpPpt & vbCrlf & "  _3:" &  sGetConvertSiz(3) & " , _4:" &  sGetConvertSiz(4)
       sInpPpt = sInpPpt & vbCrlf & "   _5:" &  sGetConvertSiz(5) & " , _6:" &  sGetConvertSiz(6)
       sInpPpt = sInpPpt & vbCrlf & "    _7:" &  sGetConvertSiz(7) & " , _8:" &  sGetConvertSiz(8)
       sInpPpt = sInpPpt & vbCrlf & "     _9:" &  sGetConvertSiz(9) & " , _0:サイズ変更なし"
       sInpPpt = sInpPpt & vbCrlf & "※ _は指定数値 十位:品質値 一位:サイズ値"
       sInpPpt = sInpPpt & vbCrlf & "※  入力値の前二桁のみ有効"
       sInpPpt = sInpPpt & vbCrlf 
       sInpPpt = sInpPpt & vbCrlf & "-s:開始時間、-e:終了時間、-t:適用時間(e-s)"
       sInpPpt = sInpPpt & vbCrlf & "※時間指定は 秒 または 0:00:00(時:分:秒)"
       sInpPpt = sInpPpt & vbCrlf & "-vf:回転 transpose=1(右90°) 2(左90°)"
       sInpPpt = sInpPpt & vbCrlf 
       sInpPpt = sInpPpt & vbCrlf & "『キャンセル』で中止します。"
      Else
       sInpTtl = "処理モードの入力" 
       If (iDC(cF3) + iDC(cF4) + iDC(cF5)) = 0 Then
        sInpDef = cF12345
       Else
        sInpDef = cF1234
       End if
       sInpPpt = sLogItem1 & vbCrlf& vbCrlf & sLogItemIO & vbCrlf & vbCrlf & sLogExec1
       sInpPpt = sInpPpt & vbCrlf 
       sInpPpt = sInpPpt & vbCrlf & "### " & sInpTtl & " ###" 
       sInpPpt = sInpPpt & vbCrlf & " 1:未変換(ファイル(元)有(済)無)" 
       sInpPpt = sInpPpt & vbCrlf & " 2:損壊ファイル((済)ファイル損壊動画)" 
       sInpPpt = sInpPpt & vbCrlf & " 3:小大ファイル((済)ファイルが大きい)" 
       sInpPpt = sInpPpt & vbCrlf & " 4:新旧ファイル(更新日付(元)新(済)旧)" 
       sInpPpt = sInpPpt & vbCrlf & " 5:変換済(1,2,3,4 以外の状態)" 
       sInpPpt = sInpPpt & vbCrlf & " 0:変換対象指定(1,2,3,4,5)実行" 
       sInpPpt = sInpPpt & vbCrlf & "※ 指定に 0 が無ければ状態一覧出力"
       sInpPpt = sInpPpt & vbCrlf & "※ +:品質UP、-:圧縮UP (3Pointスライド)"
       sInpPpt = sInpPpt & vbCrlf 
       sInpPpt = sInpPpt & vbCrlf & "『キャンセル』で中止します。"
      End if
      sInpRes = InputBox( sInpPpt , sInpTtl , sInpDef )
      If sInpRes <> cNull Then
       vFP(cP0) = Trim(sInpRes)
       If Not o1File Is Nothing Then
        If Instr(vFP(cP0),"-s")>0 Then
         vInpHMS = InputBox( "-s 開始時間を入力してください。" , "開始時間の入力" , cNULL )
         vInpHMS = Trim(vInpHMS)
         vFP(cP1) = " -s" & vInpHMS
         if IsNumeric(vInpHMS) or IsDate(vInpHMS) Then
          if IsDate(vInpHMS) Then
          Else
           vInpHMS = DateAdd("s", vInpHMS , #0:00:00#)
          End if
          If Datediff("s" ,  #0:00:00# , vInpHMS) < 0 Then
           vInpHMS = cNULL
          Else
           vFP(cP3) = Hour(vInpHMS) & ":" & Right("0" & Minute(vInpHMS), 2) & ":" & Right("0" & Second(vInpHMS), 2)
          End if
         End if
        End if
        If Instr(vFP(cP0),"-e")>0 or Instr(vFP(cP0),"-t")>0  Then
         If Instr(vFP(cP0),"-e") > 0 Then
          vInpHMS = InputBox( "-e 終了時間を入力してください。" & vFP(cP1) , "終了時間の入力" , cNULL )
         Else
          vInpHMS = InputBox( "-t 適用時間を入力してください。" & vFP(cP1) , "適用時間の入力" , cNULL )
         End if
         vInpHMS = Trim(vInpHMS)
         If Instr(vFP(cP0),"-e") > 0 Then
          vFP(cP2) = " -e" & vInpHMS
         Else
          vFP(cP2) = " -t" & vInpHMS
         End if
         if IsNumeric(vInpHMS) or IsDate(vInpHMS) Then
          if IsDate(vInpHMS) Then
          Else
           vInpHMS = DateAdd("s", vInpHMS , #0:00:00#)
          End if
          If Datediff("s" ,  #0:00:00# , vInpHMS) < 0 Then
           vInpHMS = cNULL
          Else
           vInpHMS = Hour(vInpHMS) & ":" & Right("0" & Minute(vInpHMS), 2) & ":" & Right("0" & Second(vInpHMS), 2)
          End if
          If Instr(vFP(cP0),"-e")>0 Then
           If IsDate(vFP(cP3)) Then
            vInpHMS = Datediff("s" ,  vFP(cP3) , vInpHMS)
            if Not vInpHMS > 0 Then
             vInpHMS = cNULL
            Else
             vInpHMS = DateAdd("s", vInpHMS , #0:00:00#)
            End if
           End if
          End if
          vFP(cP4) = Trim(vInpHMS)
         End if
        End if
        If Instr(vFP(cP0),"-vf")>0 Then
         vInpVF = InputBox( "-vf transposeを入力してください。1(右90°) 2(左90°)" , "■■vfオプションの入力■■" , "transpose=1" )
         vFP(cP5) = Trim(vInpVF)
        End if
        vFP(cP0) = Trim(Left(vFP(cP0) , 2))
        bInpRes = (sGetConvertCrf(vFP(cP0))<>cNULL) and (sGetConvertSiz(vFP(cP0))<>cNULL)
        If bInpRes Then
         If Len(vFP(cP1))>0 then
          bInpRes = IsDate(vFP(cP3))
         End if
        End if
        If bInpRes Then
         If Len(vFP(cP2))>0 then
          bInpRes = IsDate(vFP(cP4))
         End if
        End if
        sInpRes = vFP(cP0) & vFP(cP1) & vFP(cP2) 
       Else
        bInpRes = Instr(vFP(cP0) , cF0) > 0  or Instr(vFP(cP0) , cF1) > 0 or Instr(vFP(cP0) , cF2) > 0 or Instr(vFP(cP0) , cF3) > 0 or Instr(vFP(cP0) , cF4) > 0 or Instr(vFP(cP0) , cF5) > 0
       End if
       If Not bInpRes Then
        sInpRes = vFP(cP0) & vFP(cP1) & vFP(cP2)
       End if
       If bInpRes Then
        Call bWriteLog(sFFMPeLOGPATH , cNULL)
        Call bWriteLog(sFFMPeLOGPATH , sGETLOG(sInpTtl & ":" & vFP(cP0) & vFP(cP1) & vFP(cP2) &  " 処理開始 ※中止は『×閉じる』"))
        Call bWriteLog(sFFMPeLOGPATH , cNULL)
        Call bWriteLog(sFFMPeLOGPATH , "No. 状態 (元)*パス/nファイル名 長さ(時間) 幅x高 ビットレート ファイルサイズ 更新日時 (済)パスファイル名 幅x高 ビットレート ファイルサイズ 更新日時 FFMpeg")
        iPATHCOUNT = 0 
        Call DogaCountSizeReset()
        Call ExtReset()
        sLogExec2 = sFFMPeEXEC(o1Folder , s2Folder , o1File , vFP , sFFMPeLOGPATH)
        If bIECANCEL Then
         sLogExec2 = sFFMPe_Echo(True)
         Call bWriteLog(sFFMPeLOGPATH , cNULL)
         Call bWriteLog(sFFMPeLOGPATH , sGETLOG(sLogExec2))
         sLogExec2 = "処理を中止しました。" 
        End if
       Else
        sLogExec2 = "不正な入力値です。変換を中止します:" & sInpRes 
       End if
      Else
       sLogExec2 = sInpTtl & "を選択を『キャンセル』しました。"
      End if
    Else
     sLogExec2 = "処理を中止しました。" 
    End if
   Else
    sLogExec2 = "書込み出来ません。指定が不適当です:" & s2Folder
   End if
  Else
   sLogExec2 = "出力先フォルダ設定 『キャンセル』しました。"
  End If
 Else
  If Not o1File Is Nothing Then
   sLogExec2 = sLogItem1 & "変換できません。"
  Else
   sLogExec2 = "引数が不正です。" & psParaItem0
  End if
 End if
 Set o1Dirve = Nothing
 Set o1Dirve = Nothing
 Set o1Folder = Nothing
 Set o1File = Nothing
 Set o2Folder = Nothing
sMAIN = sLogExec2
End Function

Function sITEMCOUNT(ByVal poSubFolder, Byval ps2Path, po1File)
Dim iErr , iSF , sTemp , b1File , s2File
Dim bFF1 , bFF2 , bFF3 , bFF4 , bFF5 
Dim oSSF , o1File , o2File
Dim sItemEcho 
 sItemEcho = cNULL
 If Right(poSubFolder.path ,2) = ":\" or Not ( (poSubFolder.Attributes and 2) = 2) or ( (poSubFolder.Attributes and 4) = 4 ) Then 
  Set oSSF = poSubFolder.SubFolders
  on error resume next
  iSF = oSSF.count
  iErr = Err.Number
  on error goto 0
  If iErr <> 0 Then
   Err.Clear
  Else
   For Each o1File In poSubFolder.Files
    If bIECANCEL Then
     Exit For
    End if
    Set o2File = Nothing
    If Not po1File is Nothing Then
     b1File = (po1File.Path = o1File.Path)
    Else
     b1File = True
    End if
    If b1File Then
     bFF1 = False
     bFF2 = False
     bFF3 = False
     bFF4 = False
     bFF5 = False
     If Not bDogaTypeExt( o1File ) Then
      iITEMERROR = iITEMERROR + 1
     Else
      iITEMCOUNT = iITEMCOUNT + 1
      s2File = oWSFSO.BuildPath( ps2Path , o1File.Name )
      s2File = sConvertMovieName( o1File.Path , s2File)
      bFF1 = Not oWSFSO.FileExists( s2File ) 
      If Not bFF1 Then
       Set o2File = oWSFSO.GetFile( s2File )
       bFF3 = (o1File.size < o2File.size) 
       bFF4 = (o1File.DateLastModified > o2File.DateLastModified) 
       bFF5 = (Not bFF2) and (Not bFF3) and (Not bFF4) 
      End if
      Set o2File = Nothing
      If bFF1 Then
       iDC(cF1) = iDC(cF1) + 1
       i1DS(cF1)  = i1DS(cF1)  + o1File.Size
      End if
      If bFF2 Then
       iDC(cF2) = iDC(cF2) + 1
       i1DS(cF2)  = i1DS(cF2)  + o1File.Size
      End if
      If oWSFSO.FileExists( s2File ) Then
       Set o2File = oWSFSO.GetFile( s2File )
       If bFF3 Then
        iDC(cF3) = iDC(cF3) + 1
        i1DS(cF3)  = i1DS(cF3) + o1File.Size
        i2DS(cF3)  = i2DS(cF3) + o2File.Size
       End if
       If bFF4 Then
        iDC(cF4) = iDC(cF4) + 1
        i1DS(cF4)  = i1DS(cF4) + o1File.Size
        i2DS(cF4)  = i2DS(cF4) + o2File.Size
       End if
       If bFF5 Then
        iDC(cF5) = iDC(cF5) + 1
        i1DS(cF5) = i1DS(cF5) + o1File.Size 
        i2DS(cF5) = i2DS(cF5) + o2File.Size 
       End if
      End if
      Call ExtCount(o1File.path)
      sItemEcho = sFFMPe_Echo(False) 
      If iITEMCOUNT Mod (cIEREFRESH * 10) = 1 Then
       If bIESHOW(False , WScript.Scriptname , sItemEcho & vbCrlf & vbCrlf & sPUTLOG(False)) Then
       Else
        If (iITEMCOUNT Mod (cIEREFRESH * 100) = 1) Then
         If vbOK =oWSSHEL.Popup ("File No." & iITEMCOUNT & " 以降の処理を中止しますか? 中止は5秒以内に【OK】ボタン" , 5 , "処理前カウント" , vbExclamation+vbOKOnly) Then
          bIECANCEL = True
          Set po1File = o2File
          Exit For
         Else
          Call bIESHOW(True , WScript.Scriptname , sItemEcho & vbCrlf & vbCrlf & sPUTLOG(False)) 
         End if
        End if
       End if
      End if
      If Not po1File is Nothing Then
       Exit For
      End if
     End if
    End if
   Next
   If (Not po1File is Nothing) and b1File  Then
   Else
    For Each oSSF In poSubFolder.SubFolders
     sTemp = Left( oSSF.Name , 1 )
     If sTemp ="." or sTemp ="$" Then
     Else
      iPATHCOUNT = iPATHCOUNT + 1
      sItemEcho = sITEMCOUNT(oSSF , (ps2Path & "\" & oSSF.Name) , po1File )
      If bIECANCEL Then
       Exit For
      End if
     End if 
    Next
   End if
  End if
 End If
 Set oSSF = Nothing
 Set o1File = Nothing
 Set o2File = Nothing
sITEMCOUNT = sItemEcho
End Function

Function sFFMPeEXEC(ByVal poSubFolder , Byval ps2Path, po1File , pvFP() , psLogPath)
Dim iErr , iSF , sTemp , iExtTxt , sExtTxt 
Dim oSSF , o1File , o2File
Dim sFF , bFF1 , bFF2 , bFF3 , bFF4 , bFF5 , bERROR0, bERROR2 , bFFMPegEXE
Dim iDogaNo , dFfmpe1 , b1File , s2File , bFilter ,iConvUpDn
Dim sEcho , sEcho1 , sEcho2 ,sConvMode , sffmpeRun , sFfmpeEcho 
Dim vFPFolder
Dim vFP(6)
 If Right(poSubFolder.path ,2) = ":\" or Not ( (poSubFolder.Attributes and 2) = 2) or ( (poSubFolder.Attributes and 4) = 4 ) Then 
  Set oSSF = poSubFolder.SubFolders
  on error resume next
  iSF = oSSF.count
  iErr = Err.Number
  on error goto 0
  If iErr <> 0 Then
   Err.Clear
  Else
   If iPATHCOUNT = 0 and iIEREFRESH = 0 Then
    Call bWriteLog(psLogPath , Right("0000" & iPATHCOUNT , 4) & "-*" & vbTab & poSubFolder.Path & vbTab & ps2Path)
   End if
   iConvUpDn = 0
   vFPFolder = pvFP(cP0)
   If Instr(vFPFolder,"+") Then
    vFPFolder = Replace(vFPFolder , "+" , cNULL)
    If Instr(vFPFolder,"-") Then
     vFPFolder = Replace(vFPFolder , "-" , cNULL)
    Else
     iConvUpDn = -10
    End if
   ElseIf Instr(vFPFolder,"-") Then
    vFPFolder = Replace(vFPFolder , "-" , cNULL)
    iConvUpDn = 10
   End if
   sExtTxt = Lcase(Trim(vFPFolder))
   iExtTxt = Len(sExtTxt)
   If iExtTxt > 8 Then
    iExtTxt = 8
   End if
   sExtTxt = Trim(Right(sExtTxt , iExtTxt))
   iExtTxt = Instr(sExtTxt , ".") 
   If iExtTxt > 1 Then
    iExtTxt = Len(sExtTxt) - iExtTxt + 1
    sExtTxt = Trim(Right(sExtTxt, iExtTxt))
   Else
    iExtTxt = 0
    sExtTxt = cNULL
   End if
   Call bDogaDetailIndex( cDD1 , poSubFolder.Path )
   If oWSFSO.FolderExists( ps2Path ) Then
    Call bDogaDetailIndex( cDD2 , ps2Path )
   Else
    Call DogaDetailIndexCopy(cDD2 , cDD1)
   End if
   For Each o1File In poSubFolder.Files
    If bIECANCEL Then
     Exit For
    End if
    iIEREFRESH = iIEREFRESH + 1
    Call DogaDetailReset(cDD1)
    Call DogaDetailReset(cDD2)
    Set o2File = Nothing
    If Not po1File is Nothing Then
     b1File = (po1File.Path = o1File.Path)
     sFF = cF12345 & cF0
    Else
     b1File = True
     sFF = pvFP(cP0)
    End if
    If b1File Then
     bFF1 = False
     bFF2 = False
     bFF3 = False
     bFF4 = False
     bFF5 = False
     sEcho = cNULL
     sEcho1 = cNULL
     sEcho2 = cNULL
     sffmpeRun = cNULL
     sFfmpeEcho = cNULL
     sConvMode  = cNULL
     if iExtTxt = 0 Then
      bFilter = True
     Else
      bFilter = (Lcase(Right(o1File.name, iExtTxt)) = sExtTxt)
     End if
     bERROR0 = Not bDogaTypeExt( o1File ) 
     bFFMPegEXE = False
     bERROR2 = False
     If Not bERROR0 and bFilter Then
      iDogaNo = iDogaNo + 1
      sEcho = Right("0000" & iPATHCOUNT , 4) & "-" & iDogaNo
      Call bDogaDetailValue( cDD1 , o1File) 
      sEcho1 = o1File.Name & vbTab & vDETAILt(cDD1) & vbTab & vDETAILw(cDD1) & "x" & vDETAILh(cDD1) & vbTab & vDETAILb(cDD1) & vbTab & sByte2MB(vDETAILs(cDD1)) & vbTab & vDETAILd(cDD1)
      s2File = oWSFSO.BuildPath( ps2Path , o1File.Name )
      s2File = sConvertMovieName( o1File.Path , s2File)
      bFF1 = Not oWSFSO.FileExists( s2File ) 
      If Not bFF1 Then
       Set o2File = oWSFSO.GetFile( s2File )
       bFF2 = (Not bDogaDetailValue(cDD2 , o2File)) 
       bFF3 = (vDETAILs(cDD1) < vDETAILs(cDD2)) 
       bFF4 = (vDETAILd(cDD1) > vDETAILd(cDD2)) 
       bFF5 = (Not bFF2) and (Not bFF3) and (Not bFF4) 
      End if
      bFF1 = bFF1 and (Instr(sFF , cF1) > 0)
      bFF2 = bFF2 and (Instr(sFF , cF2) > 0)
      bFF3 = bFF3 and (Instr(sFF , cF3) > 0)
      bFF4 = bFF4 and (Instr(sFF , cF4) > 0)
      bFF5 = bFF5 and (Instr(sFF , cF5) > 0)
      If bFF1 Then sConvMode = "未"
      If bFF2 Then sConvMode = "壊"
      If bFF3 Then sConvMode = "大"
      If bFF4 Then sConvMode = "旧"
      If bFF5 Then sConvMode = "○"
      Set o2File = Nothing
      If Instr(sFF , cF0) > 0 Then
       sFfmpeEcho = sFFMPe_Echo(True) & vbCrlf & vbCrlf & sPUTLOG(False)
       If po1File is Nothing Then
        sFfmpeEcho =  sDogaDetailEcho(cDD1 , o1File) & vbCrlf & vbCrlf & sFfmpeEcho
       End if
       sFfmpeEcho = sEcho1 & vbTab & s2File & vbCrlf & vbCrlf  & sFfmpeEcho
       If bFF1 or bFF2 or bFF3 or bFF4 or bFF5 Then
        If Not po1File is Nothing Then
         vFP(cP0) = Clng(pvFP(cP0))
         vFP(cP3) = pvFP(cP3)
         vFP(cP4) = pvFP(cP4)
         vFP(cP5) = pvFP(cP5)
        Else
         vFP(cP0) = vGetConvertMode( ) + iConvUpDn
        End if
        sffmpeRun = sRunffmpeExe(o1File , s2File , vFP)
        If sffmpeRun <> cNULL Then
         If oWSFSO.FolderExists( ps2Path ) Then
          sConvMode = sConvMode & sGetConvertCrf(vFP(cP0)) & "-" & sGetConvertSiz(vFP(cP0)) 
          Call bIESHOW(True , WScript.Scriptname , "【変換中】" & sffmpeRun & vbCrlf & sEcho & vbTab & sConvMode & vbTab & sFfmpeEcho )
          dFfmpe1 = Now()
          Call oWSSHEL.Run(sffmpeRun , 1 , true)
          If Not oWSFSO.FileExists( s2File ) Then
           bERROR0 = True
          Else
           bFFMPegEXE = True
           Set o2File = oWSFSO.GetFile( s2File )
           bERROR2 = (Not bDogaDetailValue(cDD2 , o2File)) 
           If bERROR2 Then
            If Not po1File is Nothing Then
             bIECANCEL = True
            Else
             If Not bIECANCEL Then
              If vbOK =oWSSHEL.Popup ("File No." & iIEREFRESH & "以降の処理を中止しますか? 中止は5秒以内に【OK】ボタン" , 5 , "変換中" , vbExclamation+vbOKOnly) Then
               Set po1File = o2File
               bIECANCEL = True
              End if
             End if
            End if
           End if
          End if
         Else
          sConvMode = sConvMode & "【出力先:" & ps2Path & "なし】"
         End if
        Else
         sConvMode = sConvMode & "【Ffmpeg.exeを確認してください】"
        End if
       End if
      End if
     End if
     If Not bERROR0 and bFilter Then
      Call DogaDetailReset(cDD2)
      bFF1 = Not oWSFSO.FileExists( s2File )
      bFF2 = False
      bFF3 = False
      bFF4 = False
      bFF5 = False
      If Not bFF1 Then
       Set o2File = oWSFSO.GetFile( s2File )
       bFF2 = (Not bDogaDetailValue(cDD2 , o2File)) 
       bFF3 = (vDETAILs(cDD1) < vDETAILs(cDD2)) 
       bFF4 = (vDETAILd(cDD1) > vDETAILd(cDD2)) 
       bFF5 = (Not bFF2) and (Not bFF3) and (Not bFF4) 
       If bFF3 Then
        sConvMode = sConvMode & "大" & Round( vDETAILs(cDD2) / vDETAILs(cDD1) * 100, 2) & "%"
        iDC(cF3) = iDC(cF3) + 1
        i1DS(cF3)  = i1DS(cF3) + vDETAILs(cDD1)
        i2DS(cF3)  = i2DS(cF3) + vDETAILs(cDD2)
       End if
       If bFF4 Then
        sConvMode = sConvMode & "旧" & Round( vDETAILs(cDD2) / vDETAILs(cDD1) * 100, 2) & "%"
        iDC(cF4) = iDC(cF4) + 1
        i1DS(cF4)  = i1DS(cF4) + vDETAILs(cDD1)
        i2DS(cF4)  = i2DS(cF4) + vDETAILs(cDD2)
       End if
       If bFF5 Then
        sConvMode = sConvMode & "○" & Round( vDETAILs(cDD2) / vDETAILs(cDD1) * 100, 2) & "%"
        iDC(cF5) = iDC(cF5) + 1
        i1DS(cF5) = i1DS(cF5) + vDETAILs(cDD1)
        i2DS(cF5) = i2DS(cF5) + vDETAILs(cDD2)
       End if
      End if
      If bFF1 Then
       sConvMode = sConvMode & "未"
       iDC(cF1) = iDC(cF1) + 1
       i1DS(cF1)  = i1DS(cF1) + vDETAILs(cDD1)
      End if
      If bFF2 Then
       sConvMode = sConvMode & "壊"
       iDC(cF2) = iDC(cF2) + 1
       i1DS(cF2)  = i1DS(cF2) + vDETAILs(cDD1)
      End if
      sEcho2 = vDETAILw(cDD2) & "x" & vDETAILh(cDD2) & vbTab & vDETAILb(cDD2) & vbTab & sByte2MB(vDETAILs(cDD2)) & vbTab & vDETAILd(cDD2)
      If bERROR2 Then
       i2CONVERROR = i2CONVERROR + 1
      End if
      sEcho2 = sEcho2 & vbTab & sffmpeRun
      Call ExtCount(o1File.path)
      i0CONVCOUNT = i0CONVCOUNT + 1
      sEcho = sEcho & vbTab & sConvMode & vbTab & sEcho1 & vbTab & s2File & vbTab & sEcho2
     Else
      i0CONVERROR = i0CONVERROR + 1
      sEcho = Right("*ERR0000" & i0CONVERROR , 8) & vbTab &  o1File.Name & "は動画形式でなく変換できません。"
     End if
     sFfmpeEcho = sFFMPe_Echo(True) 
     bFF1 = bFF1 and (Instr(sFF , cF1) > 0)
     bFF2 = bFF2 and (Instr(sFF , cF2) > 0)
     bFF3 = bFF3 and (Instr(sFF , cF3) > 0)
     bFF4 = bFF4 and (Instr(sFF , cF4) > 0)
     bFF5 = bFF5 and (Instr(sFF , cF5) > 0)
     If (bERROR0 or bFFMPegEXE or bFF1 or bFF2 or bFF3 or bFF4 or bFF5) and bFilter Then
      Call bWriteLog(psLogPath , sEcho)
     End if
     If  (iIEREFRESH Mod cIEREFRESH = 1) or bFFMPegEXE Then
      If bIESHOW(False , WScript.Scriptname , sFfmpeEcho & vbCrlf & vbCrlf & sPUTLOG(False)) Then
      Else
       If Not po1File is Nothing Then
       Else
        If Not bIECANCEL Then
         If vbOK =oWSSHEL.Popup ("File No." & iIEREFRESH & " 以降の処理を中止しますか? 中止は5秒以内に【OK】ボタン" , 5 , "処理中" , vbExclamation+vbOKOnly) Then
          bIECANCEL = True
          Set po1File = o2File
          Exit For
         Else
          Call bIESHOW(True , WScript.Scriptname , sFfmpeEcho & vbCrlf & vbCrlf & sPUTLOG(False)) 
         End if
        End if
       End if
      End if
     End if
     If Not po1File is Nothing Then
      Exit For
     End if
    End if
   Next
   If (Not po1File is Nothing) and b1File Then
   Else
    For Each oSSF In poSubFolder.SubFolders
     sTemp = Left( oSSF.Name , 1 )
     If sTemp ="." or sTemp ="$" Then
     Else
      iPATHCOUNT = iPATHCOUNT + 1
      Call bWriteLog(psLogPath , Right("0000" & iPATHCOUNT , 4) & "-*" & vbTab & oSSF.Path & vbTab & (ps2Path & "\" & oSSF.Name) )
      If Instr(sFF , cF0) > 0 Then
       If Not oWSFSO.FolderExists( (ps2Path & "\" & oSSF.Name) ) Then
        call oWSFSO.CreateFolder( (ps2Path & "\" & oSSF.Name) ) 
       End if
      End if
      sFfmpeEcho = sFFMPeEXEC(oSSF , (ps2Path & "\" & oSSF.Name) , po1File , pvFP , psLogPath)
      If bIECANCEL Then
       Exit For
      End if
     End if 
    Next
   End if
  End if
 End If
 Set oSSF = Nothing
 Set o1File = Nothing
 Set o2File = Nothing
sFFMPeEXEC = sFfmpeEcho
End Function

Function sFFMPe_Echo(pb2)
Dim dProgress
Dim dConvert
Dim sEcho , iNo , iSum
Dim iError
 dProgress = 0
 iSum = iDC(cF3) + iDC(cF4) + iDC(cF5)
 If Not pb2 Then
  If iSum > 0 and iITEMCOUNT >0 Then
   dProgress = iSum / iITEMCOUNT
  End if
  sEcho = "対象ファイル処理数計:" & iITEMCOUNT
 Else
  iError = 0
  If i0CONVERROR > iITEMERROR Then
   iError = i0CONVERROR - iITEMERROR
  End if
  If iSum > 0 and iITEMCOUNT >0 Then
   dProgress = iSum / (iITEMCOUNT - iError)
  End if
  sEcho = "対象ファイル処理位置:" & i0CONVCOUNT
 End if
 sEcho = sEcho & vbCrlf & " 1(未)処理ファイル数:" & iDC(cF1) & "(" & sByte2MB(i1DS(cF1)) & ")"
 If Not pb2 Then
  sEcho = sEcho & vbCrlf & " 2(済)損壊ファイル数:※事前カウント対象外" 
 Else
  sEcho = sEcho & vbCrlf & " 2(済)損壊ファイル数:" & iDC(cF2) & "(" & sByte2MB(i1DS(cF2)) & ")" 
 End if
 dConvert = 0
 If i1DS(cF3) > 0 and i2DS(cF3) >0 Then
  dConvert = i2DS(cF3) / i1DS(cF3)
 End if
 sEcho = sEcho & vbCrlf & " 3(済)小大ファイル数:" & iDC(cF3) & "(" & sByte2MB(i1DS(cF3)) & ")⇒" & Round( dConvert * 100, 2) & "%(" & sByte2MB(i2DS(cF3)) & ")"
 dConvert = 0
 If i1DS(cF4) > 0 and i2DS(cF4) >0 Then
  dConvert = i2DS(cF4) / i1DS(cF4)
 End if
 sEcho = sEcho & vbCrlf & " 4(済)新旧ファイル数:" & iDC(cF4) & "(" & sByte2MB(i1DS(cF4)) & ")⇒" & Round( dConvert * 100, 2) & "%(" & sByte2MB(i2DS(cF4)) & ")"
 dConvert = 0
 If i1DS(cF5) > 0 and i2DS(cF5) >0 Then
  dConvert = i2DS(cF5) / i1DS(cF5)
 End if
 sEcho = sEcho & vbCrlf & " 5(済)処理ファイル数:" & iDC(cF5) & "(" & sByte2MB(i1DS(cF5)) & ")⇒" & Round( dConvert * 100, 2) & "%(" & sByte2MB(i2DS(cF5)) & ")"
 sEcho = sEcho & vbCrlf & "- - - - - - - - - "
 sEcho = sEcho & vbCrlf & "処理済(345計)進捗率:" & Round( dProgress * 100, 2) & "%" 
 If i0CONVCOUNT = 0 Then
  sEcho = sEcho & vbCrlf & "対象外ファイル数:" & iITEMERROR 
 Else
  sEcho = sEcho & vbCrlf & "対象外ファイル数:" & i0CONVERROR 
 End if
 If i2CONVERROR > 0 Then
  sEcho = sEcho & vbCrlf & "処理実行エラー数:" & i2CONVERROR 
 End if
 sEcho = sEcho & vbCrlf & "検索フォルダ数:" & iPATHCOUNT
 sEcho = sEcho & vbCrlf & "- - - - - - - - - "
 If iEXTMAX > 0 Then
  sEcho = sEcho & vbCrlf & "形式別カウント(計:" & iExtSum() & ")"
  For iNo = 1 To iEXTMAX 
   sEcho = sEcho & vbCrlf & "." & rsEXT(iNo-1) & " :" & riEXT(iNo-1) 
  Next
 End if
sFFMPe_Echo = sEcho
End Function

Function sRunffmpeExe(po1Doga , ps2Doga1, pvFP())
Dim sExePath , sffmpeExe , sffmpePSet , sffmpeRun , sffmpeCrf , sffmpeSiz , sffmpeSt, sffmpeTt , sffmpeVF 
Dim sffmpeSet
 sExePath = oWSFSO.GetParentFolderName(WScript.Scriptfullname)
 sffmpeExe = oWSFSO.BuildPath(sExePath , "ffmpeg.exe")
 sffmpeCrf = sGetConvertCrf(pvFP(cP0))
 sffmpeSiz = sGetConvertSiz(pvFP(cP0))
 sffmpeSt = cNULL
 if IsDate(pvFP(cP3)) Then
  sffmpeSt = " -ss " & pvFP(cP3)
 End if
 sffmpeTt = cNULL
 if IsDate(pvFP(cP4)) Then
  sffmpeTt = " -t " & pvFP(cP4)
 End if
 sffmpeSet = " -coder 1 -refs 1 -flags +loop -partitions +parti4x4 -me_method hex -subq 1 -psy 0 -trellis 0 -8x8dct 0 -fast-pskip 1 -bf 3 -b-pyramid 2 -b_strategy 1 -direct-pred 1 -weightp 1 -weightb 1 -g 150 -keyint_min 1 -sc_threshold 40 -mbtree 0 -qcomp 1 "
 sffmpeVF = cNULL
 if Len(pvFP(cP5))>0 Then
  sffmpeVF = " -vf " & pvFP(cP5)
 End if
 If cMP4 = Lcase(Right(po1Doga.Path , 4)) Then
  sffmpeSet = sffmpeSet & " -vsync 2 -acodec copy "
 End if
 If oWSFSO.FileExists(sffmpeExe) and (sffmpeCrf <> cNULL) and (sffmpeSiz <> cNULL) Then
  sffmpeRun = cDC & sffmpeExe & cDC & sffmpeSt & " -i " & cDC & po1Doga.Path & cDC & sffmpeTt &  " -vcodec libx264 -crf " & sffmpeCrf & sGetConvertSizS(sffmpeSiz) & sffmpeSet & sffmpeVF & " -y " & cDC & ps2Doga1 & cDC
 Else
  sffmpeRun = cNULL
 End if
sRunffmpeExe = sffmpeRun
End Function

Function sGetConvertSizS(psSiz)
Dim sSizS
 sSizS = psSiz
 If Len( Trim( sSizS ) ) > 0 Then
  sSizS = " -s " & psSiz
 End if
sGetConvertSizS = sSizS
End Function

Function sGetConvertCrf(piMode)
Dim vMode , vCrf
 vCrf = cNULL
 vMode = Trim(piMode)
 If IsNumeric(vMode) Then
  vMode = CLng(vMode) \ 10
  Select Case vMode
  Case 0 : vCrf = 25
  Case 1 : vCrf = 28
  Case 2 : vCrf = 31
  Case 3 : vCrf = 34
  Case 4 : vCrf = 37
  End Select
 End if
sGetConvertCrf = vCrf
End Function

Function sGetConvertSiz(piMode)
Dim vMode , vSize
 vSize = cNULL
 vMode = Trim(piMode)
 If IsNumeric(vMode) Then
  vMode = CLng(vMode) Mod 10
  Select Case vMode
  Case 0 : vSize = " "
  Case 1 : vSize = "1280x720"
  Case 2 : vSize = "960x720"
  Case 3 : vSize = "960x540"
  Case 4 : vSize = "640x480"
  Case 5 : vSize = "854x480"
  Case 6 : vSize = "560x420"
  Case 7 : vSize = "640x360"
  Case 8 : vSize = "480x360"
  Case 9 : vSize = "427x240"
  End Select
 End if
sGetConvertSiz = vSize
End Function

Function vGetCrfSize(ipIdx , bEco)
Dim vCrfSize , iHeight , iWidth , iPixel , iBps
 vCrfSize = 10
 If IsNumeric(vDETAILw(ipIdx)) and IsNumeric(vDETAILh(ipIdx)) Then
  vCrfSize = 0
  iHeight = CLng(vDETAILh(ipIdx)) 
  iWidth = CLng(vDETAILw(ipIdx))
  iPixel = iHeight * iWidth
  iBps = Trim(Replace(Lcase(vDETAILb(ipIdx)) , "kbps", ""))
  if Asc(left(iBps,1)) > 59 Then
   iBps = Mid(iBps,2)
  End if
  If (iHeight / iWidth) < 0.6 or iHeight > 1000 and iBps > 5000 Then
   If iWidth => 1280 Then
    vCrfSize = 1
    If bEco Then
     vCrfSize = vCrfSize + 2
    End if
   ElseIf iWidth => 960 Then
    vCrfSize = 3
    If bEco Then
     vCrfSize = vCrfSize + 2
    End if
   ElseIf iWidth => 854 Then
    vCrfSize = 5
    If bEco Then
     vCrfSize = vCrfSize + 2
    End if
   ElseIf iWidth => 640 Then
    vCrfSize = 7
    If bEco Then
     vCrfSize = vCrfSize + 2
    End if
   ElseIf iWidth => 427 Then
    If bEco Then
     vCrfSize = vCrfSize + 10
    End if
   End if
  Else
   If iWidth => 960 Then
    vCrfSize = 2
    If bEco Then 
     vCrfSize = vCrfSize + 2
    End if
   ElseIf iWidth => 640 Then
    vCrfSize = 4
    If bEco Then
     vCrfSize = vCrfSize + 2
    End if
   ElseIf iWidth => 560 Then
    vCrfSize = 6
    If bEco Then
     vCrfSize = vCrfSize + 2
    End if
   ElseIf iWidth => 480 Then
    If bEco Then
     vCrfSize = vCrfSize + 10
    End if
   End if
  End if
  If iPixel => 500000 Then
   vCrfSize = vCrfSize + 30
  ElseIf iPixel => 200000 Then 
   vCrfSize = vCrfSize + 20
  Else
   vCrfSize = vCrfSize + 10
  End if
 End if
vGetCrfSize = vCrfSize
End Function

Function vGetConvertMode( )
Dim vGetConv, iLen
 vGetConv = vGetCrfSize(cDD1 , False)
 If vDETAILs(cDD1) < vDETAILs(cDD2) Then
  If bDETAIL(cDD1) and bDETAIL(cDD2) Then
   If (vGetConv mod 10) < ( vGetCrfSize(cDD2 , False) mod 10) Then
    vGetConv = vGetCrfSize( cDD2 , True)
   Else
    vGetConv = vGetCrfSize( cDD1 , True)
   End if
  ElseIf Not bDETAIL(cDD1) Then
   vGetConv = vGetCrfSize( cDD2 , True)
  Else
   vGetConv = vGetCrfSize( cDD1 , True)
  End if
 End if
vGetConvertMode = vGetConv
End Function

Function bDogaDetailIndex(pIdx , psFolder)
Dim oNsFolder , sPara , iEcho , iNull 
Dim iPara
 iPara = 7
 iEcho = 0
 Set oNsFolder = oWSAPP.Namespace( Cstr(psFolder) )
 Do
  With oNsFolder
   sPara = Cstr(.GetDetailsOf(.Items, iPara))
  End With

   If Len(sPara) > 0 Then
   Select Case sPara
   Case "長さ"
    iEcho = iEcho + 1
    iDETAILt(pIdx) = iPara
    sDETAILt(pIdx) = sPara
   Case "データ速度"
    iEcho = iEcho + 1
    iDETAILb(pIdx) = iPara
    sDETAILb(pIdx) = sPara
   Case "フレーム高"
    iEcho = iEcho + 1
    iDETAILh(pIdx) = iPara
    sDETAILh(pIdx) = sPara
   Case "フレーム率"
    iEcho = iEcho + 1
    iDETAILf(pIdx) = iPara
    sDETAILf(pIdx) = sPara
   Case "フレーム幅"
    iEcho = iEcho + 1
    iDETAILw(pIdx) = iPara
    sDETAILw(pIdx) = sPara
   End Select
   iNull = 0
  Else
   iNull =iNull + 1
  End if
  iPara = iPara + 1
 Loop Until (iNull = 3) or (iEcho = 5)
 Set oNsFolder = Nothing
bDogaDetailIndex = (iEcho = 5)
End Function

Sub DogaDetailReset(pIdx)
 bDETAIL(pIdx) = False
 vDETAILs(pIdx) = 0
 vDETAILd(pIdx) = cNULL
 vDETAILt(pIdx) = cNULL
 vDETAILb(pIdx) = cNULL
 vDETAILh(pIdx) = cNULL
 vDETAILf(pIdx) = cNULL
 vDETAILw(pIdx) = cNULL
End Sub

Function bDogaDetailValue(pIdx , poDoga)
 vDETAILs(pIdx) = poDoga.size
 vDETAILd(pIdx) = CDate(poDoga.DateLastModified)
 With oWSAPP.Namespace( Cstr( poDoga.ParentFolder ) )
  vDETAILt(pIdx) = .GetDetailsOf(.Items.Item(poDoga.Name) , iDETAILt(pIdx))
  vDETAILb(pIdx) = .GetDetailsOf(.Items.Item(poDoga.Name) , iDETAILb(pIdx))
  vDETAILh(pIdx) = .GetDetailsOf(.Items.Item(poDoga.Name) , iDETAILh(pIdx))
  vDETAILf(pIdx) = .GetDetailsOf(.Items.Item(poDoga.Name) , iDETAILf(pIdx))
  vDETAILw(pIdx) = .GetDetailsOf(.Items.Item(poDoga.Name) , iDETAILw(pIdx))
 End With
 bDETAIL(pIdx) = IsDate(Trim(vDETAILt(pIdx))) and IsNumeric(vDETAILh(pIdx)) and IsNumeric(vDETAILw(pIdx))
bDogaDetailValue = bDETAIL(pIdx)
End Function

Function sDogaDetailEcho( pIdx , poDoga)
Dim sEcho
 sEcho = "ファイル名:" & poDoga.Path
 sEcho = sEcho & vbCrlf & "  サイズ:" & sByte2MB(poDoga.Size)
 sEcho = sEcho & vbCrlf & sDETAILt(pIdx) & "(時間):" & vDETAILt(pIdx)
 sEcho = sEcho & vbCrlf & sDETAILb(pIdx) & ":" & vDETAILb(pIdx)
 sEcho = sEcho & vbCrlf & sDETAILh(pIdx) & ":" & vDETAILh(pIdx)
 sEcho = sEcho & vbCrlf & sDETAILf(pIdx) & ":" & vDETAILf(pIdx)
 sEcho = sEcho & vbCrlf & sDETAILw(pIdx) & ":" & vDETAILw(pIdx)
sDogaDetailEcho = sEcho
End Function

Sub DogaDetailIndexCopy(pi1 , pi0)
 iDETAILt(pi1) = iDETAILt(pi0)
 iDETAILb(pi1) = iDETAILb(pi0)
 iDETAILh(pi1) = iDETAILh(pi0)
 iDETAILf(pi1) = iDETAILf(pi0)
 iDETAILw(pi1) = iDETAILw(pi0)
End Sub

Function bDogaTypeExt( poItem )
Dim sType , bType , sExt , bExt, bExt1
 sType = Lcase(Trim(poItem.Type))
 bType  = Instr(sType , "ビデオ") > 0 or Instr(sType , "ムービー") > 0 
 sExt = Lcase(Trim(oWSFSO.GetExtensionName(poItem.path)))
 bExt = Instr(sExt , "av") > 0  or Instr(sExt , "as") > 0 or Instr(sExt , "wm") > 0 or Instr(sExt , "mp") > 0  or Instr(sExt , "mo") > 0  or Instr(sExt , "ts") > 0
 bExt1 = Instr(sExt , "rm") > 0 or Instr(sExt , "fl") > 0 or Instr(sExt , "sw") > 0 or  Instr(sExt , "ps") > 0 or Instr(sExt , "vo") > 0   or Instr(sExt , "og") > 0 
bDogaTypeExt = bType or bExt or bExt1
End Function

Function sSHOW_ItemDetails( poItem )
Dim oNsFolder , iErr , sEcho , iPara , sPara , vPara , iNull , sLine
 sEcho = cNULL
 iPara  = 0
 iNull = 0
 If Lcase(TypeName(poItem))= "drive" Then
  sEcho = "ドライブの種類    :" & poItem.DriveType
  If poItem.IsReady = True Then
   sEcho = sEcho & vbCrlf & "ファイルシステムの種類:" & poItem.FileSystem
   sEcho = sEcho & vbCrlf & "ドライブ全体の容量  :" & sByte2GB(poItem.TotalSize) 
   sEcho = sEcho & vbCrlf & "ドライブの空き容量  :" & sByte2GB(poItem.AvailableSpace) 
  Else
   sEcho = sEcho & vbCrlf & "ドライブは使えません。"
  End If
 Else
  Set oNsFolder = oWSAPP.Namespace(Cstr(poItem.ParentFolder))
  Do
   With oNsFolder
    sPara = .GetDetailsOf(.Items, iPara)
    vPara = .GetDetailsOf(.Items.Item(poItem.Name), iPara)
   End With
   If Len(sPara) > 0 Then
    If Len(vPara) > 0 Then
     If sEcho = cNULL Then
      sLine = cNULL 
     Else
      sLine = sEcho & vbCrlf
     End if
     sEcho = sLine & Right("0000" & iPara,4) & " " & sPara & vbTab & vPara
    End if
    iNull = 0
   Else
    iNull =iNull + 1
   End if
   iPara = iPara + 1
  Loop Until (iNull = 3) 
 End If
 Set oNsFolder = Nothing
sSHOW_ItemDetails = sEcho
End Function

Function sConvertMovieName( ps1Doga , ps2File)
Dim sRet2File
 sRet2File = ps2File
 If Lcase(ps1Doga) = Lcase(ps2File) Then
  sRet2File = ps2File & cMP4
 Else
  If Lcase( Right( ps1Doga , 4)) <> cMP4 then
   sRet2File = ps2File & cMP4
  End if
 End if
sConvertMovieName = sRet2File
End Function 

Function bIESHOW(bRe , psTitle , psBody)
Dim iErr
Dim idx
 iErr = 0
 on error resume next
 If bRe Then
  If oIEAPP Is Nothing Then
   Set oIEAPP = CreateObject("InternetExplorer.Application")
   iErr = Err.Number
   If iErr = 0 Then
    With oIEAPP
     .Visible = False
     .Left = 100
     .Top = 200
     .Width = 500
     .Height = 800
    End With
   End if
  End if
 End if
 If iErr = 0 Then
  If Not oIEAPP Is Nothing Then
   With oIEAPP
    .Navigate "about:blank"
    .Document.Write vbCrlf & " "
    .Document.Write vbCrlf & " "
    .Document.Write vbCrlf & " "
    .Document.Write vbCrlf & " "
    .Document.Write vbCrlf & " "
    .Document.Write vbCrlf & "<html>"
    .Document.Write vbCrlf & "<head><title>" & psTitle & "</title></head>"
    .Document.Write vbCrlf & "<body><pre>"
    .Document.Write vbCrlf & psBody
    .Document.Write vbCrlf & "</pre></body>"
    .Document.Write vbCrlf & "</html>"
    .Document.Write vbCrlf 
    .Visible = True
          .Refresh
   End With
  End if
  iErr = Err.Number
 End if
 on error goto 0
 If iErr <> 0 Then
  Err.Clear
  Set oIEAPP = Nothing
 End if
bIESHOW = (Not oIEAPP Is Nothing)
End Function

Function bWriteLog(psLogPath , psLog)
On Error Resume Next
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim oLog
 Set oLog = oWSFSO.OpenTextFile(psLogPath , ForAppending ,True,True)
 Call oLog.WriteLine(psLog)
 Call oLog.Close()
 Set oLog = Nothing
 If Err.Number <> 0 Then
  Err.Clear
  bWriteLog = False
 Else
  bWriteLog = True
 End If
On Error Goto 0
End Function

Function sGETLOG(psLog)
 If Len(psLog)=0 Then
  psLog = rsLOGPRINT(iLOGPRINT)
 Else
  rsLOGPRINT(iLOGPRINT) = psLog
  iLOGPRINT = iLOGPRINT + 1
 End if
sGETLOG = psLog
End Function

Function sPUTLOG(pbUp)
Dim idx
Dim sLog
 sLog = cNULL
 sLog = rsLOGPRINT(0) 
 For idx = 1 To iLOGPRINT - 1
  If pbUp = True Then
   sLog = sLog & vbCrlf & vbCrlf & rsLOGPRINT(idx) 
  Else
   sLog = rsLOGPRINT(idx) & vbCrlf & vbCrlf & sLog 
  End if
 Next
sPUTLOG = sLog 
End Function

Sub ExtCount(psFile)
Dim idx , sExt
 sExt =  Lcase(Trim(oWSFSO.GetExtensionName(psFile)))
 For idx = 0 To iEXTMAX
  If Len(rsEXT(idx)) > 0 and rsEXT(idx) = sExt Then
   riEXT(idx) = riEXT(idx) + 1
   Exit for
  Else
   If idx = iEXTMAX Then
    rsEXT(idx) = sExt
    riEXT(idx) = 1
    iEXTMAX = idx + 1
   End if
  End if
 Next
End Sub

Sub ExtReset()
Dim idx 
 For idx = 0 To iEXTMAX
  rsEXT(idx) = cNULL
  riEXT(idx) = 0
 Next
 iEXTMAX = 0
End Sub

Function iExtSum()
Dim idx 
Dim iSum
 iSum = 0
 For idx = 0 To iEXTMAX
  iSum = iSum + riEXT(idx)
 Next
iExtSum = iSum
End Function

Function sByte2MB(puByte)
 sByte2MB = Round(puByte / 1024^2, 2) & "MB"
End Function

Function sByte2GB(puByte)
 sByte2GB = Round(puByte / 1024^3, 2) & "GB"
End Function

Sub DogaCountSizeReset()
Dim idx 
 For idx = cF1 To cF5
  iDC(idx) = 0 
  i1DS(idx) = 0 
  i2DS(idx) = 0
 Next
End Sub

Sub FfmpegParaReset()
Dim idx 
 For idx = cP0 To cP5
  vFP(idx) = cNULL 
 Next
End Sub