mattintosh note

どこかのエンジニアモドキの備忘録

Finder で選択した動画から ffmpeg で音声を抽出する

Automatorffmpeg を使って Finder の選択項目から音声を抜き出したりするためのシェルスクリプトを考えてみた。サービスとして登録し、Finder のコンテキストメニューから呼び出せばターミナル上で ffmpeg を使って処理を行う。拡張子抽出部分はテストソースがあまりなかったのでもしかしたら失敗するかも。

オーディオ抽出

動画からオーディオを抽出する。拡張子はソースのオーディオファイル形式を検索して付与する。最近の動画は AAC を使っていることが多いのでそのまま抜き出しても iTunes に登録できないため後述のコンテナ化を使用。

# template: services
# source: file or directory
# mode: stdin

while read f
do
    [ ! -f "$f" ] && continue
    extension=`ffmpeg -i "$f" 2>&1 | egrep -o "Audio: \w+" | cut -d' ' -f2`
    printf 'ffmpeg -i "%s" -vn -acodec copy "%s"\n' "$f" "$f".$extension
done > ${S:=/tmp/ffmpeg_$$}
echo "afplay /System/Library/Sounds/Hero.aiff" >> $S
chmod +x $S; open $S

オーディオ抽出 + MP4 コンテナ化

オーディオ抽出後、AAC であればそのままコンテナ化し、AAC 以外なら変換してからコンテナ化する。別途、faac が必要。

# template: services
# source: file or directory
# mode: stdin

while read f
do
    [ ! -f "$f" ] && continue
    case `ffmpeg -i "$f" 2>&1 | egrep -o "Audio: \w+" | cut -d' ' -f2` in
        aac)
            printf 'ffmpeg -i "%s" -vn -acodec copy "%s"\n' "$f" "$f".m4a
        ;;
        *)
            printf 'ffmpeg -i "%s" -vn -acodec libfaac -ac 2 -ar 48000 -aq 100 "%s"\n' "$f" "$f".m4a
        ;;
    esac
done > ${S:=/tmp/ffmpeg_$$}
echo "afplay /System/Library/Sounds/Hero.aiff" >> $S
chmod +x $S; open $S