ffmpeg
image
avconv
ubuntu16.04

windows7でも再生できる動画を作るためのffmpeg / avconv の cheat sheet

追記 H265

ffmpeg -i input.mp4 -c:v hevc -c:a aac -strict -2 output.mp4

H265でエンコードするとファイルサイズがかなり小さくなる.


Ubuntu 16.04 前提

結論

縦に動画を並べる,みたいな解像度が増える系の処理をした動画をwindows7+power point 2010で再生するのはシンプルではなさそう.Ubuntuにするか,windows10にするか,power point 2013にすれば解決するが.

まとめ

ubuntuやchrome(OS問わず)で再生できるのに,windowsのmedia
player で再生できない場合に確認すべきは

  • 縦横のどちらかがある程度大きくなると再生できなくなる
    • 動画を縦横に結合するとwindowsで再生できなくなる
    • ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -c:v h264 -preset slow -tune film -filter_complex "[0:v][1:v]vstack[d];[d][2:v]vstack[e];[e]setsar=1[f];[f]scale=654:1090" -an test1.mp4 は再生できなくて
    • ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -c:v h264 -preset slow -tune film -filter_complex "[0:v][1:v]vstack[d];[d][2:v]vstack[e];[e]setsar=1[f];[f]scale=648:1080" -an test2.mp4 は再生できる
    • ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -c:v h264 -preset slow -tune film -filter_complex "[0:v][1:v]vstack[d];[d][2:v]vstack[e];[e]setsar=1[f];[f]scale=1090:654" -an test3.mp4 は再生できる
    • ffprobe test1.mp4654x1090 [SAR 1:1 DAR 3:5]
    • ffprobe test2.mp4648x1080 [SAR 1:1 DAR 3:5]
    • ffprobe test3.mp41090x654 [SAR 9:25 DAR 3:5]
  • yuv444pの動画を気づかぬうちにyuv440pと混ぜていたりしないか
    • ここにすごいハマった
    • ffprobe input.mp4でyuv444pであれば要注意.
      • Video: h264 (High 4:4:4 Predictive)になっているケース
    • ffmpeg -i input.mp4 -c:v h264 -preset slow -tune film -profile:v high -pix_fmt yuv420p output.mp4
  • H264のprofile / level を確認
    • -v:profile high -level 4.0とか
  • SAR / DARを確認(縦横が逆になっていないか)
    • -s 1080x1920とか

を確認すれば良い.

はじめに

ffmpeg と avconv の違い

ls -l `which avconv`すると

user@host:~$ ls -l `which avconv`
lrwxrwxrwx 1 root root 6  2月 14  2017 /usr/bin/avconv -> ffmpeg

となっていて,acvonvはffmpegのエイリアスでしかなく,もうavconvは無くなっているっぽい.

拡張子とコーデック

http://www.gomplayer.jp/player/knowledge/knowledge.html を見るとよく分かる.
コンテナ: 拡張子.mp4とかmovとか.
コーデック: どうやって圧縮しているか.h264とか.

ここでは,一般的なmp4+h264で進める.

デフォルトのwindowsでも再生できるようにする

wmvじゃないとダメ,とかいうのは誤認識のはずで,mp4でも再生できる.
mp4が再生できない気がするのは,コーデックが対応していないからで,windows10なら割と対応しているが,windows7は微妙に対応していない.
特に,同じh264でもprofile / level によって対応している・していないがあるので,要注意.
profileには

  • base
  • main
  • high

の3種類がある.

levelには 4.0とか3.2とか3.1とか.
windowsのchromeはhigh/4.0も対応しているが,古めのパワポや再生ソフトがlevel 3.1までの対応,というのがハマりポイント.
level 3.2とかlevel 4.0は再生できない...

SAR / DARが大事で,何かしらの事情で縦横情報が反対になっていて再生できないことがあるみたい.ffmpegのオプションで-s hxwを渡してあげると治るっぽい.

ffprobeとかでは確認できないオプションで,mp4infoで確認出来た.
http://sekisuiseien.com/computer/5176/#LEVEL41

pureなwindows7で再生したければ,levelを3.2にする必要があるが,windows10なら何でも良いので,デフォルト引数で良い.
以下の例では,一応レベルを3.1にしていく.

wmv

ちなみに,
bash
ffmpeg -i input.mp4 -c:v wmv2 -preset slow -tune film -an -q:v 1 output.wmv

のようにwmv2でエンコードすれば,windowsでも普通に再生できるが,wmv9が最新でwmv2は古いっぽく,ファイルサイズがh264と比べて桁違いに増えるから,使いたくない.

インターレースについて

http://aviutl.info/innta-re-sukaizyotoha/ が詳しい.
簡単のため,以下ではインターレースは解除していないが,必要に応じて,-filter:v yadifをつければ良い.
複数のfilterを同時に付けるには,下の方にある2倍速の例を参考にして,カンマ区切りにする.

エンコードの手法

ちゃんとやらないと,画質が悪くなったり,ファイルサイズが肥大化したりする.
Ubuntuのversionが上がるに連れて,オプションがなくなったりする.ここではUbuntu 16.04を想定する.

音声については,簡単のため,消していく.

H264でエンコード

https://trac.ffmpeg.org/wiki/Encode/H.264 が詳しい.

ffmpeg -i input.MTS -c:v h264 -preset slow -tune film -an output.mp4

を基本とする.

windows7でも再生したい場合は,levelを3.1以下にする必要があるので,

ffmpeg -i input.MTS -c:v h264 -preset slow -tune film -level 3.1 -an output.mp4

とする.

時間単位の切り取り

この場合は,エンコードする必要がなく,一瞬で終わる.-c:v copyを使えばOK.

ffmpeg -ss 2 -i input.MTS -t 5 -c:v copy -an output.mp4

これで,2秒目から5秒間切り取れる.
-ss-iの前にある必要がある.

ただ,http://santa.ldblog.jp/archives/41750596.html にあるように,最初の何秒間がグレーになったり変になったりする場合がある.
http://moriya.xrea.jp/tdiary/20140605.html にあるように,エンコードする必要があるのが,簡単なので,そうする.

縦横サイズの意味の切り取り

-cropが使える.

ffmpeg -i input.MTS -c:v h264 -preset slow -tune film -level 3.1 -filter:v "crop=in_w/8*5:in_h:in_w/8*3:0" -an output.mp4

動画に画像を埋め込む

ffmpeg -i input.mp4 -filter:v "movie=watermark.png[watermark];[in][watermark]overlay=0:0[out]" -c:v h264 -preset slow -tune film -level 3.1 -an output.mp4

動画を縦横に結合する

縦にするバージョン.

ffmpeg -i in_1.mp4 -i in_2.mp4 -i in_3.mp4 -filter_complex "[0:0]pad=iw:3*ih[a];[a][1:0]overlay=0:h[b];[b][2:0]overlay=0:2*h" overlay.mp4

おんなじ感じで横もいける.

動画を時間方向に結合する

ffmpeg -i in_1.mp4 -i in_2.mp4 -filter_complex "concat=n=2:v=1:a=0" output.mp4

動画を倍速にして,動画に2xという文字を入れる

ffmpeg -i input.mp4 -c:v h264 -preset slow -tune film -level 3.1 -an -filter:v "setpts=1/2*PTS, drawtext=fontfile='/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf':text='2x':x=W/2:y=H/2:fontsize=100:fontcolor=white:box=1:boxcolor=black@0.5" output.mp4

ちなみに,このケースでは,setptsとdrawtextの2種類のfilterを同時に使っているが,上のようにカンマ区切りで書けば有効になる.

動画を回転する

横で撮った場合に使う

ffmpeg -i input.mp4 -c:v h264 -preset slow -tune film -level 3.1 -an -filter:v "transpose=2" output.mp4

文字だけの動画を作る

最初に何秒間か流れるタイトル用.

convert -background black -fill white -size 1920x1080 -font Times-Roman -gravity center -pointsize 200 label:"test\n\nhoge" out.png

でまず画像を作る.

ffmpeg -loop 1 -r 29.98 -t 10 -i out.png -c:v h264 -an output.mp4

で,10秒の動画にする.