追記 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.mp4
は654x1090 [SAR 1:1 DAR 3:5]
-
ffprobe test2.mp4
は648x1080 [SAR 1:1 DAR 3:5]
-
ffprobe test3.mp4
は1090x654 [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
ちなみに,
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秒の動画にする.