ここのところ作り込んでいたものができたので紹介したい。
といっても、かなりレアケースなので、この記事が役に立つ人がいるか不明だが。
まぁ部分的には使えるところもあるだろう。
経緯
以前、
sonyのハンディカムHDR-CX500Vのディスプレイが壊れたので分解してしまって、その後
新しいハンディカム「Panasonic HDC-TM45」を購入したのは紹介した通りだが、いろいろ不満があった。
不満に関しては「
新しいハンディカム購入 Panasonic HDC-TM45」を見てもらえばいいが、今回はその課題を全て解決しようというわけだ。
やりたいこと
やりたい事は、HDC-TM45で撮ったデータを
インターネットAQUOSで見れるような画質に変換、更に、落とした後にアスペクト比が4:3になっているので、NASにコピーしてから16:9に変換し、ファイルの作成日時を変更すれば、sonyのPMB で正しい日時で登録される。
AVCHDで保存するのと、mpeg2に変換するのは、HD Writer AEを使うのが速いのでそこは変わらない。
HD Writer AEの保存設定は、各日付のフォルダにその日のファイルを保存するような設定になっている。
今回はその後の処理を全てバッチ化してみた。
その後の処理というのはつまり、mpeg2変換後にアスペクト比が4:3になっているので、まずNASにコピーしてから16:9に変換し、ファイルの作成日時を変更するという作業。
どうやんの?
基本はWSH
アスペクト比の変更は「
ReAspect」というのを使わせてもらった。
このソフトはreaspectcmd.exeというコマンドラインで操作できるバージョンも用意してくれていた。
作成日時変更は「
touch」というのを使わせてもらった。
結果や進捗、完了したかをコマンドラインで確認できるようにしたいので、開始は
start.bat
に
echo on
cscript settings.vbs
pause
とした。pauseを入れて、完了しても勝手に終わらないように。勝手に終わると、異常終了したのかちゃんと完了したのかわからないので。
で、WSHの実行は、コマンドライン版のcscriptで実行する。普通に指定するとwscriptで実行しちゃうからね。あれだと進捗がわかりにくい。
で、実際の実行はsettings.vbs。こんな感じ
'*******************************************************************
'*初期値設定
'対象フォルダ
' -s(--source、--src)送信元
src_path="\\sorce\HDC-TM45"
' -d(--destination、--dst)送信先
dst_path="\\destination\HDC-TM45"
'*******************************************************************
' デバックしたい場合は下記コメントを外してPopupを使用すると便利。
Dim shell
Dim shellRun
Set shell = WScript.CreateObject( "WScript.Shell" )
' shell.Popup("メッセージボックス")
'WScript.Echo dst_path_tmp2 & "\" & strFileName
Set colFileSystem = CreateObject("Scripting.FileSystemObject")
ChkFolders src_path,dst_path 'main呼び出し
Set shell = Nothing
Set colFileSystem = Nothing
'以下関数***********************************************************
'ディレクトリチェック
Private Sub ChkFolders(src_path_tmp,dst_path_tmp)
' 指定したフォルダを表すFolderオブジェクトを返します。
Set objParent = colFileSystem.GetFolder( src_path_tmp )
' フォルダ内に存在する全てのサブフォルダを返します。
Set colFolder = objParent.SubFolders
'指定されたフォルダ内の全てのサブフォルダに対してループします
For Each objFolder In colFolder
strFolderName = "\" & objFolder.Name ' サブフォルダの名前を取得
'コピー先のフォルダ確認
If colFileSystem.FolderExists(dst_path_tmp & "\" & objFolder.Name) = False Then
colFileSystem.CreateFolder(dst_path_tmp & "\" & objFolder.Name)
End If
ChkFiles src_path_tmp & strFolderName,dst_path_tmp & strFolderName,strFolderName
Next
Set objParent = Nothing
Set colFolder = Nothing
End Sub
'以下関数*******************************************************************
'ディレクトリチェック
Private Sub ChkFiles(src_path_tmp2,dst_path_tmp2,folder_name)
' 指定したフォルダを表すFolderオブジェクトを返します。
Set objParent2 = colFileSystem.GetFolder( src_path_tmp2 )
' フォルダ内に存在する全てのファイルを返します。
Set colFiles2 = objParent2.Files
'指定されたフォルダ内の全てのファイルに対してループします
For Each objFile In colFiles2
strFileName = objFile.Name ' ファイルの名前を取得
' mpgファイルのコピー
ret = InStr(strFileName,".mpg")
If ret <> 0 And IsNull(ret) = False Then
'存在しなかったときだけ対象とする
If colFileSystem.FileExists(dst_path_tmp2 & "\" & strFileName) = False Then
'コピー
colFileSystem.CopyFile src_path_tmp2 & "\" & strFileName,dst_path_tmp2 & "\" & strFileName
'ファイル作成日時変更
Dim sDateArry
Dim sTimeArry
Dim sDate,sDay,sTime,sH,sM,sS
rettmp = InStr(strFileName,"_")
If rettmp <> 0 And IsNull(rettmp) = False Then
sDateArry = Split(strFileName,"_")
sDay = sDateArry(0)
sTimeArry = Split(sDateArry(1),".")
sTime = Replace(sTimeArry(0),"(2)","")
sH = Mid(sTime,1,2)
sM = Mid(sTime,3,2)
sS = Mid(sTime,5,2)
sTime = sH & ":" & sM & ":" & sS
sDate = sDay & " " & sTime
End If
'日付型ではなかった場合、フォルダ名で代替
If IsDate(sDate) = False Then
sDate = folder_name & " 00:00:00"
End If
'日付型だった場合だけ更新
If IsDate(sDate) = True Then
shell.Run "touch.exe -C -d """ & sDay & " " & sTime & """ """ & dst_path_tmp2 & "\" & strFileName & """",1,True
shell.Run "touch.exe -M -d """ & sDay & " " & sTime & """ """ & dst_path_tmp2 & "\" & strFileName & """",1,True
End If
'アスペクト比変更
ret2 = InStr(strFileName,".mpg")
If ret2 <> 0 And IsNull(ret2) = False Then
WScript.Echo "reaspectcmd.exe -r -o3 """ & dst_path_tmp2 & "\" & strFileName & """"
shell.Run "reaspectcmd.exe -r -o3 """ & dst_path_tmp2 & "\" & strFileName & """",1,True
End If
End If
End If
' JPGファイルのコピー
ret3 = InStr(strFileName,".JPG")
ret4 = InStr(strFileName,".jpg")
ret5 = InStr(strFileName,".JPEG")
ret6 = InStr(strFileName,".jpeg")
If (ret3 <> 0 And IsNull(ret3) = False) Or (ret4 <> 0 And IsNull(ret4) = False) Or (ret5 <> 0 And IsNull(ret5) = False) Or (ret6 <> 0 And IsNull(ret6) = False) Then
'存在しなかったときだけ対象とする
If colFileSystem.FileExists(dst_path_tmp2 & "\" & strFileName) = False Then
'コピー
colFileSystem.CopyFile src_path_tmp2 & "\" & strFileName,dst_path_tmp2 & "\" & strFileName
End If
End If
Next
Set objParent2 = Nothing
Set colFiles2 = Nothing
End Sub
送信元と送信先を指定して実行すると、一連の作業を自動でおこなってくれる。
ファイルのコピーはFileSystemObjectを使う。
作成日時の作り方は、ファイル名から。HDC-TM45で撮った動画は、ファイル名がそのまま日時になっているので、そこから抽出して分解し日付型でセットしている。
アスペクト比の変換は、1ファイルあたりかなりかかる。これを非同期で実行しているとパソコンがフリーズするので、同期して一つずつ終わらせていくために、shell.Runの最後の引数をTrueにして実行している。
コピー対象はjpgとmpgのみ。AVCHDはどうせ
インターネットAQUOSでは再生できないので、NAS側には移動しない。
フォルダの階層はこんな前提。
HDC-TM45
└yyyy-mm-dd
└xxx.mpg
└xxx.jpg
一連のセットを一つのフォルダに入れ、start.batを叩くと実行される。あとはしばらく放置。
コピペプログラマ倉庫のwshに置いとくので、参考にしてください。
免責
この記事やプログラムによって生じた事故・損害などは一切保証致しません。ご自身の責任でご使用ください。
子育てブログ「
おとう日記」はじめました。
興味ある方、是非ご覧下さい!
おとう日記
コピペプログラマの倉庫を作りました。
サンプルプログラムなど置いておきますのでお立ち寄り下さい。
コピペプログラマ倉庫
良ければ↓投票お願いします↓ m(._.)m ペコッ
人気ブログランキングへ