ffmpeg って色々出来るんだけど、オプションが慣れないとわからないというか。コンテナとかフォーマットとかコーデックとか色々あってね。ちょっと取っ掛かりが分かり難い。僕も色々やってみたけど、「習うより慣れ」でした。
ffmpeg -i 入力ファイル名 その他いっぱいオプション "出力ファイル名.拡張子"
です。最初は上記の構文だけ頭に入れておきます。ffmpeg は使いかたも概念もややこしいので、とりあえずパターンで覚えて、その後に理屈を攻めていけばいいさ
適当な動画を一本用意する。とりあえずニコニコ動画から、なんかFLVを一本ダウンロードして用意。
あんまり長いファイルだと、変換時間が長くて勉強テンポが悪い。短すぎるとわかりづらいので1分くらいの動画でいい。
ffmpegのインストールは別に何でもいい。OSに入ってるものや、適当にダウンロードしたバイナリではじめるといいさ。
flvをmp4にに変換する
ニコニコ動画のflvをMP4形式に変換してみます。
ffmpeg -i sm1715919.flv out.mp4
mp4をflvに
逆に、MP4のファイルをflvに変換してみます。
ffmpeg -i sm1715919.mp4 out.flv
mp4 を movに
MP4形式をQuickTimeのMOV形式に変換してみます。
ffmpeg -i sm1715919.mp4 sm1715919.mov
形式の変換ができるようなった?
形式の変換のまとめ
ffmpeg -i 入力ファイル名 " 出力ファイル名.拡張子"
の「拡張子」で自動で決定されるの。僕らは、拡張子だけ意識していればいい。
実は先ほどの例、これらはコンテナを変えた。動画・音声を変換するオプションは指定してない。*2
動画形式が変換されたら、どの辺が変わるか。それを見てみます。
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 とかそういうこと:
これで音声をカットして、動きだけの動画ファイルにする。
画面サイズを変える。
元ファイルがこれ
(377fc0e4a622e8f01669f72de39def5f)
フォーマット(コンテナ)はそのままに画面サイズを変える。
拡大してみた
ffmpeg -i sm1715919.mp4 -s 640x480 out.mp4
結果
(d848c7a0d43044a4b16d5754856b4997)
縮小してみた
ffmpeg -i sm1715919.mp4 -s 160x120 out.mp4
(73af0174edf49db3f3b4f6fd32710699)
縦横比を維持して自動計算
横幅を指定して、残りを自動計算させる。アスペクト比だとか、縦横の比率とか、空白とかちょっと考えたくない。
ffmpeg -i sm1715919.mp4 -vf scale=640:-1 out.mp4
縦横の長さは自動計算。
これも簡単ですね。
ビデオ・コーデックの変換
ファイルのコンテナはそのままに、ビデオのコーデックだけを変換します。
ffmpeg -i sm1715919.mp4 -vcodec libx264 test.mp4
mp4コンテナのビデオ部分は、Mp4コーデックやH264コーデックでもどちらでも構わないので、変換してみる。
変換前
takuya@air:~/Desktop$ 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
変換後
takuya@air:~/Desktop$ ffmpeg -i test.mp4
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 120 kb/s, 29.97 fps, 29.97 tbr, 30k tbn,
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 128 kb/s
ビデオコーデックが変換されている
ビットレートはkbpsで表現する。違い、一秒再生するのに何ビットいるか
つまり平均何ビットあれば一秒再生できるかってことらしい。
通信とは単位が似ているが・・・ちょっと違う。
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
ffmpeg で指定秒数を切り出して動画を時間で分割する - それマグで!