Amazon Linux 2023 に ffmpegthumbnailer を install する

## 全体の流れ
Amazon Linux 2023 (AL2023) にて `ffmpegthumbnailer` を使えるようにするまでハマったので残しておく。

 - `ffmpegthumbnailer`を使えるようにするまで
   - `ffmpeg` のソースからビルドとインストール
   - `ffmpegthumbnailer` のソースからビルドとインストール
 - 発展 デプロイ用にパッケージ化

## 1. ffmpeg のインストールとビルド
まずは `ffmpeg` のインストールとビルドを行う。
`ffmpegthumbnailer` のビルドにて必要になる。

### 必要なパッケージをインストール
```terminal
$ sudo dnf install -y git nasm yasm make cmake gcc gcc-c++ libtool automake autoconf
```

### ffmpegのソースコードをクローン
```terminal
$ cd /usr/local/src
$ sudo git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
```

### x264とx265のサポートを無効にしてffmpegをビルドおよびインストール
```terminal
$ cd /usr/local/src/ffmpeg
$ sudo ./configure --prefix=/usr/local --enable-shared --enable-gpl --disable-libx264 --disable-libx265
$ sudo make
$ sudo make install
```
だいぶ時間がかかる。`t3.medium`で20分くらい

## 2. ffmpegthumbnailer のインストールとビルド
次に、 `ffmpegthumbnailer` をソースからビルドしてインストールする。

### 必要なパッケージをインストール
```terminal
$ sudo dnf install -y cmake libjpeg-devel libpng-devel glib2-devel
```

### ffmpegthumbnailerのソースコードをクローン
```terminal
$ cd /usr/local/src
$ sudo git clone https://github.com/dirkvdb/ffmpegthumbnailer.git
```

### ビルド用ディレクトリの作成
```terminal
$ cd /usr/local/src/ffmpegthumbnailer
$ sudo mkdir build
$ cd /usr/local/src/ffmpegthumbnailer/build
```

### 環境変数を設定
```terminal
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
$ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
$ export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
$ export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH
```

### cmakeを使用してビルド
```terminal
$ sudo cmake .. -DFFMPEG_ROOT=/usr/local -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_PREFIX_PATH=/usr/local -DPKG_CONFIG_EXECUTABLE=/usr/bin/pkg-config
$ sudo make
$ sudo make install
```

### ライブラリのコピーとシンボリックリンクの作成
```terminal
$ sudo cp /usr/local/src/ffmpegthumbnailer/build/libffmpegthumbnailer.so.4.15.1 /usr/local/lib/

$ sudo ln -sf /usr/local/lib/libffmpegthumbnailer.so.4.15.1 /usr/local/lib/libffmpegthumbnailer.so.4
$ sudo ln -sf /usr/local/lib/libffmpegthumbnailer.so.4.15.1 /usr/local/lib/libffmpegthumbnailer.so
```

### ライブラリキャッシュの更新
```terminal
$ sudo ldconfig
```

### インストール後の確認
```terminal
$ ffmpegthumbnailer -v
ffmpegthumbnailer version: 2.2.2
```

### 恒久化
```terminal
$ echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom-libs.conf
$ sudo ldconfig
```


## 発展
オートスケーリングでインスタンスの台数が変動するプロダクトでは、毎回`make`をするのが辛い。時間がかかりすぎる。
ビルドした成果物をS3にアップロードして、インスタンスの初期セットアップ時はS3から成果物をダウンロードして展開することで短縮を図る。

### S３にアップロード方法
#### ビルド成果物のアーカイブ
```terminal
$ cd /usr/local
$ sudo tar -czvf ffmpeg_ffmpegthumbnailer_build.tar.gz \
    /usr/local/bin/ffmpeg \
    /usr/local/bin/ffmpegthumbnailer \
    /usr/local/lib/libav* \
    /usr/local/lib/libpost* \
    /usr/local/lib/libswresample* \
    /usr/local/lib/libswscale* \
    /usr/local/lib/libavutil* \
    /usr/local/lib/libffmpegthumbnailer* \
    /usr/local/lib64/libffmpegthumbnailer* \
    /usr/local/include/libav* \
    /usr/local/include/libffmpegthumbnailer* \
    /usr/local/lib/pkgconfig/libav* \
    /usr/local/lib64/pkgconfig/libffmpegthumbnailer* \
    /usr/local/share/man/man1/ffmpegthumbnailer.1
```

#### S3にアップロード
```terminal
$ sudo aws s3 cp ffmpeg_ffmpegthumbnailer_build.tar.gz s3://your-bucket-name/path/to/ffmpeg_ffmpegthumbnailer_build.tar.gz
```
`scp`コマンドで1度ローカルに落としてからマネコンにて直接アップロードもアリ

### S３からにダウンロードして使う方法
#### S3からダウンロード
```terminal
$ cd /usr/local
$ sudo aws s3 cp s3://your-bucket-name/path/to/ffmpeg_ffmpegthumbnailer_build.tar.gz .
```
#### アーカイブを解凍してキャッシュ更新
```terminal
$ sudo tar -xzvf ffmpeg_ffmpegthumbnailer_build.tar.gz
$ sudo ldconfig
```


### おまけ Elastic Beanstalk 使用時の .ebextensions 設定ファイル
#### S3の成果物を利用する時
```yaml:01_ffmpeg_ffmpegthumbnailer.config
container_commands:
  01_download_ffmpeg_ffmpegthumbnailer:
    command: |
      sudo mkdir -p /usr/local
      cd /usr/local
      sudo aws s3 cp s3://your-bucket-name/path/to/ffmpeg_ffmpegthumbnailer_build.tar.gz .
      sudo tar -xzvf ffmpeg_ffmpegthumbnailer_build.tar.gz -C /

  02_update_ldconfig:
    command: |
      echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom-libs.conf
      sudo ldconfig
```


#### 毎回ビルド時（時間かかる）
```yaml:01_ffmpeg_ffmpegthumbnailer.config
container_commands:
  01_build_ffmpeg:
    command: |
      sudo dnf install -y git nasm yasm make cmake gcc gcc-c++ libtool automake autoconf
      cd /usr/local/src
      sudo git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
      cd ffmpeg
      sudo ./configure --prefix=/usr/local --enable-shared --enable-gpl --disable-libx264 --disable-libx265
      sudo make
      sudo make install

  02_install_ffmpegthumbnailer_dependencies:
    command: sudo dnf install -y cmake libjpeg-devel libpng-devel glib2-devel

  03_build_ffmpegthumbnailer:
    command: |
      cd /usr/local/src
      sudo git clone https://github.com/dirkvdb/ffmpegthumbnailer.git
      cd ffmpegthumbnailer
      mkdir build
      cd build
      export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
      export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
      export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
      export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH
      sudo cmake .. -DFFMPEG_ROOT=/usr/local -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_PREFIX_PATH=/usr/local -DPKG_CONFIG_EXECUTABLE=/usr/bin/pkg-config
      sudo make
      sudo make install

  04_create_ffmpegthumbnailer_symlinks:
    command: |
      sudo cp /usr/local/src/ffmpegthumbnailer/build/libffmpegthumbnailer.so.4.15.1 /usr/local/lib/
      sudo ln -sf /usr/local/lib/libffmpegthumbnailer.so.4.15.1 /usr/local/lib/libffmpegthumbnailer.so.4
      sudo ln -sf /usr/local/lib/libffmpegthumbnailer.so.4.15.1 /usr/local/lib/libffmpegthumbnailer.so

  05_update_ldconfig:
    command: |
      echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom-libs.conf
      sudo ldconfig
```