YouTube から動画を抽出して、そこからLGTM用のGIFアニメを作る

( ＾ω＾) ここに youtube の動画があるじゃろ?

![](https://31.media.tumblr.com/1598535a975a3ebf3fcdac8a8f324ca9/tumblr_n900gblLLM1qz56lho1_250.png)

https://www.youtube.com/watch?v=h3jFRvXFwWA)

これをこうして… 
( ＾ω＾) 
 ≡⊃⊂≡ 

こうじゃ

 ( ＾ω＾) 
![](https://38.media.tumblr.com/cc89bcfe1aa430058d2f768c08a0cac4/tumblr_n9008h5nep1qz56lho3_250.gif) 

## やること

- pytube で、youtube をダウンロード
- ffmpeg を使って、動画をフレーム毎に画像に変換
- ImageMagick の composite コマンドを使って、変換した画像に LGTM を重ねる
- ImageMagick の convert コマンドを使って、画像をGIFアニメ化
- サイズを減らす為に、GIFアニメを減色
- lgtm.in に アップロード

## pytube で、youtube をダウンロード

### pytube とは?

Python の youtube 用ライブラリ

### インストール

```
$ pip install pytube
```

### 動画のダウンロード

Usage Example に沿って実行

```
$ python

Python 2.7.6 (default, Apr  9 2014, 11:54:50)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from pytube import YouTube
>>> yt = YouTube()
>>> yt.url = "https://www.youtube.com/watch?v=h3jFRvXFwWA"
>>> from pprint import pprint

# video の情報を取得
>>> pprint(yt.videos)
[<Video: MPEG-4 Visual (.3gp) - 144p>,
 <Video: MPEG-4 Visual (.3gp) - 240p>,
 <Video: Sorenson H.263 (.flv) - 240p>,
 <Video: H.264 (.mp4) - 360p>,
 <Video: H.264 (.mp4) - 720p>,
 <Video: VP8 (.webm) - 360p>]

# ダウンロード
>>> video = yt.get('mp4', '720p')
>>> video.download('/tmp')

Downloading: 'アザラシと飼育員のおじさんのいちゃちゃっぷりが可愛すぎた.mp4' (Bytes: 2862856)

```

```
ll /tmp
-rw-r--r--  1 kasei_san  wheel  2862856  7 20 15:04 アザラシと飼育員のおじさんのいちゃちゃっぷりが可愛すぎた.mp4
```

ダウンロードされた

## ffmpeg を使って、動画をフレーム毎に画像に変換

### インストール

```
$ brew install ffmpeg
```

## 動画をフレーム毎に画像に変換

```
$ mkdir pngs
$ ffmpeg -i 01.mp4 -an -r 10 -vf crop=406:406:0:157 pngs/%04d.png
```

### オプション

 -i : 入力ファイルを指定
 -an : 音声は出力しない
 -r : フレームレート(1秒間に何フレーム抽出するか)
 -vf crop : 出力結果のトリミング(出力サイズx:y:トリミング開始位置x:y)
 -s : リサイズ(出力サイズ) : 640x480 等

元動画が縦長なので、トリミングした 

### 出力結果

pngs/ ディレクトリに、画像が大量に生成される
![](http://31.media.tumblr.com/fc7515fd86d59464d10af7a5783f41a5/tumblr_n9008h5nep1qz56lho6_250.png)

## ImageMagick の composite コマンドを使って、変換した画像に LGTM を重ねる

### インストール

```
$ brew install imagemagick
```

### 合成用のLGTM

透過 png の画像を用意する

- http://37.media.tumblr.com/afe4d1b7f004310606a860120f7fc226/tumblr_n9008h5nep1qz56lho5_400.png

### 画像の合成

動画全部ではなく、一部の画像を抽出する

```
$ for i in {0200..0220}; do; composite -gravity center -compose over lgtm.png pngs/${i}.png 
$ tmp/${i}.png; done
```

### 合成結果

![](http://33.media.tumblr.com/771da5d6fac5cd8813f9de466d9139fb/tumblr_n9008h5nep1qz56lho7_250.png)

## ImageMagick の convert コマンドを使って、画像をGIFアニメ化

```
$ convert -delay 10 -layers optimize tmp/*.png lgtm.gif
```

 -delay x : 1枚の画像を100分のx秒間表示する
 -layers optimize : 画像サイズを最適化してくれるはず

### 出力結果

![](https://38.media.tumblr.com/46c4145df27de7266fd138482d960994/tumblr_n9008h5nep1qz56lho4_250.gif)

## サイズを減らす為に、GIFアニメを減色

```
$ convert lgtm.gif -coalesce -colors 50 lgtm_color50.gif
$ convert lgtm.gif -coalesce -colors 25 lgtm_color25.gif
```

### サイズ比較

```
ll -h lgtm*.gif
-rw-r--r--  1 kasei_san  wheel   1.7M  7 20 15:39 lgtm.gif
-rw-r--r--  1 kasei_san  wheel   1.0M  7 20 15:42 lgtm_color25.gif
-rw-r--r--  1 kasei_san  wheel   1.3M  7 20 15:42 lgtm_color50.gif
```

### 見た目比較

非加工
![](https://38.media.tumblr.com/46c4145df27de7266fd138482d960994/tumblr_n9008h5nep1qz56lho4_250.gif)

50色
![](https://31.media.tumblr.com/47e383e1262734cef600ed0a2fc4b42a/tumblr_n9008h5nep1qz56lho2_250.gif)

25色
![](https://31.media.tumblr.com/7cad4832980f8da7ab835d14ad072502/tumblr_n9008h5nep1qz56lho1_250.gif)

元動画の感じで適当に色を減らすと良いと思う

### lgtm.in にアップロード

アップロードするために、一度どこかで公開する必要がある
tumblr が手軽なので、そちらに一度upしてから、submit する

- http://www.lgtm.in/i/qtqgy0jOp

## TODO

一括でやってくれるスクリプトを書きたい

## 参考

- [よくわからない現代魔法 ffmpegのオプション](http://yosilove.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/ffmpeg%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)
- [ffmpeg と ImageMagick で動画をアニメGIF 変換](http://futuremix.org/2012/03/ffmpeg-imagemagick-animation-gif)
- [PythonでYouTubeの動画を自動的に検索&ダウンロードする - Qiita](http://qiita.com/u651601f/items/1323ebe67ac0b4a38766)
- [streamio/streamio-ffmpeg · GitHub](https://github.com/streamio/streamio-ffmpeg)
- [rmagick/rmagick · GitHub](https://github.com/rmagick/rmagick)
- [ffmpeg 使い方](http://linux-suomi.net/modules/sinyD0/index.php?id=18#08)