메타데이터를 기반으로 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 …단일 명령줄이나 스크립트에서 첫 번째 명령과 두 번째 명령( )을 실행할 수 있도록 하려면 어떻게 해야 할까요 ?

또는 .mov 비디오 파일의 수정(또는 생성) 시간을 비디오 파일의 메타데이터에서 읽고 다른 방식으로 운영 체제 수준에서 설정해야 합니다. 어떻게? (BTW: 일부 파일에는 Media Modify Date메타데이터 필드가 모두 0일 수 있기 때문입니다.파일 생성자: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귀하의 경우처럼 이 시간을 UTC로 해석해야 한다고 알립니다. 둘 다 동일한 결과를 얻어야 합니다.

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

관련 정보