いろいろと撮影した動画が溜まってきたので管理をしたい。そこで必要になるのが撮影日付です。 なんとかシステマチックに抽出できないかと思って、試しておりました。
コマンドラインで抽出する
ffmpegを使うと、対照ファイルからmetadataが抽出できます。
そこから、作成日時を指すcom.apple.quicktime.creationdate
で検索しましょう。
$ ffmpeg -i target.MOV -f ffmetadata pipe:1 2>/dev/null | grep com.apple.quicktime.creationdate com.apple.quicktime.creationdate=2021-01-17T16:12:43+0900
com.apple.quicktime.creationdate
は動画ファイルの作成日が格納されるキーとして仕様に定義されているものです。
- https://www.w3.org/2008/WebVideo/Annotations/drafts/ontology10/CR/mappings_tested/Quicktime.htm
- QuickTime File Format Specification
また、ExifToolでも同様の情報が抽出できます。
$ exiftool -CreationDate target.MOV Creation Date : 2021:01:17 16:12:43+09:00
Javaで抽出する
様々なメディアファイルからメタデータを抽出できるmetadata-extractorがあるので、これを利用します。
このライブラリを使うと、以下のような形でcreationDate
が抽出できます。
ライブラリのソースコードを見ても、com.apple.quicktime.creationdate
が登場しているのが確認できますね。
package de.kiririmo.keymapper; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Metadata; import com.drew.metadata.mov.QuickTimeDirectory; import de.kiririmo.MovieUploadException; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; public class QuickTimeCreationTimeKeyMapper implements MovieFileKeyMapper { @Override public String map(File movieFile) throws RuntimeException { Metadata metadata = null; try { metadata = ImageMetadataReader.readMetadata(movieFile); Collection<QuickTimeDirectory> directories = metadata.getDirectoriesOfType(QuickTimeDirectory.class); // 作成日付のメタデータ抽出 Date creationDate = directories.stream() .map(d -> d.getDate(QuickTimeDirectory.TAG_CREATION_TIME)) .filter(d -> d != null) .findAny() .orElseThrow(() -> new RuntimeException(String.format("Error occurred in parsing %s metadata", movieFile.getPath()))); SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); return String.format("%s/%s", formatter.format(creationDate), movieFile.getName()); } catch (ImageProcessingException | IOException e) { throw new MovieUploadException("Failed to generate Object Key for S3", movieFile, e); } } }```