FFmpegで余白（パディング）を追加して動画を作成する方法

:::note warn
この記事は、[Supershipグループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/supership)の 23日目の記事になります。
:::

## はじめに
FFmpegを使って動画に余白（パディング）を追加し、枠線をつけたり、L字の余白を挿入してバナー風のデザインに編集する方法を解説します。

## 動画にパディングを付与する

FFmpegのフィルターオプション`pad`を使用して、動画に余白や枠線を追加できます。  
公式ドキュメント：[FFmpeg Filters Documentation - pad](https://ffmpeg.org/ffmpeg-filters.html#pad-1)

---

### 基本のコマンド

以下のコマンドで、動画に余白（黒い枠線）を追加します。

```bash
ffmpeg -i input.mp4 -vf pad=w=iw+60:h=ih+60:x=30:y=30:color=black output.mp4
```

![ezgif-6-16bc3e85e8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45453/a337e4ab-2066-71b4-7f6a-46ce7fb599ae.gif)

**コマンドの解説**：

- **`pad`フィルターの指定**：`-vf pad=w=iw+60:h=ih+60:x=30:y=30:color=black`
  - **`w=iw+60` / `h=ih+60`**  
    出力動画の幅（w）と高さ（h）を、入力動画の解像度に対してそれぞれ+60px追加しています。  
    - `iw`：入力動画の横幅（例：1920）  
    - `ih`：入力動画の縦幅（例：1080）  
    結果として、上下左右に30pxずつ余白が追加される形になります。

  - **`x=30 / y=30`**  
    入力動画をオフセットする座標を指定しています。  
    - `x`：左から30px横に移動  
    - `y`：上から30px下に移動  
    これにより、余白を均等に追加しつつ、映像が中央に配置されます。

  - **`color=black`**  
    余白の色を指定します。
    デフォルトは黒（black）ですが、`#FF0000`のようなRGB形式も指定できます。

---

### コマンドの動作

上記コマンドを実行すると、以下の動作が行われます：

1. 入力動画の周囲に**30px**の余白（パディング）が追加される。  
2. 余白部分の色は黒（`color=black`）に設定される。  
3. 出力動画の解像度は、追加されたパディング分だけ拡大される。  
   - 例：入力動画が1920x1080の場合 → 出力動画は**1980x1140**になります。

---

### 注意点：アスペクト比と解像度

パディングを追加すると、出力動画の解像度やアスペクト比が変更されるため、注意が必要です。  
例えば、フルHD（1920x1080）の動画に60pxの余白を追加すると、**1980x1140**になり、標準的な解像度から外れる可能性があります。

#### 対策方法

1. **入力動画の解像度を事前に調整する**  
   追加する余白分、あらかじめ解像度を小さくした動画を用意します。  
2. **解像度を再調整する**  
   余白追加後に、出力動画を元の解像度（例：1920x1080）にリサイズします。

---

## L字の余白を追加した動画を作成する

これまでの内容を応用して、L字型の余白を追加した動画を作成します。  
最終的な動画の解像度は`フルHD(1920x1080)`を想定しています。

---

### 1. 入力動画の解像度を調整する

まず、入力動画をL字の余白を追加するために、一段小さい解像度（HD+、1600x900）に変換します。  
これにより、L字の余白を適切に配置する準備が整います。

```bash
ffmpeg -i input.mp4 -s 1600x900 movie_900.mp4
```

- **`-s 1600x900`**：出力動画の解像度を1600x900（HD+）に指定します。  
- **`movie_900.mp4`**：変換後の動画ファイル名です。

---

### 2. L字の余白を追加する

次に、`pad`フィルターを使用して、動画の周囲にL字の余白を追加します。  
L字の余白部分には色を指定し、左側と下側にスペースを作成します。

```bash
ffmpeg -y -i movie_900.mp4 -vf 'pad=w=1920:h=1080:x=320:y=0:color=#87CEEB' movie_l.mp4
```

![ezgif-6-51a4e767e1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45453/f7dd994f-b1fc-d47f-b3f7-4ba3814325d3.gif)


**コマンドの解説**：  
- **`w=1920:h=1080`**  
  出力動画の解像度をフルHD（1920x1080）に指定します。  
- **`x=320` / `y=0`**  
  入力動画（1600x900）を右方向に寄せています。  
  - `1920-1600=320`のため、X座標は**320px**になります。  
  - Y座標は0なので、動画は縦方向には動かず、上に配置されます。  
- **`color=#FFFF00`**  
  L字の余白の色としてスカイブルー（`#87CEEB`）を指定しています。  
- **`movie_l.mp4`**  
  L字余白を追加した出力動画ファイル名です。

---

### 3. 余白部分にテキストやロゴを追加する

追加したL字の余白部分に`drawtext`フィルターを使用してテキストやロゴ画像を挿入することができます。

#### テキストを挿入する例

```bash
ffmpeg -i movie_l.mp4 -vf "drawtext=text='L字の余白こんにちわ！':x=320:y=990:fontsize=60:fontcolor=black" movie_l_text.mp4
```

![ezgif-1-e6bcf69df0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45453/2fa77683-719b-c3b7-81d9-3570827e862a.gif)

- **`drawtext`フィルター**：テキストを動画に追加します。  
  - `text='L字の余白こんにちわ！'`：表示するテキスト内容。  
  - `x=320:y=990`：テキストの配置位置（L字の余白内）。  
  - `fontsize=60`：テキストのフォントサイズ。  
  - `fontcolor=black`：テキストの色を黒に指定しています。

これで、L字型の余白が追加され、余白部分にテキストやロゴを表示する動画を作成できます。

## おわりに
FFmpegのpadフィルターを使用すれば、動画に簡単に余白や枠線を追加できます。
また、余白の色やオフセット値を細かく指定することで、I字やL字のパディング、さらにはバナー風のデザインも実現可能です。


:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::