2014年1月4日土曜日

「あの処理」までのVBScript (その10)FFmpegを使用したお手軽ドラッグ&ドロップなエンコード

「あの処理」までのVBScript (その9)FFmpegを使用した高速エンコード

 は、「あの処理」に組み込む関係上、入力値として「変換元ファイル」の他に「変換モード」と「出力先フォルダ」の値が必要だったために、設定が複雑になってしまいました。 これではコマンドラインからの起動が必要で、お手軽に使えません。
 と言うわけで、変換したいファイルを「ドラッグ&ドロップ」するだけでエンコードするスクリプトを作ってみました。 ショートカット上への動画ファイルの「ドラッグ&ドロップ」でも動くので、同ショートカットをデスクトップ上に置いておくと便利かもしれません。

動作条件
 VBScript (その9)の動作環境と同じにするか、FfmpegConv009.vbs と同じフォルダにFfmpegConv010.vbs を置く。 FfmpegConv010.vbsのショートカットを作りデスクトップなどに置いておくも手。

処理概要
 FFmpeg.exeを用いてH.264変換する。
 変換ファイルを受け取ると、元の場所に 品質32 1280x720(設定固定)1PASSエンコードでファイルを変換する。

 スクリプトに ドラッグ&ドロップでファイル投入で実行させる事が可能。'ショートカット上に対してもOK。
 メッセージは、エラー時と処理終了時のみに抑制しています。
 内部コード的には モード変更はそのまま残っています。(ノД`)・゜・。だって削除メンドイ

 さて、次回は検索コードと合体だああああ

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

'################################################
'
'実行例:Cscript FfmpegConv010.vbs 動画ファイルパス
'
'
'処理概要
'FFmpeg.exeを用いてH.264変換する。変換ファイルを受け取ると、元の場所に 品質32 1280x720(設定固定)1PASSエンコードでファイルを変換する。
'
'スクリプトに ドラッグ&ドロップでファイル投入で実行させる事が可能。
'ショートカット上に対してもOK。
'メッセージは、エラー時と終了時のみに抑制しています。
'内部コード的には モード変更はそのまま残っています。(ノД`)・゜・。だって削除メンドイ
'
'入力値
' 「変換元ファイル」 ドラッグ&ドロップで取得。 ショートカットでもOK。
' 「変換モード」 品質32 1280x720 1Pass Mainプロファイル つまり(その9)のモード3
' 「出力先フォルダ」  変換元ファイルと同じ位置。
'出力
' 「出力先フォルダ」に入力ファイル名の後ろに".mp4" をくっ付けます。
'################################################
'
'以下スクリプト
Option Explicit

'WScript.Object

Dim oWSFso, oWArgu , WSShel
Dim cFile

Dim iMODE_ITEM0
Dim sFILE_ITEM0
Dim sPATH_ITEM2
Dim sRun

Set WSShel = WScript.CreateObject("WScript.Shell")

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

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


Select case oWArgu.count
Case 1 '元パス⇒先パスへ ファイルの縮小エンコード

'置換用に元パス名保持
sFILE_ITEM0 = oWArgu.item(0)

'FFmpeg処理実行
Set cFile = oWSFso.GetFile(sFILE_ITEM0)
sRun = sRun_FFmpeg(3, sFILE_ITEM0 , cFile.ParentFolder)

'変換完了
If Len(sRun)>0 Then
WScript.Echo "FfmpegConv010は【" & sRun & "】を作成しました。"

Else
WScript.Echo "FfmpegConv010は【" & sFILE_ITEM0 & "】を変換できませんでした。"

End if

Case Else
    Wscript.Echo "引数が不正です。実行例:Cscript FfmpegConv010.vbs 動画ファイルパス"

End Select

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


'
'#######################################
'メインルーチン
'#######################################
'パラメータ
'in
' 0  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 26 -vsync 2 -acodec copy -y %2
' 1  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 29 -vsync 2 -acodec copy -y %2
' 2  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 32 -vsync 2 -acodec copy -y %2
' 3  >>> ffmpeg -i %1 -vcodec libx264 -vpre main -crf 32 -s 1280x720 -vsync 2 -acodec copy -y %2
' 4  >>> 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 )
'WScript.Echo  "bRun_FFmpeg(" & vbTab  & iMODE & vbTab & s1Doga  & vbTab & s2Folder

Const cFFMPEG_EXE = "ffmpeg.exe"
Const cFFMPEG_SET = "ffpresets\main.ffpreset"
Const sFFMPEG_2FG = ".mp4"
Const c26f = 0
Const c29f = 1
Const c32f = 2
Const c32w = 3
Const c32q = 4

Dim o1Doga
Dim s2File

Dim cDC
cDC = Chr(34)

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

'Return初期値
sReturn = ""

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 = .BuildPath(s2Folder , o1Doga.name) 

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


'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
sReturn = 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 = sReturn

End Function

0 件のコメント:

コメントを投稿