ずっと前に撮りためていたビデオの整理をしてみることにした。
前々から整理しなければとは思っていたけど、面倒くさくて放置していたけど、コロナ禍ということもあり、これを機に頑張ってみた。
かなり昔の8ミリビデオで撮った動画については、アナログで劣化やテープ自体の損傷等の心配もあったので、デジタル化(MPEG)だけは済ませていたんだけど、このmpg(ムービークリップ)化したファイルは、iPhoneで直接再生できないし、1本が120分ぐらいとバカでかいファイルになっていた。
なので、昔のビデオを分割&変換する地道な作業を頑張ってみた。
まずは、120分のやたらでかいmpgファイルを分割。
と思ったけど、分割する動画編集ソフトが無い。。
動画編集を日々行う訳でないので、できるだけ無料で済ませたい。
ちょっと調べてみると、Windows標準の「フォト」アプリで動画分割できるっぽい。
でも、拡張子mpgファイルは対象外。
ということで、まずは「フォト」アプリが使用できる拡張子mp4に変換してみることに。
(あまり、編集を繰り返すと、画像劣化してしまうので必要最小限に)
もくじ
mpgファイルからmp4に変換
MPG(MPEG1、MPEG2)や、AVIファイル等をiPhoneで再生できるMP4ファイルに変換できるソフトを調べてみたけど、以下の2つのソフトが割と使い易かった。
- Leawo 変換スタジオ 7
5分以内の動画であれば無料で変換(試用)できる。
一括変換できるので、大量にファイルがある場合に便利。 - HandBrake
長い動画でも無料で変換可能。
動画の分割
ビデオテープ1本(120分とか)に、何か月分もの動画が詰まっているので、これを日付ごとに分割したい。
上記でmp4に変換したファイルを、Windows 10標準の「フォト」アプリで分割する。
日時の変更
上記のように、変換や分割を行うとファイルの「作成日付」、「更新日時」が変わってしまう。
また、「メディアの作成日時」が変換した日時で保存されている場合もある。
この状態で、Googleフォトにアップロードすると「メディアの作成日時」や「撮影日時」の順で写真がソートされる。
これらが無い場合は「更新日時」等でソートされるようなので、やっぱり、これら日時は修正しておきたい。
修正したら、これら日時が変わるのは当たり前の話だけど、写真はやっぱり実際撮影した日付順で管理したい。
修正手順は以下の通り。
- 修正したいファイルを一括選択し、プロパティを開く
- 「プロパティや個人情報を削除」をクリック
- 「◎このファイルから次のプロパティを削除」を選択し、「メディアの作成日時」をチェックして「OK」をクリック
- ファイルの「作成日時」「更新日時」を「タイムスタンプ変更ツール」で変更する
※単一ファイルの場合、手順3.で「メディアの作成日時」を正しい日時に変更してもOK。
この日付修正が意外と厄介。
変換や分割を行うと、日付が分からなくなってしまうケースもある。
そのような場合は、変換や分割前に、ファイル名を日付形式に修正する等工夫が必要。
今回、いろいろ工夫したときに、ちょっとしたシェル、バッチを作成したので以下ご参考までに。
ファイル名を変換
「yyyy-MM-dd hh.mm.ss yyyy.mp4」形式のファイル名を「yyyyMMdd_hhmmss.mp4」に一括置換するシェル。
例)
変換前:2005-02-27 00.23.44 2005.mp4
変換後:20050227_002344.mp4
sample1.ps1
$scriptPath = $MyInvocation.MyCommand.Path $targetFolder = Split-Path -Parent $scriptPath $itemList = Get-ChildItem $targetFolder; foreach($item in $itemList) { if(! $item.PSIsContainer) { $fileName = $item.Name; $ext = (Get-ChildItem $fileName).Extension; if($ext -ne ".mp4"){ # 拡張子がmp4以外の場合はエラー Write-Host "拡張子が異なります。($fileName)"; continue; // スキップ } $baseName = (Get-ChildItem $item.Name).BaseName; if($baseName.Length -ne 24){ # ファイル名(ベース名)が24桁でない場合はエラー Write-Host "ファイル名が24桁以外です。($fileName)"; continue; // スキップ } $y = $fileName.Substring(0,4); $m = $fileName.Substring(5,2); $d = $fileName.Substring(8,2); $hh = $fileName.Substring(11,2); $mm = $fileName.Substring(14,2); $ss = $fileName.Substring(17,2); Write-Host "${targetFolder}\${y}${m}${d}_${hh}${mm}${ss}.mp4"; Rename-Item -Path "${targetFolder}\${fileName}" -NewName "${targetFolder}\${y}${m}${d}_${hh}${mm}${ss}.mp4" } }
実行方法
powershell -f sample1.ps1
mp4ファイルの更新日時を一括置換
名前が「yyyyMMdd_hhmmss.mp4」形式のファイルについて、作成日時、変更日時、アクセス日時を、一括変換するためのバッチファイルを生成する。
変換は「タイムスタンプ変更ツール」を使用する。
sample2.ps1
$scriptPath = $MyInvocation.MyCommand.Path $targetFolder = Split-Path -Parent $scriptPath $batFile = "タイムスタンプ一括置換.bat"; $itemList = Get-ChildItem $targetFolder; if (Test-Path $batFile) { Remove-Item $batFile; } foreach($item in $itemList) { if(! $item.PSIsContainer) { $fileName = $item.Name; $ext = (Get-ChildItem $fileName).Extension; if($ext -ne ".mp4"){ # 拡張子がmp4以外の場合はエラー Write-Host "拡張子が異なります。($fileName)"; continue; // スキップ } $baseName = (Get-ChildItem $item.Name).BaseName; if($baseName.Length -ne 15){ # ファイル名(ベース名)が15桁でない場合はエラー Write-Host "ファイル名が15桁以外です。($fileName)"; continue; // スキップ } $y = $fileName.Substring(0,4); $m = $fileName.Substring(4,2); $d = $fileName.Substring(6,2); $hh = $fileName.Substring(9,2); $mm = $fileName.Substring(11,2); $ss = $fileName.Substring(13,2); Write-Host "${fileName} ${y}/${m}/${d} ${hh}:${mm}:${ss}"; Write-Output "C:\temp\ChgTime.exe ${targetFolder}\${fileName} ""${y}/${m}/${d} ${hh}:${mm}:${ss}"" ""${y}/${m}/${d} ${hh}:${mm}:${ss}"" ""${y}/${m}/${d} ${hh}:${mm}:${ss}""" | Add-Content $batFile -Encoding Default } } Write-Output "pause" | Add-Content $batFile -Encoding Default
実行方法
powershell -f sample2.ps1
実行すると、”タイムスタンプ一括置換.bat”が作成される。
C:\temp配下にタイムスタンプ変更ツール(ChgTime.exe)を用意しておき、このバッチファイルを実行。
タイムスタンプ一括置換.bat
すると、タイムスタンプが一括変更される。
ちょっと苦しいけど、これで日時の変更は完了。
もう1つおまけ。
ファイル名を変更日時に一括置換
*.MPGファイルのファイル名を、更新日時の名前に一括変換するシェル。
Before | After |
chgFileName.ps1
# ファイル名をファイル変更日時形式の名前に一括置換 # 対象フォルダ(カレントパス) $targetFolder = Convert-Path . # 対象ファイルの拡張子 $targetExt = ".MPG" # 対象フォルダ内の対象拡張子のファイルを一括処理 foreach($item in (Get-ChildItem $targetFolder)) { if($item.Extension -eq $targetExt){ # ファイル更新日時をファイル名にする $fileName = '{0:yyyyMMdd_HHmmss}' -f $item.LastWriteTime + $item.Extension # ファイル名変更 Rename-Item -Path $item.Name -NewName $fileName Write-Host ($item.Name + ' ⇒ ' + $fileName) } }
実行方法
powershell -f chgFileName.ps1
と、まぁ、分割したり、変換したり、撮影日時やファイル日時、ファイル名変更したり、いろいろとあって想像していたより大変だった。
Googleフォトに保管しておけば、iPhoneが見えないファイルも勝手に変換して見えるようにしてくれるし、日付のソートとかも割と簡単にできるし便利だなぁーと思う。
あと、前にNASよりも簡単に写真&動画を管理できる「おもいでばこ」を買ったことがあったけど、これもアリかも知れない。
全力通販で探す。
⇒おもいでばこ
こんばんわ
編集したりすると日付がずれてほんと面倒ですよね、でもGoogleフォトは使いたいw
コンデジの古い画像や動画を整理していてほぼほぼ同様の状態で困っておりましたが
記事の内容のおかげでキレイに整理出来ました、優良な情報ありがとうございましたm(__)m