理系学生日記

おまえはいつまで学生気分なのか

MOVファイルから撮影日時を抽出する

いろいろと撮影した動画が溜まってきたので管理をしたい。そこで必要になるのが撮影日付です。 なんとかシステマチックに抽出できないかと思って、試しておりました。

コマンドラインで抽出する

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は動画ファイルの作成日が格納されるキーとして仕様に定義されているものです。

また、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);
        }
    }
}```