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


## 追記 H265

```bash
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` ``すると

```bash
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 が詳しい．

```bash
ffmpeg -i input.MTS -c:v h264 -preset slow -tune film -an output.mp4
```
を基本とする．

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

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

とする．

## 時間単位の切り取り
この場合は，エンコードする必要がなく，一瞬で終わる．``-c:v copy``を使えばOK．

```bash
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``が使える．

```bash
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
```

## 動画に画像を埋め込む
```bash
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
```

## 動画を縦横に結合する
縦にするバージョン．

```bash
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
```
おんなじ感じで横もいける．

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

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

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

```bash
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を同時に使っているが，上のようにカンマ区切りで書けば有効になる．

## 動画を回転する

横で撮った場合に使う

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

## 文字だけの動画を作る

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

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

でまず画像を作る．

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

で，10秒の動画にする．