ffmpegで超ラジオ体操動画を超快適にする

# 動機
テレワーク期間中、体がなまってしまうので谷本道哉先生の「超ラジオ体操」をよくやっていた。
通常のラジオ体操第一よりもゆっくりしたテンポで、しっかり各部を伸ばせるので超おすすめ。
![81H-2VztuNL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652086/536afd5b-c909-a63e-0f85-1b9af1a6c5d5.jpeg)
https://amazon.co.jp/dp/4594081983/


さてこの書籍には動画のURLを格納したQRコードがついているのだが、
その動画は一部の運動の挙動と音がずれており、また各運動の繋ぎ目のテンポが悪い箇所もある。

![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652086/546923da-89d6-6dcc-f0f5-0169cb882428.png)

ラジオ体操は、音楽に合わせて体を動かせることが重要だと思うんだ。

この書籍には、一曲通しの動画の他に1番から13番までの各運動単体の動画も用意してある。
そこで、ffmpegを使って各単体動画の音ズレを修正したうえで全動画を結合し、自分で通しの動画を作ってみよう。

（ちなみに書籍の通し動画は、~~担当者がエンコード設定をミスったのか知らないが~~単体動画より画質が悪いもよう）


# 使用ツール
- ffmpeg version 4.4.1

ffmpegはオプションが大量にあり、使い方が難しい。覚書↓
https://qiita.com/shoheikuni/items/351588d3635d9b132bfb

# 動画ファイルのダウンロード

動画は転載禁止なので、具体的なURLは載せない。

やりかたは後で書く。

# 音声と映像のズレを調整

1番から13番までの各動画の中身を確認し、映像を基準にして音が進んでいるか遅れているか確認する。
もし音が進んでいる／遅れているなら、動画を一旦映像ファイルと音声ファイルに分離し、ズレを調節して再結合する。

映像と音声の分離：
```sh
ffmpeg -i <input_file> -c:v copy -an <output_video_file> # 映像だけを取り出す
ffmpeg -i <input_file> -c:a copy <output_audio_file> # 音声だけを取り出す
```

音が進んでいる場合の結合：
音声の先頭に無音を追加することで、映像と音声のズレを修正する。
下記コマンドの`<left_delay>`と`<right_delay>`部分に無音の長さの数値（ミリ秒単位）を入れる。
左右の音声でズレてはいないので両方同じ数値を入れる。
```sh
ffmpeg -i <input_video_file> -i <input_audio_file> -map 0:v -map 1:a -c:v copy -af 'adelay=<left_delay>|<right_delay>' <output_file>
```

音が遅れている場合の結合：
音声の先頭を`-ss`オプションでカットすることでズレを修正する。
カットする長さ`<start_time>`は秒単位で指定する。
```sh
ffmpeg -i <input_video_file> -ss <start_time> -i <input_audio_file> -map 0:v -map 1:a -c copy <output_file>
```

筆者が各動画を確認したところ、音のズレは下表の通りだった。

| 番号 | 運動名 | 音先行（秒） |
| - | - | - |
| 1 | 伸びの運動 | 0.5 |
| 2 | 腕を振って脚を曲げ伸ばす運動 | 0.4 |
| 3 | 腕を回す運動 | 1.5 |
| 4 | 胸を反らす運動 | 0 |
| 5 | 体を横に曲げる運動 | 0 |
| 6 | 体を前後に曲げる運動 | 0 |
| 7 | 体をひねる運動 | 0 |
| 8 | 腕を上下に伸ばす運動 | 0.2 |
| 9 | 体を斜め下に曲げ胸を反らす運動 | 0.5 |
| 10 | 体を回す運動 | 0.7 |
| 11 | 両脚で跳ぶ運動 | 0.7 |
| 12 | 脚を付け根から大きく振る運動 | -0.2 |
| 13 | 深呼吸の運動 | 0 |

# 先頭、末尾の切除
1番から13番までの動画を繋げたいのだが、そのままだと各運動の前と後に予備動作があるので、
これをカットしないと音楽が綺麗に繋がらない。

入力ファイルの先頭と末尾をカットするコマンドはこれ。
先頭カット位置の指定は、`-ss`オプションに秒単位の数値またはhh:mm&zwnj;:ss.ms形式の文字列を与える。
末尾カット位置の指定は、`-to`オプションにhh:mm&zwnj;:ss.ms形式の文字列を与える。
なお、`-c copy`オプションをつけると再エンコードせずに元ファイルの内容をコピーするのだが、
これと先頭カットを併用して出力した動画ファイルは綺麗に再生できなかった。
おそらくキーフレーム的な重要なものがカットされてしまうからかな。
```sh
ffmpeg -ss <start_time> -to <end_time> -i <input_file> <output_file>
```

筆者が調べた先頭カット位置と末尾カット位置。
これを調べるのが一番面倒だった。

| 番号 |  運動名 | 先頭カット | 末尾カット |
| - | - | - | - |
| 0 | 導入（通しの動画より） | 0 | 00:00:08.90 |
| 1 | 伸びの運動	| 0.8 | 00:00:16.80 |
| 2 | 腕を振って脚を曲げ伸ばす運動 | 0.9 | 00:00:17.30 |
| 3 | 腕を回す運動 | 2 | 00:00:17.70 |
| 4 | 胸を反らす運動 | 0.9 | 00:00:17.20 |
| 5 | 体を横に曲げる運動 | 0.7 | 00:00:16.40 |
| 6 | 体を前後に曲げる運動 | 0.3 | 00:00:16.30 |
| 7 | 体をひねる運動 | 0.1 | 00:00:16.20 |
| 8 | 腕を上下に伸ばす運動 | 0.3 | 00:00:16.00 |
| 9 | 体を斜め下に曲げ胸を反らす運動 | 0.6 | 00:00:16.90 |
| 10 | 体を回す運動 | 0.7 | 00:00:16.90 |
| 11 | 両脚で跳ぶ運動 | 1.2 | 00:00:12.60 |
| 12 | 脚を付け根から大きく振る運動 | 0.9 | 00:00:16.90 |
| 13 | 深呼吸の運動 | 1.3 | 00:00:33.29 |
| 14 | おしまい（通しの動画より） | 00:03:49.61 | - |


# 結合
1番から13番の運動及び導入部(0番)とおしまい(14番)の動画を繋げて一つの動画ファイルにする。

次のような内容のlist.txtを用意して、
```
file 0.mp4
file 1.mp4
file 2.mp4
file 3.mp4
file 4.mp4
file 5.mp4
file 6.mp4
file 7.mp4
file 8.mp4
file 9.mp4
file 10.mp4
file 11.mp4
file 12.mp4
file 13.mp4
file 14.mp4
```

次のコマンドを実行すれば連結できる。
```sh
ffmpeg -f concat -i list.txt -c copy <output_file>
```

# おわりに

まあ、別バージョンの動画がyoutubeにあるんですけどね。
https://www.youtube.com/watch?v=jPeHKtiFXIg
みなさんも超快適になりましょう。