それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

サンプルで使って慣れる。ffmpeg の使い方。

ffmpeg って色々出来るんだけど、オプションが慣れないとわからないというか。コンテナとかフォーマットとかコーデックとか色々あってね。ちょっと取っ掛かりが分かり難い。僕も色々やってみたけど、「習うより慣れ」でした。

ffmpegの基本

ffmpeg -i 入力ファイル名   その他いっぱいオプション  "出力ファイル名.拡張子"

です。最初は上記の構文だけ頭に入れておきます。ffmpeg は使いかたも概念もややこしいので、とりあえずパターンで覚えて、その後に理屈を攻めていけばいいさ

本エントリの目標

基本的な使い方を覚えて、2パスで高画質エンコード*1のオプションを暗記する。地デジのTSをエンコード出来るように。

2パス エンコードまでやります。

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

ffmpegで動画の情報を見る。

動画形式が変換されたら、どの辺が変わるか。それを見てみます。

動画の情報を見る。
 ffmpeg -i ファイル名 

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が音声コーデック

コーデックとコンテナに付いての簡単な説明。

あくまでイメージですが、、、こんな感じ。

\int_0^x\{video(t)+audio(t)\}dt

動画と音声を数秒ごとに分割して、数秒単位に動画+音声が繰り返し現れる。ってイメージ。
この時の切り方、ファイルの折り返し方を定義したのがコンテナ(数式の\int_0^tdtの部分)


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で表現する。違い、一秒再生するのに何ビットいるか

つまり平均何ビットあれば一秒再生できるかってことらしい。

通信とは単位が似ているが・・・ちょっと違う。


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


ffmpeg で指定秒数を切り出して動画を時間で分割する - それマグで!

*1:高画質ってのは、同じファイルサイズなのにスゲー綺麗ってことで、画質が向上するってことではないんですよ

*2:実際にはコンテナに従って決めるんだけど、一応そういうことにしておいて。

*3:TSの1440を1280にしてるからそれだけでもかなり落ちてるけどね。