Google Colaboratory で動画をダウンロード＆ちょっと編集する

## はじめに
こんにちは。
突然ですが、みなさん、機械学習のデモプログラムをColabで回しているときに、このようななことはないでしょうか？
「動画系の機械学習のデモプログラムを動かすのにGoogle Colaboratory（以下 Colab）が便利！でも、手元に手頃な動画がない！」

たまにあると思います。
そこで、この記事では、Colab で適当な動画をYouTubeなどの動画共有サイトからダウンロードする方法と、その後の雑多なテクニックを紹介していこうと思います。

ちなみに、個人的な話ですが、この記事は私のQiita初めての投稿です。そのため、どうしても至らない点が多いと思います。間違っている点などがありましたらコメントなどでお知らせください。

## 動画をダウンロードする方法
やることはとてもシンプルで、以下のコードをセルにコピペして実行するだけです。

```
# 動画をダウンロードする
!pip install youtube-dl
!youtube-dl https://youtu.be/5LI1PysAlkU
```

上記のコードのURL部分を適宜、各自ダウンロードしたい動画のURLに読み替えてください。
このコードをコピペしたセルを実行して、しばらく待つと、動画がランタイムのストレージに保存されます。
youtube-dlをColab上で使う際の注意点は以下のとおりです。

 - 動画のダウンロードに時間がかかる。
 
:::note info
最近のColabでは、youtube-dlでの動画のダウンロードが以前より格段に遅くなっています。想定しているより時間がかかるので、実行する際には少し暇を潰せるものを用意しておくといいと思います。
:::

 - 一部の動画はダウンロードできない

:::note info
少数ですが、ダウンロードできない動画があります。詳しい基準はわかりませんが、ミュージックビデオなどはダウンロードができない傾向にあるようです。
:::

 - そもそもダウンロードが規約的にOKなのか曖昧

:::note info
例えばYouTubeの規約（https://www.youtube.com/static?template=terms&hl=ja&gl=JP ）を参照すると、基本的に運営は動画のダウンロードを禁じています。しかし、Githubなどに掲載されている動画系の機械学習のデモノートブックを見てみると、youtube-dlが普通に利用されていることも少なくありません（参照：superslomo https://github.com/dvschultz/ml-art-colabs/blob/master/SuperSloMo.ipynb ）。
この辺の裁定は私もいまいちわかっていません。この辺に明るいかたがいらっしゃれば是非教えて下さい。
なお、クリエイティブ・コモンズとして認められている動画はダウンロードしても大丈夫だそうです。
:::
動画のダウンロードが終わったら、次の「ダウンロードしたけど…どうしたらいいの？」に進みましょう。






## ダウンロードしたけど…どうしたらいいの？
ダウンロードしたままの動画では、動画時間が長すぎるといった場合や、動画のアスペクト比が適してないという場合が考えられます。このままでは不便ですね。
そこで、動画の加工が必要になってきます。
動画の加工をするためには、まず動画のパスを知る必要があります。パスについての詳しい説明は他の記事にまかせるとして、ここでは先程ダウンロードした動画のパスをクリップボードに保存する手順をかんたんに説明します。そんなの知ってるよ！という人は読みとばしてもらって構いません。
それでは、さっそく保存された動画のパスを見に行きましょう。

![スクリーンショット 2021-11-25 203335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323581/d52ff4a8-ae5b-ddc0-ac1c-a4de08d709f3.png)
まずは、画像に示した、ファイルマークをクリックしてください。これで、Colabのファイルブラウザが開くと思います。
動画を見つけたら、ファイル名のところで右クリックしてメニューを表示させます。以下の画像のようになると思います。
そしたら、「パスをコピー」を押します。
![スクリーンショット 2021-11-25 203704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323581/d2a740f0-62ee-2a4e-cba2-a3880572d594.png)

すると、クリップボードに、ダウンロードした動画へのパスを保存することができます。
あとはセル内の適当な場所にペーストすれば、色々することができます。


## 応用例1 : 動画を指定の時間でカットする
動画を適当な長さに切っておきたいという場合があると思います。
動画を指定の時間でカットするには、以下のコードをコピペして実行します。

```
# ダウンロードした動画を指定した時間でカットする
video_path = '"/content/path_to_video.ext"'
start_sec = 60
duration = 10
!ffmpeg -y -ss ${start_sec} -i ${video_path} -t ${duration} output_cut.mp4
```

・video_path には、前項（「ダウンロードしたけど…どうするの？」）で入手した動画へのパスを入力してください。
・start_sec には動画の開始時間を入力してください。
・duration には書き出される動画の再生長を入力してください。

実行すると、/content/output_cut.mp4 に、最初の60秒をカットして、そこから10秒間の動画が出力されます。
出力された動画は、前項（「ダウンロードしたけど…どうするの？」）の要領でまた使用することができます。

## 応用例2 : 動画の一部を切り取る
動画の全体じゃなくて、中央に写ったものだけ欲しいという場合もあると思います。
動画を指定の場所でクロップするには、以下のコードをセルにコピペして実行します。

```
# ダウンロードした動画を中央を中心に、指定の幅でクロップする
video_path = '"/content/path_to_video.ext"'
w = 100
h = 100
!ffmpeg -y -i ${video_path} -vf crop=${w}:${h} output_crop.mp4
```
変数w, hにそれぞれ値を入れることで、縦と横、何ピクセルでクロップしたいかを指定することができます。
上記のコードを実行すると、縦横100ピクセルにクロップされた動画がパス/content/output_crop.mp4 に保存されます。

また、上記のコードでは、中央からでしかクロップできません。クロップする位置をずらしたい場合は、別途に座標を指定する必要があります。
その際のコードの例は以下の通りです。

```
# ダウンロードした動画を指定の位置でクロップする
video_path = '"/content/path_to_video.ext"'
w = 100
h = 100
x = 10
y = 10
!ffmpeg -y -i ${video_path} -vf crop=${w}:${h}:${x}:${y} output_crop2.mp4
```
このコードを実行すれば、左上の座標が(10,10)で、幅と高さがそれぞれ100（単位：ピクセル）の長方形で動画をクロップすることができます。


## 動画を表示させてみる
編集した動画を確認したいという場合があると思います。動画をダウンロードするという方法が簡単ですが、動画が短い場合、Colabの出力で動画を表示させることも可能です。
その場合、以下のコードをセルにコピペして実行します（引用：SuperSlomo.ipynb https://colab.research.google.com/github/tugstugi/dl-colab-notebooks/blob/master/notebooks/SuperSloMo.ipynb#scrollTo=s0fRYO0UWcH9 ）

```
video_path = '"/content/path_to_video.ext"'
def show_local_mp4_video(file_name, width=640, height=480):
  import io
  import base64
  from IPython.display import HTML
  video_encoded = base64.b64encode(io.open(file_name, 'rb').read())
  return HTML(data='''<video width="{0}" height="{1}" alt="test" controls>
                        <source src="data:video/mp4;base64,{2}" type="video/mp4" />
                      </video>'''.format(width, height, video_encoded.decode('ascii')))

show_local_mp4_video('video_path', width=960, height=720)
```
video_path 変数に表示させたい動画のパスを代入してください。

##動画を実際に利用してみる
これで、デモプログラムに適した動画を用意することができたと思います。
用意した動画を使うことができるデモプログラムは以下のようなものが挙げられます。

 - Tecogan : https://colab.research.google.com/github/sony/nnabla-examples/blob/master/interactive-demos/tecogan.ipynb 
 - SuperSlomo : https://colab.research.google.com/github/tugstugi/dl-colab-notebooks/blob/master/notebooks/SuperSloMo.ipynb
 - First Order Motion for Image Animation : https://colab.research.google.com/github/AliaksandrSiarohin/first-order-model/blob/master/demo.ipynb



## おわりに
いかがだったでしょうか。
Colab上での動画編集において、他にも様々なテクニックがあります。
今回は投稿期限の都合上、一部のテクニックしか紹介することができませんでした。
機会があれば、他のテクニックも紹介したいと思っています。
また、至らない点が多かったと思います…。最後までお読みくださりありがとうございました。(._.)
間違っている箇所などがございましたら、コメントなどでお知らせください。
## 参考
記事の作成にあたって、以下の情報を参考にさせていただきました。

 - https://nico-lab.net/cutting_ffmpeg/
 - https://nico-lab.net/crop_with_ffmpeg/