GooglePhoto容量無制限廃止への対応~容量をできるだけ消費せずに、大量の写真・動画を詰め込む~

2021年の5月末までは、無制限でアップロード可能だったGooglePhoto。 それ以降にアップロードした画像・動画は、Googleアカウントの容量(無料だと(他のサービスと共有の)15GB)を消費するようになりました。

GooglePhotoの使い勝手はとても良く、ある程度実用できるレベルの検索機能や、数年前の同時期の写真を定期的に表示してくれたり、顔認識によるカテゴライズも便利ですし、何よりも一覧性がとても優れています。

私は日頃から大量の写真・動画を撮影するため、15GBの容量はすぐにいっぱいになってしまいます。 新たにアカウントを作ったりもしましたが、一覧性が落ちてしまいますし、案の定1年も持たずに容量が足りなくなりました。

そこで、GooglePhotoを閲覧・検索用に特化して、

  • 元ファイルは、PCに移してバックアップしておくことを前提に、
  • 画質をギリギリまで落として、GooglePhotoに全部入れる

ことを目的に、計画を立てました。

まずは、新しいGoogleアカウントを作成し、この中で実験を行います。

うまくいきそうだったら、2021年5月末までに全写真を入れていたアカウントに改めて全ファイルをアップロードするつもりです。

(なお、今回はじめてタグを使ってみました。まだ、よくわかっていません・・・)

1. 素材

 1.1. 写真・動画データ

  • 写真: 19,064枚
  • 動画: 4,127本 (合計約55時間15分)

2021年6月以降に自分のスマホで撮影した写真(1,472枚 + 7,792枚)が主で、その他に妻が2019年10月以降にスマホで撮影した写真(3,525枚)や、第一子誕生後から、義理の母が撮影したコンパクトデジカメの写真(5,200枚)、その他、自分がコンパクトデジカメや一眼レフで撮影した写真(1078枚)が含まれます。

動画データも、データ元は同じような感じです。(一箇所にまとめたので個々の数は不明)

データの形式は、

写真の解像度は色々ですが、一応それぞれの機器の最大解像度で撮っているものがほとんど。

動画の解像度は FHD (1920×1080) がほとんどで、ごく一部のみ 4K

 1.2. 環境と、使用したアプリケーション

  • PC (Windows10)
  • 画像の再圧縮: Ralpha Image Resizer ver.170111
  • 動画の再圧縮: Handbrake ver.1.3.3 (2020061300)
  • タイムスタンプの修正: 「ファイルの更新日時をファイル名に付けるツールとそれを戻して更新日時へ反映するツール v1.0」 のVBスクリプトを一部改変して使用

2. 再圧縮

GooglePhotoへのアップロード時、写真の日時は、Exifに書き込まれているものが利用されるので、であまり気にしなくて良い(Exif保持で再圧縮した場合)

しかし、動画の日時は、何も考えずに再圧縮してアップロードすると、再圧縮した日時になってしまう。

動画の日時には、「メディアの作成日時」があればこれが使われる。(Handbrakeで再圧縮すると、エンコード日時がこのプロパティに設定される。「メディア作成日時」は、エクスプローラから「プロパティ」→「詳細」で確認/変更できる)

「メディア作成日時」が空の場合は、「ファイルの更新日」が利用される。アップロード時に、時系列に並ぶようにするには、ファイルの更新日時を何らかの方法で保持しておいて、再圧縮後のファイルのタイムスタンプを修正する必要がある。

後に詳細に手順を書くが、今回は、

  1. ファイル更新日を、ファイル名先頭に付加
  2. 再圧縮
  3. ファイル名の先頭部分をもとに、ファイルの更新日を修正
  4. 「メディア作成日時」プロパティを削除

という手順で対処した。

 2.1. 画像の再圧縮

スマホの小さな画面で閲覧することを想定して、ギリギリまで品質を落とすことにした。

Ralpha Image Resizer

  • 大きさ: 長辺基準(px)、長辺 1920 px
  • JPEG設定:
    • 品質 30
    • 出力ファイルサイズを制限する
      • 200 KB
      • 品質下限 15
      • サブサンプリング 4:2:0
  • Exif情報を保持する
    • Exif情報の画像サイズを更新する

f:id:hikouseki:20220225121343p:plain
Ralpha 設定

この設定で、全フォルダをぶち込んで、一括変換。 (マルチスレッドなこともあり、変換速度はかなり高速です!)

 2.2. 動画の再圧縮

一応見えるかな、程度の画質まで、できる限り小さくします。 HEVC(H.265)を利用して、解像度もギリギリまで落とします。 元データはHDDで残しておくので、容量優先のプレビュー用という位置づけです。

  2.2.1. 動画のタイムスタンプ(更新日時)のファイルネーム化

写真の日時は、Exifに書き込まれているのであまり気にしなくて良い(Exif保持で再圧縮した場合)。

しかし、動画の日時は、「メディアの作成日時」が優先される。また、これが空の場合は「ファイルの更新日」が利用される。

スマホ等で撮影した動画の日時は、基本的には「ファイルの更新日時」として保持されているが、Handbrakeで再圧縮すると、「メディア作成日時」に再圧縮の日時が記録されてしまう。また、ファイルのタイムスタンプ、つまり更新日時(作成日時も含む)も、当山再圧縮の日時になってしまう。

そこで、ファイルの更新日時の情報を保持する(あとで更新日時を修正する)ため、ファイル名に日時の文字列を追加しておく。

ここでは、ファイル名の先頭に日付日時の文字列を追加することにした。 例えば、「Movie_123456.mp4」という動画ファイルは、「20211231_134450_Movie_123456.mp4」のように、日付と時刻を8+6桁で加える。

更新日時をファイル名に付ける&戻すツールの詳細情報 : Vector ソフトを探す!

VBスクリプトを参考に、先頭に日付文字列をつけるようにした(このツールをそのまま使うと、ファイル名末尾、つまり拡張子に日付文字列が付加されるため、再圧縮時にmp4ファイルとして認識させにくくなるため。)

具体的には、「SetDt.vbs」の54-55行目を以下のように修正:

     ' ファイル名を設定
        objFile.Name = objFile.Name & strLastModified

     ' ファイル名を設定
        objFile.Name = strLastModified & "_" &objFile.Name 

「RecoverDt.vbs」の27-28行目を以下のように修正:

     ' 更新日時の文字列を取り出す
        strDt = Right(objFile.Name, 15)

     ' 更新日時の文字列を取り出す
        strDt = Left(objFile.Name, 15)

40-41行目を以下のように修正:

     ' ファイル名を短く設定する
        objFile.Name = Left(objFile.Name, Len(objFile) - 15 )

     ' ファイル名を短く設定する
        objFile.Name = Right(objFile.Name, Len(objFile) - 16 )

または

     ' ファイル名を短く設定する
        ' objFile.Name = Right(objFile.Name, Len(objFile) - 16 )

と修正。(ファイル名に付加した日付文字列はそのまま残しつつ、更新日時をファイル名から再設定する。私はこちらを採用)

全動画ファイルを「SetDt.vbs」スクリプトに Drag & Drop して、ファイル名に日時を付加しておく。

※あまり大量のファイルを一度に Drag & Drop すると、引数が長すぎると言われるので、適当な数に減らして、地道に適用していく。フォルダ以下すべてのファイルに適用するようにスクリプトを書き直したら楽かも。今回は少し手間を掛ければできる範囲だったので、地道に行きました・・・。

なお、再圧縮前の動画ファイルは、フォルダ分けされて分散していました。元ファイルのフォルダ階層は維持したかったので、エクスプローラの検索機能で抽出して、スクリプトに放り込む感じで処理しました。

※例えば、データの入っている一番上の階層で、「.mp4」や「.mov」で検索

その後、再圧縮時には、元動画ファイルは一箇所にまとめておいたほうが良いので、空のフォルダに、検索した全動画ファイルのシンボリックリンクを集めました。

f:id:hikouseki:20220307224456p:plain
シンボリックリンクで動画ファイルを一つのフォルダにまとめる
※Explzhの機能を使いました。別にも、便利なツール類があるかと思います。

ディスク容量に余裕があれば、シンボリックリンクにしないで、ファイルをコピーして集める、でも良いかと思います。

なお、動画ファイルのシンボリックリンクが大量に入ったフォルダを指定することで、後述の Handbrake で一括再圧縮処理することができます。

  2.2.2. 動画の再圧縮

Handbrake Ver.1.3.3 (2020061300) を使用(※結構昔のバージョンなのは、たまたま入れてたのをそのまま使ったから。基本的には、最新のものを使ったほうが良いと思います)

まずは、適当な動画ファイルを一つ読み込んだ状態で、以下のプリセットを作成します。 かなり低品質ですが、容量は元の100分の1位にまで低減できました。 (※一応見えるかな、程度の画質です。元データはHDDで残しておくので、容量優先のプレビュー用という位置づけです)

参考:

撮影した動画 32分33秒 を、再圧縮した例、

元データ (HEVC(H.265), FHD1920×1080) … 3.54GB

HEVC(H.265)720x406 … 38MB

  • Dimensions: Anamorphic を Looseに、Width 720 に設定

※後述の、Add Preset での解像度設定の方が重要

f:id:hikouseki:20220303165643p:plain
Dimensionsの設定

*Filters: すべてOFF (ソースがプログレッシブなので)

f:id:hikouseki:20220303165804p:plain
Filtersの設定

  • Video: Video Codec を H.265(x265)、Quality を Constant Quality 38 RF、Encode Preset を Medium に。

f:id:hikouseki:20220303170004p:plain
Videoの設定

f:id:hikouseki:20220303170956p:plain
Audioの設定

f:id:hikouseki:20220303171047p:plain
Add Presetでの設定

f:id:hikouseki:20220303171122p:plain
Add Preset の Audio: [Selection Behavior] での設定

「Folder (Batch Scan)」から、改めてフォルダ内すべての動画ファイルを読み込みます。

動画ファイルの数が多いと、読み込みだけでかなりの時間待たされます。(数十分とか)

f:id:hikouseki:20220307225109p:plain
読込中・・・
でも、いつか終わると思うので、気長に待つしかありません。

読み込んだら、先程作成したプリセットを指定し、「Add to Queue」ボタンから、「Add All」します。

f:id:hikouseki:20220307225221p:plain
Add All する

これがまた、大量のファイルだった場合、かなりの時間待たされます。 これが終わらないとエンコードを開始できないので、待つしかありません。

キューに追加されたら、ようやく「Start Queue」から再圧縮を開始します。

PC性能・動画ファイルの総時間によって大きく変わると思いますが、私の場合で、エンコードには丸一日位かかりました。

  2.2.3. 再圧縮後の動画のタイムスタンプ(更新日時)の修正

まず、「メディアの作成日時」を削除しておく必要があります。 (※HandBrakeで再圧縮した際に、自動的に設定されてしまいます)

f:id:hikouseki:20220307230700p:plain
メディアの作成日時部分に、再圧縮時の日付時刻が設定されている

再圧縮後の全動画ファイルを選択(エクスプローラから Ctrl+A)したまま、右クリックしてプロパティを開くと、「詳細」タブの「メディアの作成日時」部分に「(複数の値)」と表示されているはずです。以下の手順で、これだけを削除します。

左下の「プロパティや個人情報を削除」をクリックして、「このファルから次のプロパティを削除」を選び、「メディアの作成日時」の項目にチェックを入れ、OKを押します。

f:id:hikouseki:20220308000045p:plain
「メディアの作成日時」だけを削除する

以上で、「メディアの作成日時」が空になりました。

次に、先に説明した、修正済みの「RecoverDt.vbs」に、再圧縮後の動画ファイルを Drag & Drop することで、ファイル名に文字列として退避しておいた(動画の撮影日時である)ファイルの更新日時を、復帰します。

3. アップロード

いよいよ、再圧縮した写真・動画をGooglePhotosにアップロードするのですが、手順には注意が必要です。

 3.1. 「元の画質」でアップロード

GooglePhotoのアップロード設定では、「元の画質」に設定しておきます。

f:id:hikouseki:20220307231413p:plain
GooglePhotoでは、「元の画質」に設定しておく

その上で、再圧縮済みの写真・動画をアップロードします。

日付が意図したとおりに、正しく反映されているかを確認しましょう。

 3.2. GooglePhoto上での再圧縮

「元の画質」でアップロードすると、当然ながら、アップロードした容量分(ここでは8.1GB)、Googleアカウントのストレージを消費します。

f:id:hikouseki:20220307232036p:plain
消費容量(8.1GB)は、アップロードした容量と同一(※「元の画質」設定なので当然)

一旦「元の画質」でアップロードしたあとで、「容量の開放」から、GooglePhoto上での再圧縮を行う。

f:id:hikouseki:20220307232203p:plain
「容量を開放」で、GooglePhoto上での再圧縮を行う
f:id:hikouseki:20220307232302p:plain
「容量の開放」を実行
f:id:hikouseki:20220307232336p:plain
「容量の開放」には時間がかかる

再圧縮には時間がかかるので、一日以上おいてから、容量がどうなったか確認するとよいかと思います。

再圧縮後、以下のように、Googleアカウントの消費ストレージ量が、8.1GBから303MBに減少しました。

f:id:hikouseki:20220307232440p:plain
8.1GB消費→再圧縮後、303MBしか消費していない状態に

...ものすごく節約できています!!!

4. ダウンロードした場合などの比較

上記の手順でアップロードした場合と、「保存容量の節約画質」を選択した状態でアップロードした場合の差異を比較します。

  • 撮影した動画 (32分33秒)
    • 元データ (HEVC(H.265), FHD1920×1080) … 3.54GB
    • 再圧縮(Handbrake) → HEVC(H.265)720x406 … 38MB
    • 「元の画質」でアップロード … [38MB消費]
      • その後、「容量を開放」 … [38MB消費]
      • これをダウンロードすると、[116MBの H.264 動画] としてダウンロードされる
    • 「保存容量の節約画質」を選択した状態でアップロードすると … [116MB消費]
      • これをダウンロードすると、[116MBの H.264 動画] としてダウンロードされる

・・・つまり、始めから「保存容量の節約画質」の状態でアップロードすると、逆に容量が増えてしまう場合があるようです。 (これは、GooglePhotoで再圧縮された際に、H.264形式になってしまうからかもしれない)

いったん「元の画質」でアップロードすると、「容量の開放」で再圧縮をかけると、結果的に逆に容量が増えるような場合は、元の容量分しか消費しないようです。(この例だと、「元の画質」でアップロード時の38MB分しか消費していない状態になる) ダウンロードすると、そのときにH.264形式に再エンコードされるということなのかどうなのかわかりませんが、消費している容量よりも大きな容量のファイルとしてダウンロードされました。

※GooglePhoto上で動画の情報を見ると、38MBなのに、ダウンロードすると116MBのファイルになる。

これは、ちょっと興味深い挙動です。

5. まとめ(注意すべき点)

  • 動画ファイルは、更新日時を保持する! (「メディアの作成日時」も空にしておく)
  • アップロード前に、許容できるギリギリの品質まで、画像・動画を再圧縮しておく
  • アップロード時は、いったん「元の画質」で
  • アップロード後に、「容量の開放」で容量削減

以上の手順により、

  • 写真: 19,064枚
  • 動画: 4,127本 (合計約55時間15分)

を、わずか 303MB のストレージ消費に抑えることができました!!