2012年3月10日土曜日

HDC-TM45で撮ったデータ を sonyのPMB で見れるようにする

ここのところ作り込んでいたものができたので紹介したい。

といっても、かなりレアケースなので、この記事が役に立つ人がいるか不明だが。
まぁ部分的には使えるところもあるだろう。

経緯

以前、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 ペコッ
人気ブログランキングへ

0 件のコメント:

コメントを投稿