メタデータに基づいてQuicktimeビデオファイルの変更(または作成)時間を自動的に設定するにはどうすればよいですか?

メタデータに基づいてQuicktimeビデオファイルの変更(または作成)時間を自動的に設定するにはどうすればよいですか?

シェルで単一のコマンド(または単一のコマンドライン)を使用してファイルのメタデータに基づいてQuicktimeビデオファイルの変更(または作成)日時を自動的に設定するにはどうすればよいですか? JPGファイルの場合、exiv2 -T.movファイルに対する同様のコマンドはありますか?

たとえば、次のメタデータを含むvideo.movファイルから始めましょう。

$ exiftool video.mov
ExifTool Version Number         : 12.57
File Name                       : video.mov
Directory                       : .
File Size                       : 64 MB
File Modification Date/Time     : 2023:07:04 02:53:05+02:00
File Access Date/Time           : 2023:07:01 11:42:46+02:00
File Inode Change Date/Time     : 2023:07:04 02:53:05+02:00
File Permissions                : -rw-r--r--
File Type                       : MOV
File Type Extension             : mov
MIME Type                       : video/quicktime
Major Brand                     : Apple QuickTime (.MOV/QT)
Minor Version                   : 0.0.0
Compatible Brands               : qt
Media Data Size                 : 64215615
Media Data Offset               : 36
Movie Header Version            : 0
Create Date                     : 2023:07:01 11:42:00
Modify Date                     : 2023:07:01 11:42:46
Time Scale                      : 600
Duration                        : 0:00:45
Preferred Rate                  : 1
Preferred Volume                : 100.00%
Preview Time                    : 0 s
Preview Duration                : 0 s
Poster Time                     : 0 s
Selection Time                  : 0 s
Selection Duration              : 0 s
Current Time                    : 0 s
Next Track ID                   : 6
Track Header Version            : 0
Track Create Date               : 2023:07:01 11:42:00
Track Modify Date               : 2023:07:01 11:42:46
Track ID                        : 1
Track Duration                  : 0:00:45
Track Layer                     : 0
Track Volume                    : 0.00%
Image Width                     : 1920
Image Height                    : 1080
Clean Aperture Dimensions       : 1920x1080
Production Aperture Dimensions  : 1920x1080
Encoded Pixels Dimensions       : 1920x1080
Graphics Mode                   : ditherCopy
Op Color                        : 32768 32768 32768
Compressor ID                   : hvc1
Source Image Width              : 1920
Source Image Height             : 1080
X Resolution                    : 72
Y Resolution                    : 72
Compressor Name                 : HEVC
Bit Depth                       : 24
Video Frame Rate                : 29.997
Balance                         : 0
Audio Format                    : mp4a
Audio Channels                  : 2
Audio Bits Per Sample           : 16
Audio Sample Rate               : 44100
Purchase File Format            : mp4a
Warning                         : [minor] The ExtractEmbedded option may find more tags in the media data
Matrix Structure                : 1 0 0 0 1 0 0 0 1
Content Describes               : Track 1
Media Header Version            : 0
Media Create Date               : 2023:07:01 11:42:00
Media Modify Date               : 2023:07:01 11:42:46
Media Time Scale                : 600
Media Duration                  : 0:00:45
Media Language Code             : und
Gen Media Version               : 0
Gen Flags                       : 0 0 0
Gen Graphics Mode               : ditherCopy
Gen Op Color                    : 32768 32768 32768
Gen Balance                     : 0
Handler Class                   : Data Handler
Handler Vendor ID               : Apple
Handler Description             : Core Media Data Handler
Meta Format                     : mebx
Handler Type                    : Metadata Tags
Make                            : Apple
Model                           : iPhone SE (2nd generation)
Software                        : 16.5.1
Creation Date                   : 2023:07:01 13:42:00+02:00
Image Size                      : 1920x1080
Megapixels                      : 2.1
Avg Bitrate                     : 11.3 Mbps
Rotation                        : 90

これまでに私が考えることができる最善の方法は、(変更された日付を設定するために)次を読むことです。

$ exiftool video.mov | grep "Media Modify Date" | cut -f 19-20 -d ' '

、私の場合、

2023:07:01 11:42:46

(実際のビデオは13:42:…CEST頃に撮影されたのでUTCまたはGMTに正規化されています)、:出力の日付をに置き換えて-最後にエクスポートします。

$ touch -d "2023-07-01 11:42:46 UTC" video.mov

(私の推測では、この文は上記のUTC文よりも優れていることですGMT。)期待どおりに生成されます。

$ ls --full-time video.mov | cut -d ' ' -f 6-8
2023-07-01 13:42:46.000000000 +0200

(機械はCESTタイムゾーンにあるので+0200)。結果は私たちが望むものです(動画自体が撮影された時間帯もCESTなので)。しかし、そこに到達するプロセスは手動

最初のコマンドシーケンスで日付を処理する方法(exiftool … -d ' '自動的にtouch …単一のコマンドラインまたはスクリプトで最初のコマンドと2番目のコマンド()を実行できるようにするにはどうすればよいですか?

または、.movビデオファイルの変更(または作成)時間をビデオファイルのメタデータから読み、別の方法でオペレーティングシステムレベルで設定する必要があります。どのように? (BTW:一部のファイルにはMedia Modify Dateメタデータフィールドがすべてゼロになる可能性があるためです。ファイルコンストラクタ:ffmpegDate/Time Original、より多くのプログラミングロジックが必要になる可能性があります。この場合、追加および正しくMedia Duration入力されたかどうかなど、他のフィールドの値に切り替えようとすることができます。 )

たぶん、誰かがすでにこれを行っており、適切なパラメータを使用してすでに利用可能なプログラムを実行する必要がありますか?

答え1

exiftoolほとんどのファイルメタデータは検索に加えて設定できるため、次の点を考慮するだけです。

TZ=UTC0 exiftool '-FileModifyDate<MediaModifyDate' ./*.mov

または:

exiftool -api QuickTimeUTC '-FileModifyDate<MediaModifyDate' ./*.mov

または再帰的(サブディレクトリのファイルも更新):

exiftool -api QuickTimeUTC -r -ext mov '-FileModifyDate<MediaModifyDate' .

デフォルトでは、exiftoolQuickTime MOVファイルのメディアタイムスタンプは、QuickTime仕様にUTC(ほとんどのカメラと同じ)でなければならないと指定されていても、現地時間として解釈されます。を使用すると、TZ=UTC0現地時間がUTC(UTCから0オフセット)であることがわかります-api QuickTimeUTC。どちらも同じ結果を得る必要があります。

MediaModifyDateタイムスタンプ(-2082844800エポック時間)で終わらないファイルは、1904-01-01 00:00:00 +0000それがQuickTimeタイムスタンプの元の時間であるためです。

これをスキップするには、次のようにします。

TZ=UTC0 exiftool -d %s -if '$MediaModifyDate != -2082844800' \
  -r -ext mov '-FileModifyDate<MediaModifyDate' .

(後者TZ=UTC0の代わりに使用することは、時間をUnix epoch時間として特別にフォーマットすることと比較しても機能しないようです。これはバグのように見えます。 2082844800)-api QuickTimeUTC-d %s

mtime を設定するには、touch次の手順を実行します。

mtime=$(
  exiftool -api QuickTimeUTC -q -d %s -p '$MediaModifyDate' file.mov
) &&
  [ "$mtime" != '0000:00:00 00:00:00' ] &&
  touch -d "@$mtime" file.mov

(ここに数字を印刷するときを使用すると-api QuickTimeUTC正常に動作するようです-d %s。はい、そうでない場合もわかります。0000:00:00 00:00:00今後は変わる可能性があります。)-2082844800MediaModifyDate

答え2

.mov現在のフォルダ内のすべてのファイルについて:

#!/usr/bin/env bash
for file in *.mov;
do
    t=$(exiftool "$file" | grep "Media Modify Date" | cut -f 19-20 -d ' ')
    t="${t/:/-}"
    t="${t/:/-}"
    touch -d "$t UTC" "$file"
done

関連情報