Mac でさくっと動画変換

youtube-dl 等でダウンロードした動画が QuickTime Player で見られないのは寂しい。mpv や vlc などの動画プレイヤーで再生できるので、見られないわけではない。ただ、QuickTime Player で再生できないファイルは、クイックルックで中身を確認できないのだ。

mkv など、QuickTime Player に対応していない動画を、QuickTime Player にドラッグ&ドロップすると、自動でエンコードをはじめて開こうとする。しかしこの方法は失敗も多い。さんざん待たされて「QuickTime Player can’t open」などと返してきたるする。

ならば ffmpeg でやろう、と思うのだが、いつもそのやり方を忘れてしまうので、シェルスクリプトにした。細かいことはいい、とにかく見られる形にしたい、という人向けである。

ffmpeg

ffmpeg を使用するので、あらかじめインストールしておく必要がある。
 Homebrew でインストールできる(【Mac】 Homebrew を導入する | 林檎コンピュータ)。

brew install ffmpeg

ffmpeg には、かなり豊富なオプションが用意されている。さまざまなことが出来るらしい。
 QuickTime Player で見られる形にする、一番簡単なやり方は以下のようなものであると思われる。

ffmpeg -i INPUT_FILE -vcodec libx264 -acodec aac OUTPUT_FILE.mp4

QuickTime Player が好む動画の形式は、mov と mp4 である。
 mp4 や mov、あるいは flv や wmv はコンテナと呼ばれている。
 コンテナにビデオと音声をつめこんで、閉じたものが動画となるわけだ。mp4 というコンテナが受けつけるビデオは h264、h265、xvid など、と決まっている。音声はたいがい aac だ。

エンコードに時間がかかるのは、なんといってもビデオの部分で、このビデオ部分がすでに h264 なら、あらためてエンコードする必要はない。手早く終わる音声のエンコードだけやって、mp4 コンテナにつめこんでもらえばいい。

動画の圧縮形式は、ffmpeg -i 動画ファイル で調べられる。
 ずらずらと文字列が出てくるが、

Stream #0:0(und): Video: h264

と書いてある部分があれば、これはエンコードしなくてもいいわけだ。
 そういう場合は vcodec に「copy」を使用する。

ffmpeg -i INPUT_FILE -vcodec copy -acodec aac OUTPUT_FILE.mp4

このように書く。
 さらにいえば、ビデオは h264 だし、音声も aac、けどコンテナは mkv というファイルがあったとする。そういう時は、音声もコピーすればいい。

ffmpeg -i INPUT_FILE -vcodec copy -acodec copy OUTPUT_FILE.mp4

無劣化で mp4 に出来る。QuickLook も出来るようになるはずだ。

シェルスクリプト

以上をまとめてシェルスクリプトにした。

📝 encode.sh
#!/bin/sh
# 要 ffmpeg
#
# $ encode.sh 動画ファイル
#
# みたいに使う。
# ===============

if test -z "$1"; then
	exit 0
fi

codec=`ffprobe -show_streams -print_format json "$1" | grep 'codec_name' | sed -e 's/^\ *//g'`

if echo "$codec" | grep -sq 'h264'; then
	video='copy'
else
	video='libx264'
fi

if echo "$codec" | grep -sq 'aac'; then
	audio='copy'
else
	audio='aac'
fi

ext=`echo ${1##*.}`
filename=`basename "${1}" | sed -e "s/$ext//"`

echo "\n"
echo "$codec"
echo 'video:'"$video"' audio:'"$audio"
read -p "Hit Enter(or ctrl + c): "

ffmpeg -i "$1" -vcodec "$video" -acodec "$audio" ~/Desktop/"$filename"mp4

シェルスクリプトの使い方については、【Mac】シェルスクリプトの使い方 | 林檎コンピュータへ。
 上記スクリプトの中で、

ffprobe -show_streams -print_format json "$1"

の部分は、下記サイトを参考にさせていただきました。

🔗 ffmpegの使い方やコマンド一覧をまとめました。動画リサイズ・静止画変換・フレーム補間について

codec_name に h264 と書かれてなければ、とっととエンコードしてしまう乱暴なスクリプトなんだけど、短い動画はひとまずこれでいいと思っている。