動画をipadで視聴できるmp4へ変換する

ffmpegを使って、ipadで視聴できる動画へ変換するメモです。

iTunesを使ってipadに動画を同期しようとしても「hoge.mp4はこのiPadでは再生できないためコピーされませんでした。」のようなメッセージで同期されないことがあります。これは、mp4ファイルがipadの仕様にあっていないためのようです。我が家の場合、画素数が大きいためのようです。そこでipadで視聴できる画素数へ変換する必要があります。

徒労日記 iPhone用動画に使うFFmpegにはキマリがあるのipad用の変換オプションでうまくいくようです。

ffmpeg -i infile.mp4 -s 1024x758 -aspect 16:9 -threads 0 -vcodec libx264 -b 2000k -crf 23.0 -level 30 -qmin 10\
-acodec libfaac -ab 128k -ac 2 -ar 48000 -f mp4 -r 29.97 -y outfile.mp4
としています。 オプションの意味は最新ffmpegのオプションまとめ から引用すると

-s指定した “size” にリサイズする。
-aspect出力ファイルの画面アスペクト比を指定。
-threadsエンコードスレッド数。デュアルコア以上の CPU の場合には2など (CPUのコア数+α)を指定するとエンコードを高速化できる。 x264 を使う場合に限り -threads 0 を指定すると x264 エンコーダ側で自動で (論理CPU数×1.5) スレッドで並列処理される。
-vcodec映像コーデックを指定 (“copy” でストリームの直接コピー)
-bビデオのビットレート指定(bits/s 単位)。500k, 1M といった指定も可能。
-crf固定 “品質” でのエンコードモード (x264 のみ)。
-level映像エンコードのレベル指定。指定可能な Codec は H.263、H.264、MPEG-1/2。具体的な値と意味についてはコーデックの仕様を参照のこと。例えばH.264では16段階定義されている。
-qmin q値の最小値 (デフォルト=2)
x264 ではデフォルトの qmin=2 は小さ過ぎる。少なくとも 10 以上にした方がよい。 qminが小さすぎるとソースによっては黒いバックなどの動きが少ないシーンでグレーの 靄がかかったようなフレーム (“Gray Fogged Frame”) が出来てしまうことがある。
-acodec音声コーデックを指定 (“copy” でストリームの直接コピー)。
-ab音声のビットレート (bits/s 単位)。192k のような指定も可能。
-ac音声のチャンネル数を指定。
-ar音声のサンプリングレートを指定。
-r フレームレートを指定値に変換する。指定しない場合は入力ファイルの値を継承
-y出力時に既存の同名ファイルを警告無しに上書き

ruby スクリプトでbatch 処理

ruby スクリプトでbatch処理させるために、次のようなコードを作りました:

#!/usr/bin/env ruby

ARGV.each{|mp4|
  outfile = mp4.gsub(/\.mp4/, '_ipad.mp4')
  command = "ffmpeg -i #{mp4} -s 1024x758 -aspect 16:9 -threads 0 -vcodec libx264 -b 2000k -crf 23.0 -level 30 -qmin 10 -acodec libfaac -ab 128k -ac 2 -ar 48000 -f mp4 -r 29.97 -y #{outfile}"
  system(command)
}