ffmpeg って色々出来るんだけど、オプションが慣れないとわからないというか。コンテナとかフォーマットとかコーデックとか色々あってね。ちょっと取っ掛かりが分かり難い。僕も色々やってみたけど、「習うより慣れ」でした。
ffmpegの基本
ffmpeg -i 入力ファイル名 その他いっぱいオプション "出力ファイル名.拡張子"
です。最初は上記の構文だけ頭に入れておきます。ffmpeg は使いかたも概念もややこしいので、とりあえずパターンで覚えて、その後に理屈を攻めていけばいいさ
ffmpeg で動画を変換してみる。
適当な動画を一本用意する。とりあえずニコニコ動画から、なんかFLVを一本ダウンロードして用意。
あんまり長いファイルだと、変換時間が長くて勉強テンポが悪い。短すぎるとわかりづらいので1分くらいの動画でいい。
ffmpegのインストールは別に何でもいい。OSに入ってるものや、適当にダウンロードしたバイナリではじめるといいさ。
flvの情報を見てみる。
まず元になった動画のファイル形式を見てみる。
ffmpeg -i sm1715919.flv (ry Stream #0:0: Video: flv1, yuv420p, 320x240, 200 kb/s, 29.97 tbr, 1k tbn, 1k tbc (ry Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s
movファイル
flv→movに変換したものを見てみる。
ffmpeg -i sm1715919.mov Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 137 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 128 kb/s
mp4ファイル
flv→mp4に変換したものを見る
ffmpeg -i sm1715919.mp4 Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr, Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s
mpeg2に変換したもの
ffmpeg -i sm1715919.mpeg Stream #0:0[0x1e0]: Video: mpeg1video, yuv420p, 320x240 [SAR 1:1 DAR 4:3], 104857 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc Stream #0:1[0x1c0]: Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
情報の読み方。
Streamで始まる項目が音声・動画の形式。
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr, Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s
Video:XXXXのXXXが動画のコーデック
Audio:YYYYのYYYYが音声コーデック
コーデックとコンテナに付いての簡単な説明。
あくまでイメージですが、、、こんな感じ。
動画と音声を数秒ごとに分割して、数秒単位に動画+音声が繰り返し現れる。ってイメージ。
この時の切り方、ファイルの折り返し方を定義したのがコンテナ(数式のの部分)
ffmpeg で動画ファイルから音声を抜き出す
Mp3を動画ファイルから作ります。
ffmpeg -i sm1715919.mp4 sample.mp3
出来上がり。簡単ですねー。
ファイルをチェックしてみる。
takuya@air:~/Desktop$ ffmpeg -i sm1715919.mp4 sample.mp3 Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s
ちゃんとMp3だけのファイル。簡単ですねー
音無しの絵の動画だけにする。
逆に、音無し。絵だけにする。動画から音を消してしまう。
ffmpeg -i sm1715919.mp4 -an -vcodec libx264 test-noaudito.mp4
- -an
- audio none とかそういうこと:
これで音声をカットして、動きだけの動画ファイルにする。
縦横比を維持して自動計算
横幅を指定して、残りを自動計算させる。アスペクト比だとか、縦横の比率とか、空白とかちょっと考えたくない。
ffmpeg -i sm1715919.mp4 -vf scale=640:-1 out.mp4
縦横の長さは自動計算。
これも簡単ですね。
ビデオ・コーデックの変換
ファイルのコンテナはそのままに、ビデオのコーデックだけを変換します。
ffmpeg -i sm1715919.mp4 -vcodec libx264 test.mp4
mp4コンテナのビデオ部分は、Mp4コーデックやH264コーデックでもどちらでも構わないので、変換してみる。
2pass はVBRで。
2パスとは、2回エンコードして、2回目に目標のビットレートで最高の画質を追求する
CBRだと無駄が多い。
VBRで圧縮するときに静止してる場面を固定するから、2回やったほうがいい。インターレースをいっぱい作る。
まぁ、とにかく一回エンコードしたものを、可変レートのために読み込みながらもう一回エンコードかけて圧縮率を上げるってことで。
画質が最高とは、同じファイルサイズでも、より高画質。ってことです。
動画を2パスでエンコードすることで画質の向上を狙います。そのかわり処理時間は約2倍になります。
http://nicowiki.com/エンコード設定(中画質〜高画質).html#teeca4db
音声と動画を別々にエンコードするらしいよ。
MPEG2 TSを変換する。
2パスで変換する。
1パス目
ffmpeg -i $INPUT -vcodec libx264 -an -pass 1 -passlogfile "./pass.log" -s 1280x720 test.mp4
2パス目
ffmpeg -i $INPUT -vcodec libx264 -b:v 500k -acodec libfaac -pass 2 -passlogfile "./pass.log" -s 1280x720 test.mp4
ポイント、2パス目にはVBR(可変レート)のレートを指定する事になる。ビットレートの目標値を目指してファイルを圧縮。
500kだと画面も明らかに汚い。
画質を上げてみた。
time ffmpeg -i $INPUT -vcodec libx264 -b:v 5000k -acodec libfaac -pass 2 -passlogfile "./pass.log" -s 1280x720 test.mp4
5Mでやり直してみよう。
時間は掛かったけど、ファイルサイズの割にすごく綺麗です。
出来上がりは、
500k で 27MB 5000k で 180MB
でした。
変換元ファイルからして25%程度に減ったのでとてもいいと思います。*3
ただし、サンプルがアニメで動きが少ないので、圧縮率は高いと思います。
時間を指定して分割する方法
-t で秒数
-ss で切り出す頭秒数
ffmpeg -i input.mp4 -t 10 -ss 60 out.mp4
単純に切り出したいときは 再エンコ省略すると速い
ffmpeg -i input.mp4 -vcodec copy -acodec -c -t 10 -ss 60 out.mp4