こんにちは、エンジニアのオオバです。

今まで普通にアップロードできていたのですが、最近SONYハンディカムで撮影したMTSファイルの一部がGooglePhotosにアップできなくなる現象が発生しました。原因不明案件です。

急にMTSがGooglePhotosにアップロードできなくなったので応急処置をした_0

このようにエラーになってしまいます。

ちなみに、ブラウザ経由でファイルをD&DしてGooglePhotosへアップロードしています。諸事情でアプリは使用していません。

ぼくは子供の写真や動画を外付けローカルハードディスクとGooglePhotosの2つのバックアップで運用しています。
中でもGooglePhotosは両親への共有という役割も兼ねているため、この状況は非常に困りました。

そこでテクノロジーの力を使ってなんとかしてみます。

→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

exif情報は据え置きでmp4へ変換

ハンディカムで書き込まれたMTSのファイル自体に問題があるのではないかという仮設から、とりあえず他の動画フォーマットに変換してみてアップロードを試してみることにしました。

結果、mp4に変換してみた所、GooglePhotosへのアップロードが成功しました。

しかしこのままでは、GooglePhotosへアップロードされた動画ファイルのソート順はアップロードしたタイミングとなります。理想は撮影タイミングでのソートです。
GooglePhotosのビューワーはexif情報に基づいてファイルソートしているため、exif情報を引き継ぐことは必須の要件となり、ffmpeg -i hoge.mts hoge.mp4という感じでただ単に変換すればOKということではありません。

そこで、exiftoolを使用して変換前のmtsのexif情報を保持し、変換後のmp4に書き込むという処理をはさみます。
※サンプルコードは記事の最後に載せています。

MTSとmp4のexif情報はフォーマットが異なる

ここはハマりポイントでした。てっきりMTSとmp4のexifフォーマットは同じかと思っていたのですが違いました。
何故気づいたかというと、うまく動かなかったからです。

exiftool -s 動画ファイルパス  

とexiftoolのコマンドを実行すると、その動画に含まれるexif情報の全てがが列挙されます。
MTSファイルとmp4それぞれ実行してみると、フォーマットが違うことが分かります。

今回はファイル生成タイミングを操作したいため、そのプロパティを探します。

結論、MTSの場合は DateTimeOriginalで、mp4は CreateDateというプロパティ名なので実装する際は注意が必要です。

結局原因は不明だがなんとかなった

原因は追えていませんが、とりあえずなんとかGooglePhotosに動画をアップできるようになりました。
今まで普通にアップロードできていたので、原因としてはハンディカムが故障している、GooglePhotosの仕様が変わったということが考えられますが、ググっても情報が出てこないので、前者の可能性かなと思っています。

非常にニッチな内容で需要はほぼ無い気はしますが、以下にソースをアップしております。使い方はREADME.mdを見てください。
GitHub - baobao/mts2mp4cloneExif

ひとこと

あけましておめでとうございます。
そろそろ新しいカメラが欲しいです。

オススメ記事
検証環境