それマグで!

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

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

Ubuntuでh264のffmpegを使う。

標準仕様のffmpeg は何も入ってないのです。

ubuntuffmpegで、h264動画をつくろうとしたら、できないって言われたので、コンパイルだわ。ビルドしてインストール。でもやり方面倒だよね。ってこと調べた

ffmpeg を non-freeでビルドする方法

参考資料にすげー丁寧に書いてあった。

0.The instructions on the page are for Ubuntu Oneiric Ocelot 11.10, Ubuntu Natty Narwhal 11.04 and Ubuntu Maverick Meerkat 10.10. Separate instructions are also available for older, supported releases:

http://ubuntuforums.org/showthread.php?t=786095

自分でビルドすればいいんです。

ビルド専用のスクリプト書いてみた。

urlの記事を参考に、シェルスクリプトにまとめておいた。
ffmpeg_install.sh

  1 ##uninstall
  2 sudo apt-get remove ffmpeg x264 libx264-dev -y
  3 ## install build-tools and library
  4 sudo apt-get update
  5 sudo apt-get install build-essential checkinstall git libfaac-dev libjack-jackd2-dev \
  6   libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev \
  7   libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev texi2html yasm zlib1g-dev
  8 #install x264
  9 cd
 10 git clone git://git.videolan.org/x264
 11 cd x264
 12 ./configure --enable-static
 13 make
 14 sudo checkinstall --pkgname=x264 --pkgversion="3:$(./version.sh | \
 15     awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes \
 16     --fstrans=no --default
 17 #install ffmpeg
 18 cd
 19 git clone --depth 1 git://source.ffmpeg.org/ffmpeg
 20 cd ffmpeg
 21 ./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb \
 22     --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 \
 23     --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab
 24 make
 25 sudo checkinstall --pkgname=ffmpeg --pkgversion="5:$(date +%Y%m%d%H%M)-git" --backup=no \
 26   --deldoc=yes --fstrans=no --default
 27 hash x264 ffmpeg ffplay ffprobe
 28
 29
 30

実行結果

(ry
tripping ELF binaries and libraries...OK
manページを圧縮..OK
ファイルリストを作成..OK
Debianパッケージを作成..OK
Debianパッケージをインストール..OK
tempファイルを削除..OK
doc-pakディレクトリを削除..OK
temp dirを削除..OK
**********************************************************************
 Done. The new package has been installed and saved to

 /home/takuya/ffmpeg/ffmpeg_201202232008-git-1_amd64.deb

 You can remove it from your system anytime using:

      dpkg -r ffmpeg

**********************************************************************

インストールされた先。

/usr/local/bin/ffmpeg

に新しいイケテルffmpegがインストールされてます。


楽ちんですね。

サンプルで使って慣れる。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にしてるからそれだけでもかなり落ちてるけどね。