【Mac】m4a ファイルに画像を貼付

atomicparsley というコマンドを使うと、m4a 形式のオーディオファイルに画像を貼付できる。ファインダーや QuickLook で表示される m4a ファイルに、ジャケットみたいに画像がつく、あれだ。
 atomicparsley は mp4 ファイルの ID タグを操作するコマンドで、Homebrew で簡単にインストールできる。

brew install atomicparsley

atomicparsley でアートワークを設定する

基本はatomicparsley m4aファイル --artwork 画像ファイルでいいようだ。
 画像形式は jpg か png である。

atomicparsley /path/to/INPUT.m4a --artwork /path/to/art.jpg

元のファイルはイジらず、ファイル名-temp-番号.m4aというファイルが新たに生成される。
 また、指定した画像のファイルサイズが大きい場合は atomicparsley が画像をリサイズして新たに生成してくれる。
 m4a ファイルからアートワークを削除するには、以下のように書く。

atomicparsley /path/to/INPUT.m4a --artwork REMOVE_ALL

複数のファイルをいっぺんに処理する

録音した radiko のファイルが溜まってきたので、これに画像を貼付したいのだが、数が多すぎてひとつひとつ処理するのはダルい。
 なのでシェルスクリプトを書いた。

-fというオプションをつけて m4a ファイルの入ったフォルダをターミナルに投下する。
 あるいは m4a ファイルひとつを指定する。
 sh artwork.sh -f フォルダ 画像ファイルという感じ。
 フォルダ内に「temp」というフォルダを作り、出来上がったファイルはそのなかに格納される。

📝 artwork.sh

#!/bin/zsh

# atomicparsley で m4a ファイルにイメージを添付するスクリプト
# -f をつけてフォルダをターミナルに投下する。
# フォルダ内のすべての m4a にアートワークが添付される。
#
# sh artwork.sh -f path/to/dir path/to/image.jpg
#
# もしくはフォルダのかわりに m4a ファイルそのものを指定する。
# その場合はオプションは必要ない。
#
# sh artwork.sh path/to/audio.m4a path/to/image.jpg

artwork=""; audio=""; dir=""; dir_on="off";

while [ $# -gt 0 ]
do
    case $1 in
        *.jpg) artwork="$1" ;;
        *.jpeg) artwork="$1" ;;
        *.png) artwork="$1" ;;
        *.m4a) audio="$1" ;;
        -f) shift; dir="$1" ;;
        *) break ;;
    esac
    shift
done

if [ -z "${dir}" ]; then
    if [ -z "${audio}" ]; then
        echo 'オーディオファイルかフォルダの入力が必須です。'
        exit 0
    else
        dir=`dirname "${audio}"`
        filename=`basename "${audio}"`
    fi
else
    dir_on="on"
fi

cd "${dir}"
if ! test -e 'temp'; then
    mkdir 'temp'
fi

if [ -z "${artwork}" ]; then
    echo 'アートワークの入力が必須です(jpg or png)'
    exit 0
fi

IFS_BACKUP=$IFS
IFS=$'\n'
if test "$dir_on" = 'off'; then
    atomicparsley "${audio}" --artwork "${artwork}"
    fname=`echo ${filename%.*}`
    tempfile=`echo "${fname}"'-temp-'`

    for f in $(ls .);
    do
        if echo "$f" | grep -sq "$tempfile"; then
            mv "$f" temp/"$filename"
        fi
    done
else
    for M4A in $(ls .);
    do
        ext=`echo ${M4A##*.}`
        if test "$ext" = 'm4a'; then
            filename=`basename "${M4A}"`
            fname=`echo ${filename%.*}`
            tempfile=`echo "${fname}"'-temp-'`
            atomicparsley "${M4A}" --artwork "${artwork}"
                for t in $(ls .);
                do
                    if echo "$t" | grep -sq "$tempfile"; then
                        mv "$t" temp/"$filename"
                    fi
                done
        fi
    done
fi
IFS=$IFS_BACKUP

sh artwork.sh -f path/to/DIR path/to/IMAGE.jpgというように使う。

atomicparsley によって画像がリサイズされて出力されることがあるが、その画像は特に片づけたりしないので注意。

mp4box でもできる

mp4box は mp4 コンテナを作ったりするコマンドだ。この mp4box でも m4a ファイルに画像を貼付できる。このコマンドもまた Homebrew でインストール可能だ。

brew install mp4box

ただ、mp4box の場合は jpg や png という画像形式は使えず、heic でないと駄目らしい。heic は iPhone で撮影された画像などでよく使われる。
 heic への変換はプレビュー.app でも出来るが、コマンドで行うなら sips が便利だ。

sips --setProperty format heic path/INPUT.png --out path/OUTPUT.heic

mp4box をもちいたアートワークの貼付は以下のように書く。

mp4box -itags cover="path/to/IMAGE.heic" INPUT.m4a

画像を削除する場合は以下のように書く。

mp4box -itags cover=NULL path/INPUT.m4a

mp3 に画像を貼付する

mp3 ファイルに画像を貼付する場合は、eyed3 というコマンドが便利だ。このコマンドも例によって Homebrew でインストールできる。

brew install eye-d3

画像の貼付は以下の通り。

eyed3 --add-image path/to/IMAGE.jpg:FRONT_COVER path/to/INPUT.mp3

画像の削除はこう書く。

eyed3 --remove-all-images path/to/INPUT.mp3

eyed3 は、atomicparsley と違い、複数の mp3 を一度に処理できる。

eyed3 --add-image IMAGE.jpg:FRONT_COVER INPUT01.mp3 INPUT02.mp3 INPUT03.mp3

かなり便利なのだが、何点か試してみて、どうしても画像を貼付できない mp3 があった。
 原因はよくわからない。