【超初心者向け】Windows PCで簡単に単色背景の動画を別の動画に重ねる

# 概要
動画編集ソフトの使い方を覚えたりしなくても、文字を打つだけで簡単にPC上で動画同士を重ねられる方法を紹介します。ほぼこの記事のコマンドをコピーするだけで動画を合成できます。
具体的には、
![suzume_3s_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/8e94078d-19a2-2aa3-c485-bdb25a73f57a.gif)
と
![fire_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/aa26c759-b337-2ace-dab8-6970be710bf6.gif)
から、
![firesuzume_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/4fa5c0d0-93a5-a6ce-17a9-b13fcfd95d3b.gif)
が作れます。
なお、この記事は「コマンドライン？湘南新宿ラインの親戚？」「PowerShell？何だか強そうな貝ですね！」くらいの人向けに書いているつもりです。なので、ほとんどの人は「そんなこと書かれなくてもわかってるよ！」と言いたくなると思いますが、どうかご容赦ください。
# 背景
[某バンドのSNSキャンペーン](https://x.com/galileo_news/status/1831256656363278558)で、配布された動画素材を他の動画に重ねて投稿してね！というのがあり、スマホでの編集方法はいくつか紹介されていたのですが、PCでのやり方はあまり見つからなかったので書いてみました。
※[上記のキャンペーン](https://x.com/galileo_news/status/1831256656363278558)用の動画を作りたい方は、記事中の"suzumeGB40s.mp4"の代わりに、公式から配布されている動画素材（"すずめちゃんGB 40s.mp4"）を使用してください。サイズや背景色を全て同じにしているので、コマンドをコピーすればそのまま使えます。
# 下準備
## 下準備1：ffmpegのインストール
この記事では、ffmpegというソフトを使って動画を編集します。
ffmpegというのは、コマンドと呼ばれる文字列だけを使って動画を編集できるフリーソフトです。なので、普通の動画編集ソフトのように、一つ一つのボタンの名前や使い方を覚えたりする必要がありません。
非常に複雑な編集をする場合は一般的な動画編集ソフトの方が便利かもしれませんが、「動画の一部の領域を切り出す」、「動画の特定の時間だけを取り出す」、「動画から静止画を抜き出す」、「動画のファイル形式を変更する」のような単純な操作においては、ffmpegはとても便利です。
### 方法1：wingetを使ってインストール
ffmpegのインストールは、wingetというものを使うととても簡単にできます。
まずは、Windows PowerShellを起動します。
Windowsボタンの右側にある虫眼鏡のマークをクリックして、表示される検索窓に"PowerShell"と打ち込むと、下のようにWindows PowerShellが出てくるので、青枠で囲った部分を右クリックし、出てきた項目から「管理者として実行」をクリックします。
![PowerShell_search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/058d2077-23b7-3317-c883-dc53d7db9f7a.png)
そうすると、下のような画面が出てきます。これがWindows PowerShellです。
以下では、このウィンドウにコマンドを打ち込んでいきます。
![powershell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/a376e693-1960-5da3-13af-327a76d5cddb.png)
この画面の一番下の行の">"の右側に、下記のコマンドを打って、Enterキーを押します。下の文字列をコピーしてそのまま貼り付ければ大丈夫です。
~~~
winget install ffmpeg
~~~
`すべてのソース契約に同意しますか？`という文字列が表示されたら、"y"と入力してEnterキーを押してください。
インストールが終わると、`>`で終わる行が表示されます。
この行が表示されたら、下のコマンドを打って`Enter`キーを押してみましょう。
~~~
ffmpeg -version
~~~
次のようなバージョン情報が出てくれば成功です。「[下準備2：ファイルの準備](##-下準備2：ファイルの準備)」に進んでください。
~~~
ffmpeg version N-101466-gb7bf631f91 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9.3-win32 (GCC) 20200320
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-zlib --enable-libxml2 --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-opencl --enable-libvmaf --enable-vulkan --enable-libvorbis --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --enable-ffnvcodec --enable-cuda-llvm --enable-libglslang --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --disable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-libs=-lgomp
libavutil      56. 68.100 / 56. 68.100
libavcodec     58.130.100 / 58.130.100
libavformat    58. 72.100 / 58. 72.100
libavdevice    58. 12.100 / 58. 12.100
libavfilter     7.109.100 /  7.109.100
libswscale      5.  8.100 /  5.  8.100
libswresample   3.  8.100 /  3.  8.100
libpostproc    55.  8.100 / 55.  8.100
~~~
### 方法2：手動インストール
方法1のやり方でインストールできなかった場合は、ffmpegを手動でインストールします。
こちらのやり方については、すでにたくさん記事がありますし、その時の最新の記事を参照する方が良いので、ここでは割愛します。`"ffmpeg インストール"`等と検索すれば記事が出てくると思います。
例えば、下記のページなどが参考になると思います。（Windows11でも同様の手順でインストールできます。）
[Windows10へのFFmpegのインストール方法](https://miraisozodo.com/for_windows10_ffmpeg/)
基本的には、公式ページからzipファイルをダウンロードして解凍し、"bin"フォルダの場所を環境変数に設定するだけなので、そんなに難しいことはありません。「環境変数」という聞き慣れない言葉に戸惑うかもしれませんが、単に設定を変更するだけです。
## 下準備2：ファイルの準備
続いて、動画ファイルの準備をします。
まず初めに、エクスプローラー（![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/8f62f3b5-2853-add3-4193-0d72ec7c5eb7.png)）の設定を変更し、ファイルの`.`以降（拡張子といいます）が表示されるようにします。
エクスプローラーを開き、下図の①~③の順に項目をクリックして、「ファイル名拡張子」の左側に✓が表示されるようにしてください。
![exprolar_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/daf6d26d-7c68-cb2f-3bb4-9a9804eff68b.png)
設定が終わったら、背景として使う動画と、その上に重ねたい動画を同じフォルダに入れます。
今回の動画合成用のフォルダを新しく作って、その中に入れると分かりやすいです。
この時、フォルダ名を英数字と記号だけにしておくと、色々と便利だと思います。スペースは使わないようにしてください。
単色背景の動画を持っていないけれども、練習としてこの記事の内容を試してみたい、という場合には、下記のリンク先から、記事の冒頭に入れたすずめちゃんが回転する動画をダウンロードして使ってください。

https://drive.google.com/file/d/1wtYguHYShJX7_aqvINLKuo19zHQIsqzq/view?usp=sharing

背景に使用する動画は何でも良いです。手持ちの動画やフリー素材を使ってください。
もし、**ファイル名にスペース（空白）が入っている場合はスペースを消してください**。（[SNS投稿キャンペーン](https://x.com/galileo_news/status/1831256656363278558)で配布されている動画のファイル名にはスペースが入っているので必ず消してください。）
ちなみに、「ファイルの名前を変更しようとしてダブルクリックするとファイルが開いてしまう！」とイライラしている方は、ファイルを一度クリックして、`F2`キーを押すとスムーズにファイル名を変更できます。
なお、動画の`.`以降が`.mp4`だった場合は、背景用の動画のファイル名を`background.mp4`、上に重ねる動画のファイル名を`suzumeGB40s.mp4`にしておくと、後の作業をほぼコピペだけで進めることができます。（`.`以降が`.mp4`ではなかった場合は、無理に変更しないでください。）
2つの動画を同じフォルダに入れたら、このフォルダの場所（パスと言います）をコピーします。
エクスプローラーで2つの動画が入ったフォルダを開いた状態でエクスプローラーの上のバーをクリックすると、下の画像のように`C:￥user~\`という文字列の背景に色がつくので、このまま`Ctrl`キーと`c`を同時に押してこの文字列をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/83d5cac6-a391-b9a5-ecaa-509b0684132d.png)
そうしたらまたPowerShellに戻って、次の文字列を入力して`Enter`キーを押します。`[コピーした文字列]`の部分は、さっきコピーした文字列を入れてください。
~~~
cd [コピーした文字列]
~~~
このコマンドは、PCに作業してほしい場所を教えるコマンドです。
これで下準備は終わりです。
# 動画同士を中心で重ねる
2つの動画を中心同士で重ねるだけでよければ、次のコマンドを打ち込み、`Enter`キーを押すとできます。ファイル名は、`.`以降も必ず入力してください。合成語の動画のファイル名の`.`以降は、特にこだわりがなければ`.mp4`で良いと思います。
~~~
ffmpeg -i [背景動画のファイル名] -i [上に重ねる動画のファイル名] -filter_complex "[1:0]colorkey=00FA00:0.5:0.01[colorkey];[0:0][colorkey]overlay=x=(W-w)/2:y=(H-h)/2:shortest=1" -preset ultrafast [合成後の動画のファイル名]
~~~
例えば、背景動画のファイル名が`background.mp4`、上に重ねる動画のファイル名が`suzumeGB40s.mp4`であり、合成後の動画のファイル名を`combine_center.mp4`にする場合は、次のコマンドをコピーして貼り付け、`Enter`キーを押すだけで動画を作成できます。
~~~
ffmpeg -i background.mp4 -i suzumeGB40s.mp4 -filter_complex "[1:0]colorkey=00FA00:0.5:0.01[colorkey];[0:0][colorkey]overlay=x=(W-w)/2:y=(H-h)/2:shortest=1" -preset ultrafast combine_center.mp4
~~~
こうしてできたのが[下の動画（リンクから閲覧可）](https://drive.google.com/file/d/1t5JXxA2IjAXCpbX5TI5mXy24rrq0WWp6/view?usp=drive_link)です。（実際は11秒あります）
![firesuzume_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/4fa5c0d0-93a5-a6ce-17a9-b13fcfd95d3b.gif)
***これで十分という方はこれでおしまいです。お疲れさまでした！***
一応、上のコマンドを少しだけ解説しておきます。
`colorkey=00FA00`は、上に重ねる動画の背景色を16進数で指定しています。一部の色は、色の名前でも指定できます。例えば、背景が白（FFFFFF）の場合は、`colorkey=FFFFFF`でも、`colorkey=white`でも大丈夫です。
`x=`、`y=`の部分は、上に重ねる動画の左上の位置（`x=`は左からの位置、`y=`は上からの位置）を指定しています。単位はピクセルです。`W`と`H`は背景の動画の幅と高さ、`w`と`h`は上に重ねる動画の幅と高さを表しています。
`shortest=1` は、動画の時間が短い方が終わったら、合成を終えるという意味です。これを省略するか、`shortest=0`とすると、短い方が終わっても動画の合成が続き、短い方の動画の最後の状態がずっと表示されることになります。
# 応用編
もう少し凝ったことをしてみたい、という方はこれ以降も少しお付き合いください。
## 動画から音声を消去する
背景動画に音声が入っていて、それを消去したいという場合には、次のコマンドを使用します。
~~~
ffmpeg -i [元動画のファイル名] -vcodec copy -an [音声消去後のファイル名]
~~~
## 動画の一部の領域だけを取り出す（クロップする）
下のコマンドを使えば、動画中の任意の領域を取り出せます（クロップと言います）。位置は、元動画の左端からの位置、上端からの位置を、ピクセルで指定します。領域の位置を知る方法は、[補足：動画中の位置を調べる](#-補足：動画中の位置を調べる)を参考にしてください。
~~~
ffmpeg -i [元動画のファイル名] -vf crop=[取り出したい幅]:[取り出したい高さ]:[取り出したい領域の左端の位置]:[取り出したい領域の上端の位置] [取り出した後の動画のファイル名]
~~~
たとえば、上に乗せる動画（`suzumeGB40s.mp4"`）のすずめちゃん部分だけを取り出し、取り出した後の動画のファイル名を`suzumeGB40s_crop.mp4`とするなら、下のコマンドを実行（コマンドを入力して`Enter`キーを押すこと）します。
~~~
ffmpeg -i suzumeGB40s.mp4 -vf crop=360:360:780:360 suzumeGB40s_crop.mp4
~~~
## 任意の位置で動画を重ねる
[動画の一部の領域だけを取り出す（クロップする）](#-動画の一部の領域だけを取り出す（クロップする）)で作成した動画を使って、[動画同士を中心で重ねる](#-動画同士を中心で重ねる)で紹介したコマンドの`x=`、`y=`の部分を修正すれば、好きな位置にすずめちゃんを表示できます。重ねる位置を知る方法は、[補足：動画中の位置を調べる](#-補足：動画中の位置を調べる)を参考にしてください。
例えば、`background.mp4`の上に、左端から50ピクセル、上端から100ピクセルの位置に`suzumeGB40s_crop.mp4`を重ね、重ねた後の動画を`combine_cp.mp4`とする場合は、次のコマンドを実行します。
~~~
ffmpeg -i background.mp4 -i suzumeGB40s_crop.mp4 -filter_complex "[1:0]colorkey=00FA00:0.5:0.01[colorkey];[0:0][colorkey]overlay=x=50:y=100:shortest=1" -preset ultrafast combine_cp.mp4
~~~
これを実行すると、下のような動画を作ることができます。
![combine_cp_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/28d7facf-30ae-ef2d-4189-396bdb44f019.gif)
## 動画から任意の時間範囲だけを取り出したい（トリミング）
動画から任意の一部分だけを取り出したい場合は、次のコマンドを使用します。
~~~
ffmpeg -i [元動画のファイル名] -ss [取り出したい部分の開始時間] -t [取り出したい時間の長さ] -c copy [取り出した後の動画のファイル名]
~~~
また、下のコマンドでも同じことができます。
~~~
ffmpeg -ss [取り出したい部分の開始時間] -i INPUT.mp4 -to [取り出したい部分の終了時間] -c copy [取り出した後の動画のファイル名]
~~~
さらに、動画の初めから取り出したいという場合には`-ss [取り出したい部分の開始時間]`を、動画の終了まで取り出したいという場合は`-to [取り出したい部分の終了時間]`を省略することができます。
## 動画の大きさを変える
動画の縦横比を保ったまま、拡大・縮小を行う時は、次のコマンドを使います。
* 横幅を指定するとき
~~~
ffmpeg -i [元動画のファイル名] -vf scale=[横幅]:-1 [大きさ変更後のファイル名]
~~~
* 縦幅を指定するとき
~~~
ffmpeg -i [元動画のファイル名] -vf scale=-1:[縦幅] [大きさ変更後のファイル名]
~~~
## 動画の前後に空白時間を付け足したい
上に乗せる動画を、背景動画の途中から始めたい/途中で終わらせたい時は、上に載せる動画の前後に空白時間を付け加えて、それを使って合成すると簡単です。（もっとうまいやり方があるかもしれません。）
* 前に空白時間を加える
~~~
ffmpeg -i [元動画のファイル名] -vf tpad=start_duration=[加える空白時間の長さ(秒)]:color=[背景色] -af "adelay=[加える空白時間の長さ(秒)]s:all=1" [空白を加えた後のファイル名]
~~~
* 後に空白時間を加える
~~~
ffmpeg -i [元動画のファイル名] -vf tpad=stop_duration=[加える空白時間の長さ(秒)]:color=[背景色] -af "apad=pad_dur=[加える空白時間の長さ(秒)]" [空白を加えた後のファイル名]
~~~
## 参考：全てのコマンドを適用した結果
ここで紹介したコマンドを全部使うと、下のような動画を作ることができます。
![combine3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/b77eaa4f-f9e1-8795-6152-6fbc69f9338b.gif)
## 補足：動画中の位置を調べる
動画の一部の領域を切り出す位置や、重ねる位置を調べる方法は色々ありますが、例えば下のような方法があるので参考にしてください。
### 1．動画の1場面を静止画で切り出す
動画中の任意の時間の静止画を切り出すためには、次のコマンドを使います。
~~~
ffmpeg -ss [切り出したい時刻] -i [元動画のファイル名] -frames:v 1 [出力する静止画のファイル名]
~~~
例えば、背景動画（`background.mp4`）の0秒目を`test_img.png`というファイル名の静止画にしたいときには、次のコマンドになります。
~~~
ffmpeg -ss 0 -i background.mp4 -frames:v 1 test_img.png
~~~
### 2．静止画中の位置を調べる
切り出した静止画を「ペイント」で開き、位置を知りたいところにカーソル（+のマーク）を合わせます。
そうすると、左端にカーソルの位置が表示されます。（左側の数字が左端からの位置、右側の数字が上端からの位置。単位はピクセル。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880991/c88b2666-39b9-dd3b-fa34-ee582f6e9f48.png)
この数字をメモしておけば、領域を切り出す位置や、重ねる位置を指定できます。