2014年1月6日月曜日

MovieConverter ver.001 (旧 「あの処理」までのVBScript) VBScriptでFfmpeg.exe使ってみました

 MovieConverter ver.001 はFfmpeg.exeでのエンコードを円滑に行うための支援マクロとして作りました。
 以下、現在までに形になっている機能です。
 モード:0 指定フォルダ以下の検索のみ(高速)
 モード:1 指定フォルダ以下のアイテム検索(中速)
 モード:2 指定フォルダ以下のアイテム調査(低速)
 モード:3 指定フォルダ以下の動画変換 強制転送モード(激低速)

 フォルダを指定するだけで、あとは勝手にやってくれる。をコンセプトにしていますが、まだまだ不足の機能は多いです。 特に変換済みファイルの有無による挙動制御とかは近いうちに入れたいです。

 動作環境
「あの処理」までのVBScript (その9)FFmpegを使用した高速エンコード 「VBスクリプトでFFmpegエンコード(あの処理)」 ・実行環境作成
を参照して作成してください。

実行例:
モード:0 指定フォルダ以下の検索のみ(高速)
 再帰的にフォルダを検索、カウントする

モード:1 指定フォルダ以下のアイテム検索(中速)
 再帰的にフォルダを検索しつつ、同じ階層のアイテムをカウントする。(ファイル・フォルダの種別関係なくカウントする)

 モード:2 指定フォルダ以下のアイテム調査(低速)
 再帰的にフォルダを検索しつつ、同じ階層のアイテムの『属性』を参照して「分類」が”ビデオ”またはNULL””(空白)のファイルを取り出す。
 「分類」が”ビデオ”のファイルは”フレーム高” ”フレーム幅”を参照して、Ffmpegエンコード時のパラメータ決定に使う。

モード:3 指定フォルダ以下の動画変換 強制転送モード(激低速)
 モード:2にFfmpegエンコードがついたもの。 指定元のフォルダ構造を構築しつつ、変換先へ1ファイルづつエンコードを行う。 モード:3は強制上書き。
 変換前と後の比較

今後について:
 サンプルとりつつ圧縮率と画質を比較して、パラメータの調整かな~。 画面更新のタイミングとか、圧縮前と後のサイズ比較とか、ログ出力とか、モード:4 モード:5の実装とかやりたい事があるけど、仕事始まるし今後は空き時間見つつなるか。

以下、末尾までスクリプト

'################################################
'
'実行例:Cscript MovieConverter001.vbs 動作レベル(0-3) 元パス [先パス(Lv3~)]
'
'
'処理概要
' 指定フォルダからアイテムを再帰的に総ざらえしてて動画ファイルを取出し
' 転送先フォルダを作成して、動画ファイルを変換転送する。
'
' 動作レベル(0-3)
' 0 指定フォルダ以下の検索のみ(高速)
' 1 指定フォルダ以下のアイテム検索(中速)
' 2 指定フォルダ以下のアイテム調査(低速)
' 3 指定フォルダ以下の動画変換 強制転送モード(激低速)
'
' 元パス 
' 指定フォルダ
'
'[先パス(Lv3~)]
' 変換出力先フォルダ。 存在パスを指定する
'
'################################################
Option Explicit

'WScript.Object
Dim oWSFso , oWArgu , oWSApp , WSShel 
Const cDEBUG = False

Dim iPARA_ITEM0
Dim sPARA_ITEM1
Dim sPARA_ITEM2

'***Function iConv_MovieFile パラメータ
Dim iCONVERTLEVEL '動作モード
Const cConvLv0 = 0 '該当フォルダ検索のみ
Const cConvLv1 = 1 'アイテム検索
Const cConvLv2 = 2 'アイテム調査
Const cConvLv3 = 3 '動画変換 強制転送モード
Const cConvLv4 = 4 '(未実装)新規のみ転送(既存は上書きしない)
Const cConvLv5 = 5 '(未実装)日時比較転送

'ヘッダラベル
Const iPARA_COUNT = 512
Dim rPARA_LABEL(512)

'ファイル判定
Const cBunrui_Video = "ビデオ"
Const cBunrui_Unknown = ""

'処理不明
Const cBunrui_UnFumei = "[不明]"

'処理カウント
Dim iFOLDER_COUNT
Dim iFILE_COUNT
Dim iCONV_COUNTALL '処理実行カウント
Dim iCONV_COUNT26free
Dim iCONV_COUNT29free
Dim iCONV_COUNT32free
Dim iCONV_COUNT32w
Dim iCONV_COUNT32q
Dim iCONV_COUNTNOT '未処理ファイル数カウント
'***End Function iConv_MovieFile パラメータ


'***Function sRun_FFmpeg パラメータ
Const cFFMPEG_EXE = "ffmpeg.exe"
Const cFFMPEG_SET = "ffpresets\main.ffpreset"
Const sFFMPEG_2FG = ".mp4"
Const cRST = 0 '2014/1/5 変換パラメータを変更
Const c26f = 1
Const c29f = 2
Const c32f = 3
Const c32w = 4
Const c32q = 5

Dim cDC ' <<< ”
cDC = Chr(34)
Const cNULL = ""
'***End Function sRun_FFmpeg パラメータ

'実行シェル
Set WSShel = WScript.CreateObject("WScript.Shell")

'フォルダ・ファイル操作
Set oWSFso = WScript.CreateObject("Scripting.FileSystemObject")

'ファイル属性確認
'再帰的に呼び出すので、宣言をメインループより出した
Set oWSApp = WScript.CreateObject("Shell.Application")

'カウントリセット
iFOLDER_COUNT = 0 'フォルダカウント
iFILE_COUNT = 0 'ファイルカウント
iCONV_COUNTALL = 0 '処理実行カウント
iCONV_COUNT26free = 0
iCONV_COUNT29free = 0
iCONV_COUNT32free = 0
iCONV_COUNT32w = 0
iCONV_COUNT32q = 0
iCONV_COUNTNOT = 0 '未処理ファイル数カウント


'パラメータ確認用
Set oWArgu = WScript.Arguments

Dim bPARA_ITEM0
Dim bPARA_ITEM1
Dim bPARA_ITEM2


'動作モード 該当フォルダ検索のみ 
iCONVERTLEVEL = cConvLv0
If oWArgu.count >=  2 Then

iPARA_ITEM0 = oWArgu.item(0)

If IsNumeric(iPARA_ITEM0 ) Then
iCONVERTLEVEL = Clng(iPARA_ITEM0)

'引数の2場合
bPARA_ITEM0 = (cConvLv0 <= iCONVERTLEVEL) and (iCONVERTLEVEL <= cConvLv2)
sPARA_ITEM1 = oWArgu.item(1)
bPARA_ITEM1 = oWSFso.FolderExists( sPARA_ITEM1 )  
sPARA_ITEM2 = cNULL
bPARA_ITEM2 = True

'引数3の場合
If oWArgu.count = 3 Then
bPARA_ITEM0 = (cConvLv0 <= iCONVERTLEVEL) and (iCONVERTLEVEL <= cConvLv3)
sPARA_ITEM2 = oWArgu.item(2)
'Lv3以上のみ存在チェック
If  (cConvLv3 <= iCONVERTLEVEL) and (iCONVERTLEVEL <= cConvLv5) Then
bPARA_ITEM2 = oWSFso.FolderExists( sPARA_ITEM2 ) 
End if
End if

If bPARA_ITEM0 and bPARA_ITEM1 and bPARA_ITEM2 Then

'メインループ実行
   CALL Conv_MovieFolder( sDrivaPath(sPARA_ITEM1) ,  sPARA_ITEM2)

Select Case iCONVERTLEVEL
Case cConvLv0
WScript.Echo cNULL
WScript.Echo "モード0"
WScript.Echo "################################"
WScript.Echo "指定フォルダ以下カウント"
WScript.Echo vbTab & "検索フォルダ数:" & iFOLDER_COUNT
WScript.Echo "################################"

Case cConvLv1
WScript.Echo cNULL
WScript.Echo "モード1 指定フォルダ以下"
WScript.Echo "################################"
WScript.Echo "  (識別前)全アイテムカウント"
WScript.Echo vbTab & "検索フォルダ数:" & iFOLDER_COUNT
WScript.Echo vbTab & "処理アイテム数:" & iFILE_COUNT
WScript.Echo "################################"

Case cConvLv2
WScript.Echo cNULL
WScript.Echo "モード2 指定フォルダ以下検索"
WScript.Echo "################################"
WScript.Echo "    動画ファイル処理別カウント    "
WScript.Echo vbTab & "検索フォルダ数:" & iFOLDER_COUNT
WScript.Echo vbTab & "処理ファイル数:" & iFILE_COUNT
WScript.Echo vbTab & "対象ファイル数:" & iCONV_COUNTALL
WScript.Echo vbTab & " 変換種別SD26f:" & iCONV_COUNT26free
WScript.Echo vbTab & " 変換種別SD29f:" & iCONV_COUNT29free
WScript.Echo vbTab & " 変換種別HD32f:" & iCONV_COUNT32free
WScript.Echo vbTab & " 変換種別HD32w:" & iCONV_COUNT32w
WScript.Echo vbTab & " 変換種別HD32q:" & iCONV_COUNT32q
WScript.Echo vbTab & "不明ファイル数:" & iCONV_COUNTNOT
WScript.Echo "################################"

Case cConvLv3
WScript.Echo cNULL
WScript.Echo "モード3 指定フォルダ以下検索"
WScript.Echo "################################"
WScript.Echo "    動画ファイル変換別カウント    "
WScript.Echo vbTab & "検索フォルダ数:" & iFOLDER_COUNT
WScript.Echo vbTab & "処理ファイル数:" & iFILE_COUNT
WScript.Echo vbTab & "対象ファイル数:" & iCONV_COUNTALL
WScript.Echo vbTab & " 変換種別SD26f:" & iCONV_COUNT26free
WScript.Echo vbTab & " 変換種別SD29f:" & iCONV_COUNT29free
WScript.Echo vbTab & " 変換種別HD32f:" & iCONV_COUNT32free
WScript.Echo vbTab & " 変換種別HD32w:" & iCONV_COUNT32w
WScript.Echo vbTab & " 変換種別HD32q:" & iCONV_COUNT32q
WScript.Echo vbTab & "不明ファイル数:" & iCONV_COUNTNOT
WScript.Echo "################################"

End Select

Else
   Wscript.Echo "引数が不正です。MovieConverter001.vbs" & vbTab & iPARA_ITEM0 & vbTab & sPARA_ITEM1 & vbTab & sPARA_ITEM2

End if
Else
   Wscript.Echo "引数が不正です。MovieConverter001.vbs" & vbTab & iPARA_ITEM0 

End if

Else
    Wscript.Echo "引数が不正です。実行例:Cscript MovieConverter001.vbs 動作レベル(0~3) 元パス [(Lv3~)先パス]"

End if


'終了処理
Set oWArgu = Nothing
Set oWSFso = Nothing
Set oWSApp = Nothing
Set WSShel = Nothing
Wscript.Quit 


'################################################
' Case 1 '元パスファイルの属性確認
'################################################
'Sub Conv_MovieFolder(psPATH , s2PATH)
'
'処理概要
' 指定フォルダから再帰的にフォルダを検索する。
'
'IN
' psPATH 検索元パス
'
Sub Conv_MovieFolder(psPATH , s2PATH)
Dim cSFolder,oSFolder,oTemp,cFiler
Dim sMovie

Dim iSubFolders
Dim iErr

With oWSFso '.BuildPath(s2Folder , o1Doga.name) 
Set cSFolder = .GetFolder(psPATH)
Set oSFolder = cSFolder.SubFolders

'もし隠しまたはシステムだったら スキップ
'1 ReadOnly 読み取り専用フォルダです。
'2 Hidden 隠しフォルダです。
'4 System システム フォルダです。
'16 Directory フォルダまたはディレクトリです。フォルダやディレクトリは、この属性を外せません。
'32 Archive 前回のバックアップ以降に変更されたフォルダです。

If Right(psPATH ,2) = ":\" or Not ( (cSFolder.Attributes and 2) = 2) or ( (cSFolder.Attributes and 4) = 4 )  Then  '

If cDEBUG Then Wscript.Echo "[000]"  & iFOLDER_COUNT  & " )" &  cSFolder.Attributes  &  vbTab & psPATH & vbTab & s2PATH

on error resume next'*********************
iSubFolders =oSFolder.count
iErr  = Err.Number
on error goto 0 '*********************
If iErr <> 0 Then
Err.Clear
Else

For Each oTemp In oSFolder

If cDEBUG Then Wscript.Echo "[100]" & iFOLDER_COUNT  & " )" &  oTemp.Attributes & vbTab & oTemp.Name & vbTab  

sMovie = Left( oTemp.Name , 1 )
If sMovie ="."  or sMovie ="$"  Then
'If cDEBUG Then Wscript.Echo "[200]" & iFOLDER_COUNT  & " )" &  oTemp.Path &  vbTab &  "隠し またはシステムフォルダ" 

Else
'***①初回はルートフォルダ
if iFOLDER_COUNT = 0 then
iFOLDER_COUNT = iFOLDER_COUNT + 1
If cDEBUG Then Wscript.Echo "[201]" & iFOLDER_COUNT  & " )" &  psPATH  & " >> "  & s2PATH  
iFILE_COUNT = iConv_MovieFile( psPATH ,s2PATH ) + iFILE_COUNT 

End if
'***

'以後、サブフォルダフォルダ
'先フォルダが在る 無かったら作成。 ダメならFalse
'Lv2 までは書き込まないので無条件で真
If bCheckConvertFolder( .BuildPath( s2PATH , oTemp.Name ) ) = True Then

iFOLDER_COUNT = iFOLDER_COUNT + 1
If cDEBUG Then Wscript.Echo "[202]" & iFOLDER_COUNT & " )" & psPATH  & vbTab  & .BuildPath(s2PATH , oTemp.Name)
'処理ファイル数カウントアップ
iFILE_COUNT = iConv_MovieFile( .BuildPath( psPATH , oTemp.Name) , .BuildPath( s2PATH , oTemp.Name) ) + iFILE_COUNT 

'サブフォルダー検索
   CALL Conv_MovieFolder( .BuildPath( psPATH , oTemp.Name ) , .BuildPath( s2PATH , oTemp.Name ) )
Else
If cDEBUG Then Wscript.Echo "[203]" & iFOLDER_COUNT & ")ERRERRERR" & vbTab & .BuildPath( s2PATH , oTemp.Name ) & vbTab & ")ERRERRERR"
End if
End if 

Next


'サブフォルダー検索のみに使用
Set cFiler = cSFolder.Files
For Each oTemp In cFiler

'***ルートフォルダ に サブフォルダーが一つもなかった場合 ①初回はルートフォルダ をここで実行
if iFOLDER_COUNT = 0 then
iFOLDER_COUNT = iFOLDER_COUNT + 1
If cDEBUG Then Wscript.Echo "[300]" & iFOLDER_COUNT & " )" & psPATH  & " >> "  & s2PATH  
iFILE_COUNT = iConv_MovieFile( psPATH ,s2PATH ) + iFILE_COUNT 

End if
'***

Next

End if

End If

End with

'終了処理
Set cSFolder = Nothing
Set oSFolder = Nothing
Set oTemp = Nothing
Set cFiler = Nothing
End Sub


'################################################
'Function iConv_MovieFile( psFolder , ps2Folder )
'
'処理概要
' 指定フォルダから再帰的にフォルダを検索して
' 先フォルダに該当ファイルが存在するフォルダを作成して、動画ファイルをエンコード作成する。
'
'IN
' psFolder 検索元パス
' ps2Folder 検索先パス
'
'OUT
' Return 参照ファイル数 "ビデオ" or "" 
'
Function iConv_MovieFile( psFolder , ps2Folder )
Dim iRetFileCount'処理件数カウント

    Dim oNsFolder 'フォルダオブジェクト
    Dim oItem 'フォルダ内特定アイテムオブジェクト
    Dim iPara 'パラメータインデックス
Dim s2ConvFPath '変換先ファイル名 (命名規則は関数化する)
Dim s2ConvFfmpeg '変換先ファイル名 (命名規則は関数化する)

Dim idxN ' 名前
Dim idxS ' サイズ
Dim idxB ' 分類
Dim idxL ' 長さ
Dim idxH ' フレーム高
Dim idxR ' フレーム率
Dim idxW ' フレーム幅

Dim sBunrui '分類
Dim iHeight '動画フレーム幅
Dim sRate '動画フレーム率
Dim iWidth '動画フレーム高

Dim iConvMode '変換モード

'Echo文字列
Dim sWRITE_LINE

if cDEBUG Then Wscript.Echo "[400]iConv_MovieFile(" & psFolder & vbTab &  ps2Folder 

'cConvLv2 まではフォルダ名のみ
If iCONVERTLEVEL < cConvLv3 Then
Wscript.Echo iFOLDER_COUNT & vbTab & psFolder 
Else
'cConvLv3 以上は転送元、先記述
Wscript.Echo iFOLDER_COUNT & vbTab & psFolder  & vbTab & ">>" & vbTab & ps2Folder 
End if

'指定フォルダのNamespace取得
    Set oNsFolder = oWSApp.Namespace(psFolder)
With oNsFolder

'処理件数カウント初期化
iRetFileCount = 0

'詳細ラベルの判定初期化
idxN = 0 ' 名前
idxS = 0 ' サイズ
idxB = 0 ' 分類
idxL = 0 ' 長さ
idxH = 0 ' フレーム高
idxR = 0 ' フレーム率
idxW = 0 ' フレーム幅

If iCONVERTLEVEL >= cConvLv1 Then

If iCONVERTLEVEL = cConvLv1 Then
'Lv1 ファイル名のみ
For Each oItem in .Items

'ファイルの属性見ないので全件数 カウント↑
iRetFileCount = iRetFileCount + 1

'ファイル名のみ出力
sWRITE_LINE = iRetFileCount  & vbTab &   oItem.Path 
Wscript.Echo sWRITE_LINE
Next 

Else
For iPara = 0 to ( iPARA_COUNT - 1 )
rPARA_LABEL(iPara) = .GetDetailsOf(.Items, iPara)

Select Case .GetDetailsOf(.Items, iPara)
case "名前"
idxN = iPara

case "サイズ"
idxS = iPara

case "分類"
idxB = iPara

case "長さ"
idxL = iPara

case "フレーム高"
idxH = iPara

case "フレーム率"
idxR = iPara

case "フレーム幅"
idxW = iPara

end select
'名前以外判定
If idxS > 0  and idxB > 0  and idxL > 0  and idxH > 0  and idxR > 0  and idxW > 0 then
Exit For
End if
Next
'名前以外判定
sWRITE_LINE = cNULL
If idxS > 0  and idxB > 0  and idxL > 0  and idxH > 0 and idxR > 0 and idxW > 0 then
sWRITE_LINE = "No." & vbTab
sWRITE_LINE = sWRITE_LINE &  "形式"  & vbTab 
sWRITE_LINE = sWRITE_LINE & rPARA_LABEL(idxN)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rPARA_LABEL(idxB)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rPARA_LABEL(idxS)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rPARA_LABEL(idxL)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rPARA_LABEL(idxH)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rPARA_LABEL(idxR)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rPARA_LABEL(idxW)  
If iCONVERTLEVEL >= cConvLv3 Then
sWRITE_LINE = sWRITE_LINE & vbTab & "変換先"
End if

Wscript.Echo vbTab & sWRITE_LINE

'詳細情報の取得 iPARA_COUNT まで検索して保管情報を抜き出す
For Each oItem in .Items

sWRITE_LINE = cNULL
s2ConvFfmpeg = cNULL
'分類 その他を出力
sBunrui = .GetDetailsOf(oItem, idxB) 

'ビデオと不明のみ通す(フォルダやショートカットは除外)
If (sBunrui= cBunrui_Video) or (sBunrui= cBunrui_Unknown) Then

'処理件数カウント↑
iRetFileCount = iRetFileCount + 1
sWRITE_LINE = iRetFileCount & vbTab 

'高さ、幅 を取得
iHeight = .GetDetailsOf(oItem, idxH)
sRate = .GetDetailsOf(oItem, idxR)
iWidth = .GetDetailsOf(oItem, idxW)

'処理対象ファイル
If (sBunrui= cBunrui_Video) and (IsNumeric(iWidth)) and (IsNumeric(iHeight)) Then
'処理実行カウント
iCONV_COUNTALL = iCONV_COUNTALL + 1

'変換先ファイル名の取得(命名規則は関数化する)
's2ConvFPath = Replace(oItem.Path,  psFolder, ps2Folder) 

iHeight = CLng(iHeight)
iWidth = CLng(iWidth)

'変換モード初期化 以後、条件に応じて変換モードセット
iConvMode = cRST

'実写系 (29fps以上とする)
If Instr(sRate,"29") > 0 Or  Instr(sRate,"30")  Or  Instr(sRate,"59")   Or  Instr(sRate,"60") > 0 Then
If iHeight < 720 Then
iCONV_COUNT29free = iCONV_COUNT29free + 1
iConvMode = c29f
sWRITE_LINE = sWRITE_LINE & "SD29f" & vbTab 
ElseIf iHeight = 720 Then '変換基準値
iCONV_COUNT32free = iCONV_COUNT32free + 1
iConvMode = c32f
sWRITE_LINE = sWRITE_LINE & "SD32f" & vbTab 

ElseIf iHeight > 720 Then
If (iHeight / iWidth) > 0.6 Then
'4:3
iCONV_COUNT32q = iCONV_COUNT32q + 1
iConvMode = c32q
sWRITE_LINE = sWRITE_LINE & "HD32q" & vbTab 

Else
'16:9
iCONV_COUNT32w = iCONV_COUNT32w + 1
iConvMode = c32w
sWRITE_LINE = sWRITE_LINE & "HD32w" & vbTab 

End if

End if


Else
If iHeight < 720 Then
iCONV_COUNT26free = iCONV_COUNT26free + 1
iConvMode = c26f
sWRITE_LINE = sWRITE_LINE & "SD26f" & vbTab 

ElseIf iHeight = 720 Then '変換基準値
iCONV_COUNT29free = iCONV_COUNT29free + 1
iConvMode = c29f
sWRITE_LINE = sWRITE_LINE & "SD29f" & vbTab 

ElseIf iHeight > 720 Then
If (iHeight / iWidth) > 0.6 Then
'4:3
iCONV_COUNT32q = iCONV_COUNT32q + 1
iConvMode = c32q
sWRITE_LINE = sWRITE_LINE & "HD32q" & vbTab 

Else
'16:9
iCONV_COUNT32w = iCONV_COUNT32w + 1
iConvMode = c32w
sWRITE_LINE = sWRITE_LINE & "HD32w" & vbTab 

End if

End if
End if

'Lv3 強制転送
If iCONVERTLEVEL = cConvLv3 Then
If iConvMode > cRST Then
'変換成功したら、変換後ファイル名を返す
s2ConvFfmpeg =  sRun_FFmpeg( iConvMode, oItem.Path , ps2Folder )
End if
End if

Else
'処理除外ファイル
'分類 Bunrui_Fumei セット
sBunrui = cBunrui_UnFumei

iCONV_COUNTNOT = iCONV_COUNTNOT + 1
sWRITE_LINE = sWRITE_LINE & "-----" & vbTab 

End if

sWRITE_LINE = sWRITE_LINE & .GetDetailsOf(oItem, idxN) & vbTab 
sWRITE_LINE = sWRITE_LINE & sBunrui & vbTab 
sWRITE_LINE = sWRITE_LINE & .GetDetailsOf(oItem, idxS) & vbTab
sWRITE_LINE = sWRITE_LINE & .GetDetailsOf(oItem, idxL) & vbTab
sWRITE_LINE = sWRITE_LINE & iHeight & vbTab
sWRITE_LINE = sWRITE_LINE & sRate & vbTab
sWRITE_LINE = sWRITE_LINE & iWidth & vbTab
sWRITE_LINE = sWRITE_LINE & s2ConvFfmpeg
End if
If Len(sWRITE_LINE)>0 Then
Wscript.Echo sWRITE_LINE
End if
   Next

If Len(sWRITE_LINE)>0 Then
Wscript.Echo cNULL
End if
End if
End if
End if 

End with

iConv_MovieFile = iRetFileCount
Set oNsFolder = Nothing
Set oItem = Nothing
End Function




'################################################
'Function bCheckConvertFolder( psMkFolder )
'
'処理概要
' フォルダの存在確認、無かったら作成
' Lv2までは書き込まないので無条件で真
'
'IN
' psMkFolder:作成フォルダ名
'
'Out
' True : 在る または 出来たら
' False : 出来なかった

Function bCheckConvertFolder( psMkFolder )
Dim bRetFolder 'フォルダ有無

If iCONVERTLEVEL < cConvLv3 Then
'Lv2までは書き込まないので無条件で真
bRetFolder = True

Else
'フォルダの存在確認。 
bRetFolder = oWSFso.FolderExists( psMkFolder ) 
If Not bRetFolder Then
'なかったらフォルダ作成
call oWSFso.CreateFolder( psMkFolder ) 

'作成確認
bRetFolder = oWSFso.FolderExists( psMkFolder ) 
End if
End If

bCheckConvertFolder = bRetFolder
End Function




'
'#######################################
'メインルーチン
'#######################################
'パラメータ
'in
' 1  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 26 -vsync 2 -acodec copy -y %2
' 2  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 29 -vsync 2 -acodec copy -y %2
' 3  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 32 -vsync 2 -acodec copy -y %2
' 4  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 32 -s 1280x720 -vsync 2 -acodec copy -y %2
' 5  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 32 -s 960x720 -vsync 2 -acodec copy -y %2
'
's1Doga
' 変換元の動画ファイルパス
'
's2Folder
' 出力先パス
'
'Out
' 成功:True
' 失敗:False
'
Function sRun_FFmpeg(iMODE , s1Doga , s2Folder )
Dim sRetConvName '変換後の動画ファイル名 無かったら cNULL

'If cDEBUG Then WScript.Echo  "bRun_FFmpeg(" & vbTab  & iMODE & vbTab & s1Doga  & vbTab & s2Folder

Dim o1Doga '動画元ファイル名
Dim s2File '変換後ファイル名

'実行vbsファイルのパス
Dim iPathLen , sExePath 

'Return初期値
sRetConvName = cNULL

Dim sFFmpegExe ,sFFmpegPSet , sFFmpegRun ,sFFmpeg1 , sFFmpeg2 , sFFmpeg3

'実行vbsファイルのパス取得
iPathLen= Len(WScript.Scriptfullname) - Len(WScript.Scriptname)
sExePath = Left(Wscript.Scriptfullname, iPathLen)


If IsNumeric(iMODE) Then
iMODE = Clng(iMODE)
'実行モード、元パス、先パス の確認
If (iMODE <= c32q)  Then 
With oWSFso
'ffmpegの実行パスファイル取得
sFFmpegExe = .BuildPath(sExePath , cFFMPEG_EXE)
sFFmpegPSet = .BuildPath(sExePath , cFFMPEG_SET)

'sFFmpegExe , sFFmpegPSet , s1Doga , s2Folder の存在確認
If .FileExists(sFFmpegExe) and .FileExists(sFFmpegPSet) and .FileExists(s1Doga) and .FolderExists(s2Folder) Then


'元ファイルオブジェクト取得
Set o1Doga = .GetFile(s1Doga)

'出力名取得
s2File = sConvertMovieName ( s1Doga , .BuildPath(s2Folder , o1Doga.name) )

'FFmpeg 実行文作成
sFFmpegRun = sFFmpegExe & " -i " & cDC & s1Doga & cDC 
Select case iMODE
Case c26f
sFFmpegRun = sFFmpegRun & " -vcodec libx264 -vpre main -crf 26"

Case c29f
sFFmpegRun = sFFmpegRun & " -vcodec libx264 -vpre main -crf 29"

Case c32f
sFFmpegRun = sFFmpegRun & " -vcodec libx264 -vpre main -crf 32"

Case c32w
sFFmpegRun = sFFmpegRun & " -vcodec libx264 -vpre main -crf 32 -s 1280x720"

Case c32q
sFFmpegRun = sFFmpegRun & " -vcodec libx264 -vpre main -crf 32 -s 960x720"

End Select
sFFmpegRun = sFFmpegRun & " -vsync 2 -acodec copy -y "  & cDC & s2File & cDC

'同期実行
'WScript.Echo "bRun_FFmpeg(WSShel.Run(" & sFFmpegRun 
Call WSShel.Run(sFFmpegRun , 1, true)

'出来たか確認
If .FileExists(s2File) Then
sRetConvName = s2File
End if
Else
'パラメータ不正
WScript.Echo  "bRun_FFmpeg(引数が不正です。ERRERR"
End if
End with

Else
'パラメータ不正
WScript.Echo "bRun_FFmpeg(引数が不正です。iMODE:" & iMODE
End if
Else
'パラメータ不正
WScript.Echo "bRun_FFmpeg(引数が不正です。iMODE:" & iMODE
End if

sRun_FFmpeg = sRetConvName
End Function


'################################################
'変換ファイル名決定関数
'
'IN
' s1Doga 動画元ファイル名
' s2File "初期"変換後ファイル名
'
'Return
' "正式"変換後ファイル名 
'
Function sConvertMovieName ( s1Doga , s2File)
Dim sRet2File ' "正式"変換後ファイル名 

'Return初期値
sRet2File = s2File

'元と先が一致したら、末尾に追加
If Lcase(s1Doga) = Lcase(s2File) Then
sRet2File = s2File  & sFFMPEG_2FG
Else
'拡張子.mp4ではなかったら末尾に付加
If Lcase( Right( s1Doga , Len(sFFMPEG_2FG))) <> sFFMPEG_2FG then
sRet2File = s2File  & sFFMPEG_2FG
End if
End if

sConvertMovieName = sRet2File
End Function 


'################################################
'ドライブ名だった場合 \ を付加する
Function sDrivaPath(sPath)
Dim sRetPath

sRetPath = sPath
if Right(sRetPath , 1)=":" Then
sRetPath  = sRetPath  & "\"
End if

sDrivaPath = sRetPath 
End Function


0 件のコメント:

コメントを投稿