FFmpegの基本

FFmpegの基本を叩き込みます。
ffmpegすら知らない人はこれを読んでみよう。

https://note.com/xx_freezer_xx/n/n2c76640a9045

Noteから脱出して初のqiitaの記事です。かなり便利だね。あとここなら結構強気で記事書ける。
# 基本
ffmpegには最低一つ必ずinput(入力)、output(出力)を指定する必要があります。メディアエンコーダだから当たり前ですね。
```
ffmpeg -i <input> <output>
```

# FFprobe、FFplay
ffprobeは、メディアファイルのfps、解像度等の情報を確認するためのものです。わざわざフォトを開くのがめんどくさいときに便利。ffmpegコマンドでも確認できますが、エラーになるのはあまりよろしくない。
ffplayはメディア再生ツールです。Noteでも解説しているのでそこから。

# 動画についてちょっと深く理解しよう
mp4,mp3,webm,h264,acc.....　聞いたことある名前でしょう。しかし、ffmpegでさらに真価を発揮するには、こいつらが一体何なのかを最低限理解する必要があるでしょう。

まずはmp4,webmなどの正体です。こいつらはデータを格納するための**箱**であって、**フォーマット**(format)と呼びます。メディア、動画と言ってもいろいろな種類があります。
mp4だから効率がいいなどと言うのは少し違いますね。

効率の良い圧縮を実現しているのは、**圧縮規格**、と**コーデック**の二つです。
h264、hevcなどが、圧縮のアルゴリズムを明記した、いわゆる仕様書になります。そして、その仕様書に沿って実際にエンコードするプログラムが**コーデック**(codec)です。有名どころだとlibx264などです。

h264などの仕様書がmp4という箱を使うように指示しているのです。
### stream
例えば動画を例にとりましょう。動画には音声、映像と二つのデータがありますね。これら一つ一つのことをストリーム(stream)と呼びます。覚えておこう。

# 大まかな流れ
<入力>→<decode>→<フィルタ処理>→<指定>→<encode>→<出力>

もう少し噛み砕いてみましょう。

 - 入力(input)
データを読み込まないと話が始まりませんね。
 - decode(デコード)
世の中にはたくさんの種類のメディアがあります。動画だけに絞っても物凄い量です。これらを展開し、FFmpegが処理しやすい形に変える必要があります。そうしないとフィルタ処理等が出来ないですからね。これをデコードと呼びます。

 - フィルタ処理(filter)
色を変えたりとか。毎回必須ではありません。ffmpegには様々なフィルタがあるので、これらも紹介していこうと思います。
 - encode(エンコード)
圧縮したり、なんなり。ここでコーデックが動きます。
 - 出力(output)
はい。


# 引数
ffmpegで出てくる引数たちです。よく出てくるものを紹介します。いま頑張って理解する必要もないでしょう。ここから出てくる例を見て少しづつ理解していきましょう。

```
-i
(input)メディアのインプットを指定する
-ss
エンコードの開始地点
-to
エンコードの終了地点
-t
(duration)メディアの長さを指定する
-c[:<stream>]
コーデックを指定する
-vf
フィルタ処理を行うときに使う
-filter_complex
同じくフィルタ処理を行う、vfよりも細かく指定ができる
-map 
出力で使うストリームを選択する
-r
fpsを指定する
```
他にも物凄い量の引数が存在します。もちろん、毎回設定しないといけない訳では決してありません。

# サンプル
簡単なコマンドをいくつか紹介します。次回からはどんどん高度なコマンドも紹介するので是非。

```
ffmpeg -i input.mp4 output.webm
```
一旦このコマンドの意味をすこし掘り下げてみましょう。
前回のNoteを読んだ方はもう大丈夫でしょう。mp4をwebmに変換するコマンドです。
ffmpegは気を利かせてファイル名の最後の拡張子で自動でフォーマットを選んでくれます。
一応明示的に指定する方法も紹介します。
```
ffmpeg -i input.mp4 -f webm output.webm
```
必要になったことはほとんどありませんが。
前で、mp4などは箱でしかない、という話をしましたね。コーデックはどうなっているのでしょう。
FFmpegは**デフォルトの設定がかなり充実しています**。このフォーマットなら指定がない限り、このコーデックを使う、ということをしてくれるので変える必要がなければ指定する必要はありません。もちろん、コーデックだけに限らない話ですね。
明示的にコーデックを指定するには...
```
ffmpeg -i input.webm -c:v libx264 output.mp4
```
ちょっと怖い引数が出てきましたね。-cにまでは前で説明したとおりです。じゃあこの後の:vはなんなんだ。
これは音声、動画など、どの種類のメディアにはこのコーデックを使う、という明記をしています。-c:aなら音楽(audio)、-c:vなら動画に対して指定します。
さっきから出てきているlibx264は圧縮規格のh264に沿ったものです。FFmpegではmp4変換でデフォルトで使われています。

ただの変換はこれでおなかいっぱいでしょう。ほかのコマンドも見てみましょう。

## 動画のカット
```
ffmpeg -i input.mp4 -c:v copy -c:a copy -ss 3 -to 6 out.mp4
```
。スタート地点3秒、終了地点6秒です。
試しに実行してみてください。動画編集ソフトの何億倍も速いでしょう。これの秘訣は-c:v copyにあります。
前ではlibx264というコーデックを指定しましたね。今回はcopyです。これがffmpegの最強クラスの機能で、copyと指定すると、デコード、エンコードをせずに出力することができます。もちろんこれらの処理は非常に重いので、これが省略されると爆速になるのも分かるでしょう。

```
ffmpeg -i input.mp4 input.mp3
```
動画から音楽を抽出するコマンドです。音声のファイルのサイズはそこまで大きくないので再エンコードしてもそこまで時間はかかりません。エンコードなしでも方法はありますが、いろいろ面倒なので次回紹介します。
## 動画と音楽を結合
```
ffmpeg -i video.mp4 -i audio.mp3 -map 0:v -map 1:a out.mp4
```

-mapコマンドが出てきました。少し深掘りしましょう。

-map <font color="red">0</font>:<font color="orange">v</font>

インプットの<font color="red">0番目の</font><font color="orange">動画</font>を使う、という意味になります。この順番はコマンドでの引数の並び順によって決まります。ffmpegでは一番目からではなく、0番目からなので覚えておきましょう。

-map <font color="lime">1</font>:<font color="yellow">a</font>
インプットの<font color="lime">1番目の</font><font color="yellow">音声</font>を使う
となりますね。

上二つのコマンドと言い、頑なにcopyを使っていませんね。copyをすることで爆速にはなりますが、少し面倒ごとが多いのです。さっさとコマンドを使いたい人が殆どだと思うのでここでは使いません。

## 再生できない
前回も書きましたが再掲、メディアプレイヤーやQuickPlayなどで再生するには一つ引数を追加する必要があります。
```
ffmpeg -i input.webm -pix_fmt yuv420p output.mp4
```
FFplayなら問題なく再生できます

## 解像度の変更
```
ffmpeg -i input.mp4 -vf "scale=640x360" output.mp4
```
-vfについては次回から深堀りしようと思います。中の数値を変えるだけと思ってもらえば問題ありません。

## 動画から画像を抽出
```
ffmpeg -i input.mp4 -ss 2.5 -vframes 1 output.png
```
-vframesでフレーム何枚を出力するか指定します。

## 動画から画像の連番を作成
:::note alert
大量のファイルが生成されます。個別にフォルダを作るなどの対策をしましょう。
:::
```
ffmpeg -i input.mp4 out%00d.png
```
%00dってなんだ。これは連番出力をする際に使う記号のようなものです。%の後は桁数を示します。%02dなら001,002,003,..というように出力されます。

```
ffmpeg -i input.mp4 frame%03ddesu.png
```
こういう風に使える。

もちろん逆も可能です。画像をつなげてGIFでも投稿したいとしましょう。画像の名前を変えるなどの作業は必要になりますが。
```
ffmpeg -r 60 -i image%00d.png awesome.gif
```
-rが出てきました。ここでfpsを設定します。-r単体で使うことでFPSを下げるなどの処理もできます。

もちろんgif以外でも全く問題なく動きます。
```
ffmpeg -r 60 -i image%00d.png awesome.mp4
```
Mayaなど3DCGソフトなどで出力した連番画像を動画にするときなんかに使えますね。

# ～～　Coffee Break　～～ 
この記事はここらへんで終わりにしたいと思います。次の記事ではより高度な操作を紹介していきます。
Qiitaめっちゃいいね。使いやすい。

# 続き
https://qiita.com/Frezledz/items/650e4aa468b4fa686392