ラベル エンコード の投稿を表示しています。 すべての投稿を表示
ラベル エンコード の投稿を表示しています。 すべての投稿を表示

2017年1月1日日曜日

「ffmpeg5sEnc.bat」 を本保存用に、一手間かけて時間範囲指定追加。 ffmpeg5st.bat(修正) と ffmpeg5call.bat

 新年あけましておめでとうございます。今年もだらだらと録画ネタを中心に忘却録代わりに更新していこうと思います。

 去年の末に作った「ffmpeg5sEnc.bat」。自分的には結構な頻度で使ってまして、そうなると普段メインとしているAviutl+x265guiExと比べてしまうわけです。

 Aviutl+x265guiEx 利点)リサイズ・クリッピングなど細かい設定が可能で綺麗。 欠点)手間がかかる。
 ffmpeg5s.bat  利点)ドラッグ&ドロップで気軽に実行 欠点)細かい設定は手間。 音量の最大化手順どーしよ
 Aviutl+x265guiEx・ffmpeg5s.bat 画質は品質を揃えたらほぼ同じ

 上下左右のクリッピングと音量の最大化さえ割り切れば、あとは品質と連続実行で自分の中では割り切りOKな感じなんですよね。

 現状、アニメのエンコード環境はAviutl+x265guiEx 固定ですが、エンコードまでのバッチ処理の準備に結構時間かかるため、マシンが停止してる時間が結構あるんです。 対してドキュメンタリーなどはイチイチAviutl+x265guiEx を使うの手間だなーな感じになってまして結構大量なファイルがテラ単位でHDDの肥しになってましてイイ加減に掃除したいなと。
 仕事が正月休みに入ったため、「ffmpeg5sEnc.bat」をもう少し改良して手軽に保存用エンコードに使えないかと考えてみました。

 「ffmpeg5sEnc.bat」は圧縮優先品質28となってるため、何度か実行と確認を繰り返して品質24に。 それと前後のCM部分をカットできるように開始時間と終了時間でエンコード範囲を指定できるようにしました。 これによりドラッグ&ドロップで即実行とはいかなくなってます。


 実行環境は①ffmpeg.exe、②ffmpeg5call.bat、③ffmpeg5st.bat を全て同じフォルダに置きます。 

 それと動画ファイルのエンコード範囲(開始時刻・終了時刻)を調べるプレイヤーが必要ですね。 自分はVLCなど使ってます。 「ツール-メディア情報」のロケーションから再生ファイルのフルパスがコピペできるので、バッチファイルの更新にも便利です。

ffmpeg.exe http://ffmpeg.org/download.html よりffmpegのwindows-buildを入手してバッチと同じ場所に展開しておく。


ffmpeg5call.bat。。"ffmpeg5call.bat"で保存しておく。メインエンコードバッチの"ffmpeg5st.bat"を呼びます。バッチ実行中でも編集可能なので、実行しながらどんどん追加します。

 SET BP=%~dp0
 rem call %BP%ffmpeg5st.bat "エンコード元ファイル名" , 開始時刻 , 終了時刻

 ex.


ffmpeg5st.bat。"ffmpeg5st.bat"で保存しておく。

@echo off
rem 2016/12/31 ffmpeg5st.bat
rem 2016/1/1 2,3引数の存在チェックを追加
rem 
rem   H.265エンコードサポートバッチファイル
rem   エンコード済みファイルは指定パスにファイル名.mkvで出力
rem   開始~終了時刻の範囲エンコード 自分なりに実写モノ保存品質
rem 
rem 実行環境
rem   http://ffmpeg.org/download.html より
rem     ffmpegのwindows-buildを入手して当バッチと同じ場所に展開しておく。
rem 
rem IN
rem   ファイル名
rem Ex.
rem Ex.
rem   call ffmpeg5st.bat "エンコード元ファイル名" , 開始時刻 , 終了時刻
rem                     ※"で囲うのはファイル名切れ防止"
rem                     ※開始・終了時刻フォーマット 00:00:00 (省略だと全指定)
rem                     ※終了時刻のみ指定したい場合は、開始時刻に 0 を入れてください
rem 
rem 内部記述
rem  BATFILE 実行パス ※原則変更しないでください
rem  INPFILE 入力ファイル名 ※原則変更しないでください
rem  FFMPEXE FFMPEG.EXE フルパス ※原則変更しないでください
rem  STATIME 開始時刻 ※原則変更しないでください
rem  EMDTIME 終了時刻 ※原則変更しないでください
rem  FFMP265 H.265 エンコードパラメータ
rem  OUTFILE 出力ファイル名 ※存在するフォルダを指定
rem  
rem 注意
rem  ファイルにANSI以外の文字や画像が入ってる場合は動かない可能性があります。
rem  該当文字や画像を削除または変更して再実行してみてください、。  
rem  
rem ****ffmpeg h.265パラメータ****
SET BATFILE=%~dp0
SET INPFILE="%~f1"
SET FFMPEXE=%BATFILE%ffmpeg -i
SET FFMP265=-c:v libx265 -preset medium -crf 24 -s 1280x720 -c:a aac -b:a 128k
SET OUTFILE="C:\!video\%~nx1.mkv"

IF "%2" EQU "" (
    SET STATIME=%2
) ELSE (
    SET STATIME=-ss %2
)
IF "%3" EQU "" (
    SET EMDTIME=%3
) ELSE (
    SET EMDTIME=-to %3
)

rem ****ffmpeg h.265エンコード実行****
%FFMPEXE% %INPFILE% %FFMP265% %STATIME% %EMDTIME% %OUTFILE%

2016年8月3日水曜日

俺的テレビ番組【本編】のみAviutl+x265guiExエンコード手順

 アナログ放送な頃は番組を録画したら本編のみ編集してテープのみ保存なんてのは、凝り性のおとーさん達の間でよくされてました。
 デジタル放送になってからはコピー制御が入り、例え無料の地上波放送で自分で楽しむ分であってもコピー制御されたファイルを解除して自由に編集する事はバレたら犯罪扱いとなってしまいました。 犯罪の定義がどーたらこーたらはココではテーマではないので置いときます。 アースソフトのPTxはソレを微妙に?回避しつつパソコンに放送を保存するパソコン用チューナーです。 基本的に自分のエンコード元となるソースファイル半分はPT2です。

 先日、金ロでバケモノの子が嬉恥ずかしノーカットで放送されました。もちろんPT2によりファイル保存しました。 ですが、、、、、





 放送時間2時間19分でファイルサイズが19GB。 しかも本編以外の映像により先頭と末尾を除くと9つに分断されています。 これは調べると合計約25分で全体のほぼ20%にあたります。 本編のみ抜き出しても19GBから15GBに小さくはなりますが、まだ大きいといえます。
 映像や音声の品質を出来るだけそのままにファイルファイルサイズを小さくする処理がエンコードとなります。ここでは番組本編【Aviutl+x265guiExエンコード】俺的編集手順2016年版です。 
 ※音声の特定チャンネル指定の手順とかは知りません。

 「最終的に保存(エンコード)する際に本編のみにする」方法はいくつかあります。
 ※は中の人の個人的感想です。

 1.エンコード前にカット(TSファイル編集で本編を取り出してからエンコード)
   ※できなくはないが時間もかかるメンドクサイ。作業領域も大きく手間。

 2.エンコード後にカット(全体エンコードしてから本編の取り出す)
   ※H.265なので今は使えないし、使えても激重になりそう?

3.分割している本編のみエンコード
   ※イイかもしれないが細切れになってるのが気に入らないので除外。

4. 3.後に連結し1ファイル
   ※映像と音声がズレる可能性が高い。手間もかかるので最終手段

 5.DGIndexにて本編プロジェクトファイルを作成してAviutl連結x265guiExエンコード
   ※MPEG2を使い始めて今も昔もコレ

 とは言ってもヤッパリメンドクサイのでよほどじゃないと使わない。 エンコードを始めた頃はエンコードするタイトルも少なかったため前説OP本編A本編BEDエンドカードを抜き出して1ファイル化なんて事をしてた時期もありましたが、今はタイトル数が多いため、大抵はザックリと先頭と末尾を指定してエンコードが殆どです。
 PTxで録画した際の元ソースブロックが1つ(先頭と末尾指定)なエンコードはBonTsDemuxVer.1.10を使いDemux(m2v+wav)にしてからAviutl+x265guiExエンコードしています。
 指定が複数ブロックになる場合は幾つかの手順を入れてから、Aviutl+x265guiExエンコードをしています。


 本編(複数指定)を抜き出してエンコードする手順。

 1.映像と音声のズレを全体的に均一的(気にならないレベル)に揃える
   VLC media player 0.9.9 Grishenko の「メディア-変換/保存する」にて、MPEG-TS形式をMPEG-PS形式に、オーディオはMPEG Audioにして保存する。 VLCでもこれ以降?のバージョンではなぜか上手くいった事がないんだよねー。ナンデダロ。なんでこの手順では0.9.9が必須のバージョンなってます。

 変換した MPEG-PSファイル。以後の処理はこれを使います。 

 2.必要範囲を指定してd2vプロジェクトファイルとmp2音声の作成
   DGIndex(日本語化済みの最新版でいいかと)に1.で作成したMPEG-PSファイルを読み込んで必要な範囲のみ指定してプロジェクトファイルを作成しいく。ファイル名の末尾は0から続く連番でいいかと。分割が多くなりそうなら00、01~とか。 
 注意点としてはDGIndex指定ではエンコード後の視聴時に、範囲指定のすぐ外側で指定外のコマが入ってたり、逆に入ってないのに気が付いたりする場合が多々ある。 この辺りはしゃーないと割り切り、余裕のある指定を心がけるしかない。
本編のみ範囲指定で作成したプロジェクトファイル。9つ出来た。

 3.mp2音声のみ順番に連結して1つのファイルにする。
  UniteMove v2.11を使用してmp2音声ファイルを順に連結して一つにする。長さ1:55:46

 4.3.で連結したmp2ファイルのみwev音声化。
   使うソフトは、ぶっちゃけ無圧縮wevに変換できるなら何でもいいと思う。
  一応、自分が使ってるソフトを紹介すると、以前購入した「Xilisoft 究極動画変換」ってのをずっと使用している。 手軽に複数ファイル指定してマシンの状態に合わせて変換実行してくれるのがイイ。
 連結したmp2ファイルを変換して出来たwavファイルのサイズは1.19GB

 5.1.Aviutlに.d2vファイルを「ファイル-追加読み込みにて順次追加する。
   .d2vファイル追加時の表示形式は”一覧”か”詳細”だと見やすくて間違いない気がする。それと追加読み込みにショートカットを宛てておくと素早く追加できるかも。もちろん3.で連結した音声の順番と一致する事が重要。

 5.2..wavファイルを「ファイル-音声読み込み」にて読み込む
   これで順次追加した映像に対応した音声があたる。


 6.3.末尾に移動し「音声の位置調整(無効)」にしてオーディオ波形を確認する。
   音声とのズレが数ミリ秒なら問題なし。 大きく映像と音声の長さがズレていたら別の方法を考える。その辺りになるとソースの状況に応じで試行錯誤となるのでここでは述べません。各自頑張ってください。 
 Aviutl「音声の位置調整」は、ソースの状態によって変わってきます。 今回は、.d2v作成時のmp2ファイル名のズレ表示は-11~-23となっていて、全て「音声の位置調整」1メモリ-33ms以下なので調整ナシとします。 

 ここ以降の設定は通常のAviutl+x265guiExエンコードとなるので割愛します。

 エンコード後は1.4GBと偶然にも元ファイルのほぼ1/10となりました(過去エンコード済みファイルをコピー)
 作成のタイムスタンプを見ると、大体2時間半でした。

変換前

変換後


 蛇足ですが、1Passエンコードなので、エンコード後のファイルサイズはソースの必要ビットレートによって大きく変わってきます。 ちなみに実写コンサート系になると必要ビットレートが大きくなってくるので1kではファイルサイズがあまり変わらないので1280x720とかに解像度を落としてエンコードしています。

2016年7月29日金曜日

AviUtl + x265guiEx がイロンナ意味でよかったのでメインエンコーダーに変更

 AviUtl + x264guiEx がPCの掃除をした4月末あたりから高負荷時に再起動など非常に不安定になってしまい解決に試行錯誤してまして、久々に市販エンコーダーとかにも手を出して確認してみましたが、結局AviUtl + x265guiEx となりました。

 日常エンコードにおいて大事なのは、画質・エンコード時間・ファイルサイズ・手間・安定度妥協点ってとこでしょうか。
 AviUtl + x264guiExの高画質2Passエンコードは画質とファイルサイズに優れていましたが、エンコード時間がソース再生時間のほぼ倍かかる点がイマイチでした。
 AviUtl + x265guiExの画質はノイズを上手く誤魔化している感じでほぼ同等。エンコード時間はプロファイル”バランス”1Passでほぼソース再生時間。ただしファイルサイズは、ソースの必要ビットレートに大きくく左右されるため実写に近いソースは大きくなる傾向にあるのですが、まぁ許容範囲内と判断しました。

 ただ現状ではH.265はH.264やMPEG1や2と違い作成後の編集がかなり難しいのが問題でしょうか。これは時間が解決してくれるでしょう。

 パラメータはプロファイル”バランス”をそのまま使用。マシンパワーが自信ないとか画質が妥協できるなら”高速”もアリ。 高画質は、、、、まー頑張ってください。


 実行中のタスクの様子。1Passなんで終始こんな感じ。


【エンコード前】保存ソース(1440x1080)を4kに拡大

【エンコード後】AviUtl + x265guiEx (1920x1080)を4kに拡大
 ぱっと見わかりづらいんですが、AviUtl + x265guiEx はオリジナルのノイジーなとこを上手く誤魔化していると思います。

 追加 H.265版 MBS版 BS11版 サイズ比較
個人的目標としてはFull HDサイズの10分の1なんで、まーこんなものかと。


2014年11月26日水曜日

SONY HDR-AS100V 1秒毎連続撮影600枚連結タイムプラス(もといコマ送り)動画 の試作



【GIGAZIN】のGoProでナイトラプスムービーを作る記事に触発され、HDR-AS100V でタイムプラスな、、、もといコマ送り動画を試作してみました。

①HDR-AS100V のインターバル静止画記録モード を1秒設定にして撮影。
②1フォルダに連結するJPGファイルを連番で用意する。今回は10分間600枚(441 MB)。
③Aviutlにて一気に読み込ませ連結し、30fpsのMP4出力(65.5 MB)作成。

 10分を20秒で一気見です。ただYouTubeに上げたことで劣化シテシマッタカモ
 オリジナルは綺麗なんですけどねー と言うわけでコチラでDLできます。

 バラバラJPGファイルより一つにまとめたら15%縮小なるし、画質もそんなに変わらないし、こんな記録保存もアリかも。

Aviutlの環境作成方法は過去書いた記事を見てください。
是々録画:【話のネタに】 Dell Venue 8 pro でAviutlエンコード 【環境作成】

、、、、なんか忘れて~ あぁそうだ。今回はHDR-AS100Vのカブ用自作固定台(零号)のテストも兼ねてたんだっけ。 一応狙い通りに上手く固定されてるっぼい。今回の使用で気が付いた点がいくつかあるから、その点を改良しないとなー。 まぁなんにしてもメガストックに部品買ってからか。

2014年4月8日火曜日

Ffmぺsync ver.1 「回転(transpose)」の対応

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

 必要に迫られて回転機能を追加した。 かなりヤッツケ仕事なんだけどねー。

 ↓がDell Venue8 pro を縦にして首からさげて、Win8.1プレインストールのカメラで撮影した動画の一コマ。 静止画は縦横の回転に対応してたのに、動画が横固定ダトハorz 

 回転すればいいのは判るが、タスケテーグーグルせんせーい!

 [ipad][ffmpeg] iPad2を縦持ちして撮影した動画を90度回転してFLVに変換する方法Add Star
 > ffmpeg -vf "transpose=1" -i xxxx.MOV -sameq xxxx.FLV

 「 -vf "transpose=1" 」の部分を組み込んで早速実行!
  呼び出し方は時間オプションと同じような感じで"-vf"。 開始時間、適用時間の後に-vfオプションの設定ダイアログが出る。


  時計方向90度なら"transpose=1"のまま。 反対なら"transpose=2"にする。
 実行結果 回転成功!


 ちなみにこれをAviutlに通すとコーナル。 縦横比率はそのままに、再生時に補正して縦長に見せてるのかな。

 あらためてネットを調べ直すと"transpose"の設定値はまだあった。
  0=90反時計方向と垂直方向に反転します(デフォルト) 
  1=90時計回り 
  2=90反時計回り 
  3=90時計回り方向と垂直方向に反転

 0とか3とか、俺の頭じゃ理解できない。後これ以外にも色々設定オプションが存在するみたいだが、ひとまずこれ以上はいいか。

 追記
  -vf オプションはFfmpeg.exeの作成状況によってはエラーが出る場合があります。 その際は「Zeranoe FFmpeg 」の該当OS版を使用してみてください。

2014年4月3日木曜日

Ffmぺsync ver.1.0 プロシージャ解説4 Ffmpeg.exe実行文の生成

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

 品質と縦横のプロシージャと続いたし、Ffmpeg.exeの実行文を生成する箇所も説明しとこうと思う。
 ffmpesync.vbsの一千行を超えるコードは、全てコノ部分の為にあるとも言える。

ffmpesync.vbsではffmpeg.exe実行文を大きく四つに分けて取り扱っている。
 ①ffmpeg.exeパス ⇒ WScript.Scriptfullnameから取得
 ②元動画ファイルパス ⇒ 引数po1DogaオブジェクトのPathプロパティから取得
 ③出力先ファイルパス ⇒ 引数ps2Doga1より取得
 ④パラメータ(品質・縦横・音声・他) 引数piConvModeより、他は固定パラメータとして補完。

 ④を修正する事でビデオ系のパラメータを変更できる。 ネットに散在している情報を元に試行錯誤してみるのも面白いかもしれない。以下のコードは掲載コードではなく、コメント削除前のコードとなります。

'################################################
'ffmpeg.exe文 作成
'
'IN
' po1Doga ②元動画ファイル オブジェクト
' ps2Doga1 ③出力先動画ファイルパス
' piConvMode 変換モード
'
'Return
' ffmpeg.exe文 環境が整ってなければcNULL
'
Function sRunffmpeExe(po1Doga , ps2Doga1, piConvMode)
Dim sExePath , sffmpeExe , sffmpePSet , sffmpeRun , sffmpeCrf , sffmpeSiz 
Dim sffmpeSet

'実行vbsファイルのパス取得
sExePath = oWSFSO.GetParentFolderName(WScript.Scriptfullname)

'①ffmpeの実行パスファイル取得
sffmpeExe = oWSFSO.BuildPath(sExePath , "ffmpeg.exe")

'品質値取得
sffmpeCrf = sGetConvertCrf(piConvMode)
'縦横値取得
sffmpeSiz = sGetConvertSiz(piConvMode)
'***④他パラメータの修正、追加はここを書き換える
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 "

'音声トラックのコピー処理はMP4のみ許可
If cFFMPEG_MP4 = Lcase(Right(po1Doga.Path , 4)) Then
sffmpeSet = sffmpeSet & " -vsync 2 -acodec copy "
End if

'ffmpe 実行文の生成
'一応、パラメータによる確認を含めておく
If oWSFSO.FileExists(sffmpeExe) and (sffmpeCrf <> cNULL) and (sffmpeSiz <> cNULL) Then
sffmpeRun = cDC & sffmpeExe & cDC & " -i " & cDC & po1Doga.Path & cDC & " -vcodec libx264 -crf " & sffmpeCrf & sGetConvertSizS(sffmpeSiz) & sffmpeSet & " -y " & cDC & ps2Doga1 & cDC
Else
sffmpeRun = cNULL
End if
sRunffmpeExe = sffmpeRun
End Function


'################################################
'サイズパラメータがあったら -s 付加
'
'IN
' psSiz サイズバラメータ
'
'Return
' 設定値があったら-sを前に付ける
'
Function sGetConvertSizS(psSiz)
Dim sSizS
sSizS = psSiz
If Len( Trim( sSizS ) ) > 0 Then
sSizS = " -s " & psSiz
End if
sGetConvertSizS = sSizS
End Function

 'コードはここまで。以下は1ファイル投入時の実行ログ。投入動画から得た情報で各パラメータを決定し、Ffmpeg.exe文を生成して変換処理して、結果の判定まで記録している。

####開始#### #2014/04/03 9:24:42#

VBS実行パス:C:\Users\zeze\Desktop\ffmpesync1.vbs

"「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4" は MP4 ビデオ 。mp4 で、動画ファイルです。

0000 名前 「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4
0001 サイズ 75.8 MB
0002 項目の種類 MP4 ビデオ
0003 更新日時 2012/06/24 13:33
0004 作成日時 2012/06/24 13:33
0005 アクセス日時 2013/12/28 22:21
0006 属性 AI
0009 認識された種類 ビデオ
0010 所有者 PSO2\zeze
0011 分類 ビデオ
0019 評価 評価なし
0027 長さ 00:03:45
0028 ビット レート ‎149kbps
0029 保護 いいえ
0053 コンピューター PSO2 (このコンピューター)
0155 ファイル名 「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4
0173 共有 いいえ
0176 フォルダー名 #アニメいろばら
0177 フォルダーのパス A:\#アニメいろばら
0178 フォルダー #アニメいろばら (A:)
0180 パス A:\#アニメいろばら\「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4
0182 種類 MP4 ビデオ
0188 リンクの状態 未解決
0269 共有状態 非共有
0280 ビデオ圧縮 {34363248-0000-0010-8000-00AA00389B71}
0282 データ速度 ‎2674kbps
0283 フレーム高 1080
0284 フレーム率 ‎29 フレーム/秒
0285 フレーム幅 1920
0286 総ビット レート ‎2824kbps

処理(元)パス:A:\#アニメいろばら
出力(先)パス:C:\Users\zeze
処理ログパス:C:\Users\zeze\「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4.log

対象ファイル処理数計:1
 1(未)処理ファイル数:1(75.83MB)
 2(済)損壊ファイル数:※事前カウント対象外
 3(済)小大ファイル数:0(0MB)⇒0%(0MB)
 4(済)新旧ファイル数:0(0MB)⇒0%(0MB)
 5(済)処理ファイル数:0(0MB)⇒0%(0MB)
- - - - - - - - - 
処理済(345計)進捗率:0%
対象外ファイル数:0
検索フォルダ数:0
- - - - - - - - - 
形式別カウント(計:1)
.mp4 :1

処理(元)ファイル名:A:\#アニメいろばら\「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4
  サイズ:75.83MB
長さ(時間):00:03:45
データ速度:‎2674kbps
フレーム高:1080
フレーム率:‎29 フレーム/秒
フレーム幅:1920
エンコード品質:31 処理開始 ※中止はffmpegを『×閉じる』

No. 状態 (元)*パス/nファイル名 長さ(時間) 幅x高 ビットレート ファイルサイズ 更新日時 (済)パスファイル名 幅x高 ビットレート ファイルサイズ 更新日時 FFMpeg
0000-* A:\#アニメいろばら C:\Users\zeze
0000-1 未34-1280x720○20.47% 「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4 00:03:45 1920x1080 ‎2674kbps 75.83MB 2012/06/24 13:33:44 C:\Users\zeze\「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4 1280x720 ‎420kbps 15.53MB 2014/04/03 9:25:19
"C:\Users\zeze\Desktop\ffmpeg.exe" -i "A:\#アニメいろばら\「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4" -vcodec libx264 -crf 34 -s 1280x720 -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  -vsync 2 -acodec copy  -y "C:\Users\zeze\「劇場版 BLOOD-C The Last Dark」PVロングバージョン.mp4"

対象ファイル処理位置:1
 1(未)処理ファイル数:0(0MB)
 2(済)損壊ファイル数:0(0MB)
 3(済)小大ファイル数:0(0MB)⇒0%(0MB)
 4(済)新旧ファイル数:0(0MB)⇒0%(0MB)
 5(済)処理ファイル数:1(75.83MB)⇒20.47%(15.53MB)
- - - - - - - - - 
処理済(345計)進捗率:100%
対象外ファイル数:0
検索フォルダ数:0
- - - - - - - - - 
形式別カウント(計:1)
. :0
.mp4 :1

####終了#### #2014/04/03 9:25:19#

2014年4月1日火曜日

Ffmぺsync ver.1.0 ffmpeg.exeでお手軽ご気楽高速エンコード ※セミHD1時間半番組エンコード例

Ffmぺsync ver.1.0  ffmpeg.exeを手軽に使うためのファイル同期風フロントエンドVBスクリプト 本編
 録画したtsファイルをFfmpesync.vbsに投入してエンコードを実行したが、指定したパラメータが気に入らなかったので一旦中止して再度実行したログです。
 一回目に変換出力したファイルを損壊ファイルと判断しています。 ※「長さ(時間)」、「フレーム高」、「フレーム幅」の全ての値の値が取得できれば正常。それ以外は損壊。 

####開始#### #2014/04/01 9:19:12#

VBS実行パス:C:\Users\zeze\Desktop\ffmpesync1貼り付け.vbs

"2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts" は MPEG-2 TS ビデオ 。ts で、動画ファイルです。

0000 名前 2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts
0001 サイズ 8.21 GB
0002 項目の種類 MPEG-2 TS ビデオ
0003 更新日時 2014/03/31 12:33
0004 作成日時 2014/04/01 8:47
0005 アクセス日時 2014/04/01 8:47
0006 属性 A
0009 認識された種類 ビデオ
0010 所有者 PSO2\zeze
0011 分類 ビデオ
0019 評価 評価なし
0027 長さ 01:33:13
0028 ビット レート ‎253kbps
0053 コンピューター PSO2 (このコンピューター)
0155 ファイル名 2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts
0173 共有 いいえ
0176 フォルダー名 DOGA
0177 フォルダーのパス C:\DOGA
0178 フォルダー DOGA (C:)
0180 パス C:\DOGA\2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts
0182 種類 MPEG-2 TS ビデオ
0188 リンクの状態 未解決
0269 共有状態 非共有
0280 ビデオ圧縮 {E06D8026-DB46-11CF-B4D1-00805F6CBBEA}
0282 データ速度 ‎20000kbps
0283 フレーム高 1080
0284 フレーム率 ‎29 フレーム/秒
0285 フレーム幅 1440
0286 総ビット レート ‎20253kbps

処理(元)パス:C:\DOGA
出力(先)パス:C:\Users\zeze
処理ログパス:C:\Users\zeze\2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts.log

対象ファイル処理数計:1
 1(未)処理ファイル数:0(0MB)
 2(済)損壊ファイル数:※事前カウント対象外
 3(済)小大ファイル数:0(0MB)⇒0%(0MB)
 4(済)新旧ファイル数:0(0MB)⇒0%(0MB)
 5(済)処理ファイル数:1(8408.79MB)⇒0.11%(9.29MB)
- - - - - - - - - 
処理済(345計)進捗率:100%
対象外ファイル数:0
検索フォルダ数:0
- - - - - - - - - 
形式別カウント(計:1)
.ts :1

処理(元)ファイル名:C:\DOGA\2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts
  サイズ:8408.79MB
長さ(時間):01:33:13
データ速度:‎20000kbps
フレーム高:1080
フレーム率:‎29 フレーム/秒
フレーム幅:1440

出力(先)ファイル名:C:\Users\zeze\2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts.mp4
  サイズ:9.29MB
長さ(時間):
データ速度:
フレーム高:
フレーム率:
フレーム幅:
エンコード品質:21 処理開始 ※中止はffmpegを『×閉じる』

No. 状態 (元)*パス/nファイル名 長さ(時間) 幅x高 ビットレート ファイルサイズ 更新日時 (済)パスファイル名 幅x高 ビットレート ファイルサイズ 更新日時 FFMpeg
0000-* C:\DOGA C:\Users\zeze
0000-1 壊31-1280x720○8.67% 2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts 01:33:13 1440x1080 ‎20000kbps 8408.79MB 2014/03/31 12:33:13 C:\Users\zeze\2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts.mp4 1280x720 ‎956kbps 728.77MB 2014/04/01 9:35:07 "C:\Users\zeze\Desktop\ffmpeg.exe" -i "C:\DOGA\2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts" -vcodec libx264 -crf 31 -s 1280x720 -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  -y "C:\Users\zeze\2014033111000101-[HV]春スペ 劇場版 FAIRY TAIL -鳳凰の巫女-.ts.mp4"

対象ファイル処理位置:1
 1(未)処理ファイル数:0(0MB)
 2(済)損壊ファイル数:0(0MB)
 3(済)小大ファイル数:0(0MB)⇒0%(0MB)
 4(済)新旧ファイル数:0(0MB)⇒0%(0MB)
 5(済)処理ファイル数:1(8408.79MB)⇒8.67%(728.77MB)
- - - - - - - - - 
処理済(345計)進捗率:100%
対象外ファイル数:0
検索フォルダ数:0
- - - - - - - - - 
形式別カウント(計:1)
.ts :1

####終了#### #2014/04/01 9:35:08#

てな感じで、

  サイズ:8408.79MB
長さ(時間):01:33:13
データ速度:‎20000kbps
フレーム高:1080
フレーム率:‎29 フレーム/秒
フレーム幅:1440

の動画ファイルが、品質31-1280x720 の約15分のffmpeg変換で

  サイズ:728.77MB
長さ(時間):01:33:14
データ速度:‎956kbps
フレーム高:720
フレーム率:‎29 フレーム/秒
フレーム幅:1280


(8408.79MB)⇒8.67%(728.77MB) の縮小となりました。 小さいは正義ッ!

 ちなみに出力解像度を小さくする事で、処理時間を短く、ファイルサイズは小さくできます。

 スマホとかで録画動画を視聴する場合、オリジナルの8GBをコピーするか、変換して1/10にしてスマホにコピーするか、、、まぁ今はDLanとかサーバにファイル置いて視聴するとかの手もあるんですけどね。 サーバに動画ファイル置いてネットワーク経由で視聴とか手軽でいいんだど、外で見たい場合回線の速度と安定度とかの影響をモロ受けるのでイライラの末見れないとか精神衛生上悪いことしかなくってねーFfmpesync.vbs作るきっかけの一つでもありました。
 特にフォルダ投入で動画を一気に変換する機能は一番のお気に入りだったりします。
 ファイル小さくすると少ないストレージに録画したアニメ一杯入るしねっ。

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日月曜日

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