LED パネルキット AKBONE2022 で動画再生

秋葉原ロボット部で開発している LEDパネルキット AKBONE2022 は、らびやん さんの協力により LovyanGFX で動くようになっています。

今回は、高速で使いやすい LovyanGFX の特性を活かして動画再生にチャレンジ!

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">128x64 のLEDパネルで動画再生 <a href="https://twitter.com/hashtag/AVTOKYO?src=hash&amp;ref_src=twsrc%5Etfw">#AVTOKYO</a> で頒布したAKBONE2022 + LovyanGFX ( 開発版 ) <a href="https://t.co/tdf1qIgGF0">pic.twitter.com/tdf1qIgGF0</a></p>&mdash; nanbuwks (@nanbuwks) <a href="https://twitter.com/nanbuwks/status/1603066277093773312?ref_src=twsrc%5Etfw">December 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 環境

- AKBONE2022 基本キット
- AKBONE2022 ブースターキット
- 母艦 Ubuntu 22.04 LTS Ja

母艦は動画ファイルの変換に使います。ですが ffmpeg を使うことができれば Windows や Mac でも同様に使えるはずです。

ブースターキットのうち、今回の実験ではSDカードソケットだけを使用します。なので基本キットにSDのカードソケットだけを付け足すのでも構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/aebc6071-e52e-6b36-a58d-b8bc80a5addb.png)

LEDパネルは 64x32, 128x64 どちらでも対応できますが、やはり解像度が高い方が見栄えがいいです。

# 元動画

WikiMedia から、File:Hubblecast 27.webm を使用しました。
https://commons.wikimedia.org/wiki/File:Hubblecast_27.webm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7b3a9231-4773-f3b6-4120-1d7f06572591.png)

元動画は length 6 min 44 s, 1,920 × 1,080 pixels です。

WikiMedia では、各解像度にトランスコードされたファイルが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a666c678-1702-5262-e404-2df498be7464.png)

今回使用しようとしている LEDパネルは 64x32 または 128 x 64 ドットなので、サイズが合いませんが最も解像度の低い Hubblecast_27.webm.160p.webm をダウンロードします。


# 動画を調査

```
$ ffmpeg -i Hubblecast_27.webm.160p.webm
.
.
.
  libpostproc    55.  9.100 / 55.  9.100
Input #0, matroska,webm, from 'Hubblecast_27.webm.160p.webm':
  Metadata:
    encoder         : Lavf57.56.101
  Duration: 00:06:44.05, start: 0.000000, bitrate: 221 kb/s
  Stream #0:0(eng): Video: vp8, yuv420p(progressive), 284x160, SAR 1:1 DAR 71:40, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
  Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
At least one output file must be specified
```

とすると、 284x160 であることがわかります。
これを 64x32 ないし 128x64 に変換します。

# 動画を変換

```
$ ffmpeg -i Hubblecast_27.webm.160p.webm -vf "crop=256:128:14:16,scale=w=64:h=32"  -c:v rawvideo -pix_fmt rgb565be 64x32.rgb
$ ffmpeg -i Hubblecast_27.webm.160p.webm -vf "crop=256:128:14:16,scale=w=128:h=64"  -c:v rawvideo -pix_fmt rgb565be 128x64.rgb
```
上の処理は、一旦256x128にトリミングして、更に縦横 1/4 ないし 1/2 に縮小しています。
フォーマットはRGB565be です。

また、今回は使用しませんが 256x128 や 384x192 の映像も以下のようにすると作ることができます。
```
$ ffmpeg -i Hubblecast_27.webm.160p.webm -vf "crop=256:128:14:16"  -c:v rawvideo -pix_fmt rgb565be 256x128.rgb
```
384x192 の映像は 240p のソースから作成します。
```
$ ffmpeg -i Hubblecast_27.webm.240p.webm 
.
.
.
Input #0, matroska,webm, from 'Hubblecast_27.webm.240p.webm':
  Metadata:
    encoder         : Lavf57.56.101
  Duration: 00:06:44.05, start: 0.000000, bitrate: 302 kb/s
  Stream #0:0(eng): Video: vp8, yuv420p(progressive), 426x240, SAR 427:426 DAR 427:240, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
  Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
At least one output file must be specified
```
426x240ドットということがわかりましたのでそこから384x192分を切り出します。

```
$ ffmpeg -i Hubblecast_27.webm.240p.webm -vf "crop=384:192:21:24"  -c:v rawvideo -pix_fmt rgb565be 384x192.rgb
```

64x32.rgb ないし 128x64.rgb を sd カードに保存します。


# スケッチ

https://github.com/nanbuwks/AKBONE2022/blob/main/Arduino/sketchbook/SD_video/SD_video.ino

こちらを使います。

# 動画再生


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d6b954ea-9229-a6bb-a116-471d476e8d02.png)

写真では色が褪せてますが実物はかなりきれいです!
これだけできたら音も出したくなりますね! これから思案します。

# 注意点

LEDパネルはかなり電力を使用するので、ESP32 に供給している電源ケーブルだけだと不足気味です。
LEDパネルは輝度を低めにして使うほうが安定します。
補助電源コードなども併用してください。