Raspberry Piの小さな液晶のPiTFTを仮想画面スクロールで広く使いたかったけど挫折

IMGP2681

Raspberry Pi用でAdaruit製のGPIO経由(SPI)で接続する320×240 2.8"のタッチスクリーン付きのディスプレイ.動作には専用のドライバが必要.ドライバはsourceの他にAdaruitがRasbianに組み込み済みのものと,ビルド済みのリポジトリが用意されている.

Afafruit謹製のOSイメージ入手

通常のRasbianにAdafruitのリポジトリを追加する方法と,それを反映済みのOSイメージを使う方法(と自分でbuildする方法)がある.ここでは手順の少ないAfafruit謹製のOSイメージを利用する.こちらからwheesy/jessieのものが入手可能.

今回はjessie(2015-09-24-raspbian-jessie-pitft28r.zip)を利用.hashや署名は見当たらず.手元ではこんな感じだった.

$ md5sum 2015-09-24-raspbian-jessie-pitft28r.zip
e78c764abbd3426d63d9ae7180fcdfa8  2015-09-24-raspbian-jessie-pitft28r.zip
$ sha512sum 2015-09-24-raspbian-jessie-pitft28r.zip
a6be01345be6030aaf0bc85293a946be4db54e80a42dbbab0034ddff3c21e842fc10f7f066acd605ffd9d16b6d43e14631e7d5a969a7f2a0869d7d00f013d8fd  2015-09-24-raspbian-jessie-pitft28r.zip

SD Cardデバイス確認

$ dmesg | tail -3
[793679.349596] mmc0: new high speed SDHC card at address 59b4
[793679.350315] mmcblk0: mmc0:59b4 USDU1 14.9 GiB
[793679.351411]  mmcblk0: p1 p2 p3
$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 15 GiB, 16088301568 bytes, 31422464 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb3c5e39a
 
Device         Boot    Start      End  Sectors  Size Id Type
/dev/mmcblk0p1          8192   131071   122880   60M  c W95 FAT32 (LBA)
/dev/mmcblk0p2        131072 27228158 27097087 12.9G 83 Linux
/dev/mmcblk0p3      27228159 31422463  4194305    2G 83 Linux
$ mount|grep /dev/mmcblk0

パーティション情報の確認と消去

$ sudo wipefs /dev/mmcblk0
offset               type
----------------------------------------------------------------
0x1fe                dos   [partition table]
 
$ sudo wipefs -a /dev/mmcblk0
/dev/mmcblk0: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/mmcblk0: calling ioctl to re-read partition table: 成功です
$ sudo wipefs /dev/mmcblk0

※Mac/Windowsではこの辺を使うといいと思う.

イメージ書き込み

$ unzip -p 2015-09-24-raspbian-jessie-pitft28r.zip | pv | sudo ionice -c2 dd of=/dev/mmcblk0 bs=4M
4.03GiB 0:05:58 [11.5MiB/s] [                                                                                                              <=>                         ]
0+36176 レコード入力
0+36176 レコード出力
4325376000 バイト (4.3 GB) コピーされました、 452.676 秒、 9.6 MB/秒
$ sync
$ sync
$ mount|grep /dev/mmcblk0

コマンドの意味などはこちらを

書き込んだSD CardをPiTFTの繋がったRaspberry Piに挿入して起動するとXが自動起動してLXDEにpiユーザで自動ログインした状態になる.

リモート接続(ssh)

Rasbian jessieは初期状態でavahi&sshが起動しているのでIPアドレスを調べなくても接続できて便利.

$ ssh pi@raspberrypi.local -CY

リモート接続(vnc)

x11vncを使ってvinoみたいに既に起動しているX画面(DISPLAY=:0)を転送

$ sudo apt install x11vnc
$ x11vnc -display :0 &

リポジトリサーバの日本への切り替えとパッケージのアップデート

$ sudo apt edit-sources
$ cat /etc/apt/sources.list
deb http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/  jessie main contrib non-free rpi
deb-src http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/  jessie main contrib non-free rpi
deb http://apt.adafruit.com/raspbian/ jessie main
$ sudo apt update && sudo apt upgrade

Xの確認

$ ps -ef|grep X
root       557   550  0 05:50 tty7     00:00:01 /usr/bin/X :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
pi         733   698  0 05:50 ?        00:00:00 /usr/bin/lxsession -s LXDE-pi -e LXDE
pi         837   733  1 05:51 ?        00:00:02 lxpanel --profile LXDE-pi
pi         838   733  0 05:51 ?        00:00:01 pcmanfm --desktop --profile LXDE-pi
pi         968   942  0 05:55 pts/0    00:00:00 grep --color=auto X
$ DISPLAY=:0 xrandr --verbose
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 320 x 240, current 320 x 240, maximum 320 x 240
default connected 320x240+0+0 (0x4f) normal (normal) 0mm x 0mm
        Identifier: 0x4e
        Timestamp:  35831
        Subpixel:   unknown
        Clones:
        CRTC:       0
        CRTCs:      0
        Transform:  1.000000 0.000000 0.000000
                    0.000000 1.000000 0.000000
                    0.000000 0.000000 1.000000
                   filter:
  320x240 (0x4f)  0.000MHz *current
        h: width   320 start    0 end    0 total  320 skew    0 clock   0.00KHz
        v: height  240 start    0 end    0 total  240           clock   0.00Hz
$ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 Sep 24 17:32 /dev/fb0
crw-rw---- 1 root video 29, 1 Feb  3 05:52 /dev/fb1

PiTFT分のXだけが起動していて,ディスプレイ番号は:0のよう.解像度は320x240だけ.モニタ名はdefault?

XRandRのpanningを使って画面をスクロールして広く使う(失敗)

やっと本題.
xrandrのmanを見るとpanningというそれらしい設定が.

       Per-output options
 
       --panning widthxheight[+x+y[/track_widthxtrack_height+track_x+track_y[/border_left/border_top/border_right/border_bottom]]]
              This option sets the panning parameters.  As soon as panning is enabled, the CRTC position can change with every pointer move.  The first four param‐
              eters specify the total panning area, the next four the pointer tracking area (which defaults to the same area). The last four parameters specify the
              border and default to 0. A width or height set to zero disables panning on the according axis. You typically have to set the screen  size  with  --fb
              simultaneously.
 
       --transform a,b,c,d,e,f,g,h,i
              Specifies a transformation matrix to apply on the output. Automatically a bilinear filter is selected.  The mathematical form corresponds to:
                     a b c
                     d e f
                     g h i
              The transformation is based on homogeneous coordinates. The matrix multiplied by the coordinate vector of a pixel of the output gives the transformed
              coordinate vector of a pixel in the graphic buffer.  More precisely, the vector (x y) of the output pixel is extended to 3 values (x y w), with 1  as
              the  w coordinate and multiplied against the matrix. The final device coordinates of the pixel are then calculated with the so-called homogenic divi‐
              sion by the transformed w coordinate.  In other words, the device coordinates (x' y') of the transformed pixel are:
                     x' = (ax + by + c) / w'   and
                     y' = (dx + ey + f) / w'   ,
                     with  w' = (gx + hy + i)  .
              Typically, a and e corresponds to the scaling on the X and Y axes, c and f corresponds to the translation on those axes, and g, h, and i are  respec‐
              tively  0,  0 and 1. The matrix can also be used to express more complex transformations such as keystone correction, or rotation.  For a rotation of
              an angle T, this formula can be used:
                     cos T  -sin T   0
                     sin T   cos T   0
                      0       0      1
              As a special argument, instead of passing a matrix, one can pass the string none, in which case the default values are used (a  unit  matrix  without
              filter).
 
       --scale xxy
              Changes  the  dimensions  of the output picture. Values superior to 1 will lead to a compressed screen (screen dimension bigger than the dimension of
              the output mode), and values below 1 leads to a zoom in on the output. This option is actually a shortcut version of the --transform option.
 
       --scale-from wxh
              Specifies the size in pixels of the area of the framebuffer to be displayed on this output.  This option  is  actually  a  shortcut  version  of  the
              --transform option.
 
       --primary
              Set the output as primary.  It will be sorted first in Xinerama and RANDR geometry requests.

ちょっと複雑そう.xrandrのGUIの皮のarandr/lxrandrで設定できると便利なんだろうけど実装された機能が少なくてこの当たりの設定は使えない感じで残念.
#arandrは外部モニタの設定や解像度の変更にはよく使ってます.

XRandRを手動で設定してmodeの登録を試みる

cvtコマンドで取得した値をxrandrに渡すといいはずだけどうまく行かない.

$ cvt 800 600
# 800x600 59.86 Hz (CVT 0.48M3) hsync: 37.35 kHz; pclk: 38.25 MHz
Modeline "800x600_60.00"   38.25  800 832 912 1024  600 603 607 624 -hsync +vsync
$ xrandr --newmode "800x600_60.00"   38.25  800 832 912 1024  600 603 607 624 -hsync +vsync
$ xrandr --addmode default 800x600_60.00
xrandr: cannot find output "default"
$ DISPLAY=:0 xrandr --addmode default 800x600_60.00
xrandr: Failed to get size of gamma for output default
xrandr: cannot find mode "800x600_60.00"
$ DISPLAY=:0 xrandr --addmode default 800x600_60.00
xrandr: Failed to get size of gamma for output default
xrandr: cannot find mode "800x600_60.00"

PC(i915なDebian stretch amd64)では想定した動作になった.
この例では存在するモードよりも広い1904×720のモードを追加した後,画面のモードを640×480にして仮想スクリーンを1904×720にしている.マウスカーソルを端に持って行くと自動スクロールする.

$ xrandr | grep LVDS1 -A5
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 277mm x 156mm panning 1366x768+0+0
   1366x768      60.00*+
   1360x768      59.80    59.96  
   1024x768      60.00  
   800x600       60.32    56.25  
   640x480       59.94  
$ cvt 1904 720
# 1904x720 59.97 Hz (CVT) hsync: 44.86 kHz; pclk: 111.25 MHz
Modeline "1904x720_60.00"  111.25  1904 2000 2192 2480  720 723 733 748 -hsync +vsync
$ cvt 1904 720
# 1904x720 59.97 Hz (CVT) hsync: 44.86 kHz; pclk: 111.25 MHz
Modeline "1904x720_60.00"  111.25  1904 2000 2192 2480  720 723 733 748 -hsync +vsync
$ xrandr --newmode "1904x720_60.00"  111.25  1904 2000 2192 2480  720 723 733 748 -hsync +vsync
$ xrandr --addmode VGA1 1904x720_60.00
$ xrandr --output LVDS1 --mode 640x480 --panning 1904x720

そもそもpanningはmodeを追加しなくても使えるようだ.

$ xrandr --output LVDS1 --mode 1366x768 --panning 2000x768
$ xrandr --output LVDS1 --mode 1366x768 --panning 2732x1536 --scale 2x2

ということはこれだけでいいはずだけどモニタ名がうまく行けてない.モニタ名をドライバでちゃんと設定してない?

$ DISPLAY=:0 xrandr default --mode 320x240 --panning 800x600
xrandr: unrecognized option 'default'
Try 'xrandr --help' for more information.$ DISPLAY=:0 xrandr default --mode 320x240 --panning 800x600
xrandr: unrecognized option 'default'
Try 'xrandr --help' for more information.

Adafruitのフォーラムに同じ質問があったけど動いて無さそう.

もう少し叩いてみたらモニタ名はdefaultでOKのよう.320×240より小さなmodeを作ってみてもダメ.
xrandrコマンドを引数無しで実行した時のmaximum 320 x 240がいけないのかも.PCではmaximum 32767 x 32767と恐らくビデオカードの最大解像度であろう値が表示される.VRAMを増やしたりすると行けるけるのかもしれない.

$ DISPLAY=:0 xrandr
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 320 x 240, current 320 x 240, maximum 320 x 240
default connected 320x240+0+0 0mm x 0mm
   320x240        0.00*
$ DISPLAY=:0 xrandr --output default --auto --mode 320x240 --panning 800x600
xrandr: Failed to get size of gamma for output default
xrandr: screen cannot be larger than 320x240 (desired size 800x600)
$ DISPLAY=:0 xrandr --output default --auto --mode 160x120 --panning 320x240
xrandr: cannot find mode 160x120
$ cvt 160 120
# 160x120 50.08 Hz (CVT 0.02M3) hsync: 6.51 kHz; pclk: 1.25 MHz
Modeline "160x120_60.00"    1.25  160 168 176 192  120 123 127 130 -hsync +vsync
$ xrandr --newmode "160x120_60.00"    1.25  160 168 176 192  120 123 127 130 -hsync +vsync
$ DISPLAY=:0 xrandr --newmode "160x120_60.00"    1.25  160 168 176 192  120 123 127 130 -hsync +vsync
xrandr: Failed to get size of gamma for output default
$ DISPLAY=:0 xrandr --addmode default 160x120_60.00
xrandr: Failed to get size of gamma for output default
$ DISPLAY=:0 xrandr
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 320 x 240, current 320 x 240, maximum 320 x 240
default connected 320x240+0+0 0mm x 0mm
   320x240        0.00*
   160x120_60.00  50.08  
pi@raspberrypi ~ $ DISPLAY=:0 xrandr --output default --auto --mode 160x120_60.00 --panning 320x240
xrandr: Failed to get size of gamma for output default
xrandr: Configure crtc 0 failed

恐らくこれ以上はsourceを修正しないとダメだと思う.

fbcpを利用してRaspberry Pi標準のディスプレイをコピーして利用

フレームバッファをコピーするfbcpを利用する方法.便利だけどタッチパネル機能が使えない.

内蔵が/dev/fb0でPiTFTが/dev/fb1になっているので通常のRaspberry Piで行った設定をそのままPiTFTの画面に映すことが出来る.
フレームバッファのコピーなのでXだけでなくコンソール利用時にも使える.

fbcpのbuild

$ sudo apt install cmake
$ git clone https://github.com/tasanakorn/rpi-fbcp.git
$ cd rpi-fbcp
$ mkdir build
$ cd build
$ cmake ..
$ make

fbcpコマンドを適当な場所に置く.

$ sudo cp fbcp /usr/local/bin/

/dev/fb1を指定しているファイルを退避して,起動時にfbcpを起動するよう設定して再起動.

$ sudo mv /etc/X11/xorg.conf.d/99-fbdev.conf ~pi/99-fbdev.conf
$ sudo sed -i 's/exit/\/usr\/local\/bin\/fbcp \&\n\nexit/g' /etc/rc.local
$ sudo reboot

コンソールの途中からfbcpが動作してXも表示される.解像度は656×416になっている.もっと高解像度にもできるが使いやすさを考えるとこのくらいでいいと思う.

$ DISPLAY=:0 xrandr --verbose
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 656 x 416, current 656 x 416, maximum 656 x 416
default connected 656x416+0+0 (0x4f) normal (normal) 0mm x 0mm
        Identifier: 0x4e
        Timestamp:  19289
        Subpixel:   unknown
        Clones:    
        CRTC:       0
        CRTCs:      0
        Transform:  1.000000 0.000000 0.000000
                    0.000000 1.000000 0.000000
                    0.000000 0.000000 1.000000
                   filter:
  656x416 (0x4f)  0.000MHz *current
        h: width   656 start    0 end    0 total  656 skew    0 clock   0.00KHz
        v: height  416 start    0 end    0 total  416           clock   0.00Hz

過去の試み

Debian stretch環境でSilverlight動画を視聴

確か1話はニコニコ動画で見たと思うハルチカですが,2話からは有料のよう.どこかで見られないかなーとON AIR情報を調べてみると「Rakuten SHOWTIME」というところで最新話が1週無料のようです.

Rakuten SHOWTIME
(最新各話、配信後1週間無料) http://video.rakuten.co.jp/

早速見に行くと,

非対応デバイスのため、動画を再生できません。

ブラウザのUser-Agentを変更してアクセスしてみると,Silverlightでした.

動画を再生するためには、Silverlightのインストールが必要です。こちらから最新版のインストールをお願いいたします。

Silverlightでの動画視聴は以前Pipelightを使って試したことがありました.

このときは動画と音声がどんどんずれていって動画視聴は辛かったです.今なら改善されているかもと再度試してみました.

以前はPipelightはDebian pkgにあったのですが今はなくなっているようです.

$ w3m -dump 'https://packages.debian.org/search?keywords=pipelight&searchon=all&exact=1&suite=all&section=all'|grep 'で検索しました' -A5
すべてのアーキテクチャで検索しました。
 
残念ながら、検索結果はありませんでした
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

公式ページを見ると導入手順が書かれていました.

今回はDebian stretchなのでこちらのページを参考に導入しました.

i386パッケージを有効にします.

$ sudo dpkg --add-architecture i386

リポジトリの鍵を入手して登録します.

wget http://repos.fds-team.de/Release.key
sudo apt-key add Release.key

pipelightのsource listを追加します.

$ sudo apt edit-sources pipelight
$ sudo cat /etc/apt/sources.list.d/pipelight.list
deb http://repos.fds-team.de/stable/debian/ stretch main

<追記>
apt-cache searchなどが一般ユーザでできなくなるので読み込み権を追加.

$ sudo chmod o+r /etc/apt/sources.list.d/pipelight.list

</追記>

パッケージ情報を更新してPipelightを導入します.

$ sudo apt update && sudo apt upgrade
$ sudo apt install pipelight-multi

プラグインデータベースを最新にします.

$ sudo pipelight-plugin --update

とりあえずPipelightの導入は完了です.続いてプラグインの有効化を行います.
ここからは以下のページを参考にします.
Pipelight | Installation

pipelight-pluginコマンドで利用できるプラグインの種類が確認できます.

$ pipelight-plugin
 
Usage: pipelight-plugin [OPTIONS ...] COMMAND
 
Environment variables:
  MOZ_PLUGIN_PATH             overwrite plugin path
 
Options:
  --accept                    accept all licenses
 
User commands:
  --enable  PLUGIN            enable plugin
  --disable PLUGIN            disable plugin
  --disable-all               disable all plugins
  --list-enabled              list enabled plugins for the current user
  --list-enabled-all          list all enabled plugins
  --show-license              print license for plugin
  --system-check              do a system check
  --help                      shows this help
  --version                   shows the current version of Pipelight
 
Global commands (require root rights):
  --create-mozilla-plugins    create copies of libpipelight.so
  --remove-mozilla-plugins    remove copies of libpipelight.so
  --unlock PLUGIN             unlocks an additional plugin
  --lock   PLUGIN             locks an additional plugin
  --update                    update the dependency-installer script
 
 
Supported standard plugins:
  silverlight5.1
  silverlight5.0
  silverlight4
  flash
  unity3d
  widevine
 
Additional plugins (experimental):
  shockwave
  foxitpdf
  grandstream
  adobereader
  hikvision
  npactivex
  roblox
  vizzedrgr
  viewright-caiway
  x64-unity3d
  x64-flash
 

今回はSilverlightを使いたいのでsilverlight5.1を有効にします.

$ sudo pipelight-plugin --enable silverlight5.1

ブラウザ(Iceweasel)で利用できるようにします,

$ sudo pipelight-plugin --create-mozilla-plugins

ブラウザ(Iceweasel)を起動して,about:pluginsにアクセスしてプラグインが読み込まれているか確認します.

20160202_16:02:32-30774

うまくいったようなので動画視聴を試してみます.2番組試してみましたが以前と違いズレも発生せず快適に視聴できました.機能も一通り試してみましたが,最大化も含め全て問題なく動いているようです.

20160202_15:02:03-9643

ということでハルチカが見られるようになりました :)




aptコマンドのedit-sourcesオプションが便利

Rasbianのパッケージサーバにjaistを指定していたのだけど最近遅いのでmirror listを見て

$ w3m -dump https://www.raspbian.org/RaspbianMirrors|grep -i japan -A1
Asia^*    Japan       JAIST                    (http|rsync)://ftp.jaist.ac.jp/pub/
                                               Linux/raspbian-archive/raspbian
--
Asia^*    Japan       WIDE Project Tsukuba NOC raspbian/raspbian/
                                               rsync://ftp.tsukuba.wide.ad.jp/
--
Asia^*    Japan       Yamagata University      http://ftp.yz.yamagata-u.ac.jp/pub/
                                               linux/raspbian/raspbian/

/etc/apt/sources.listをWIDEに変更した.

-deb http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian/ jessie main contrib non-free rpi
-deb-src http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian/ jessie main contrib non-free rpi
+deb http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/  jessie main contrib non-free rpi
+deb-src http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/  jessie main contrib non-free rpi

ところでaptコマンドのedit-sourcesオプションが便利なのでぜひ使うべき.visudoとかみたいに間違えると教えてくれる.

$ sudo apt edit-sources
E: Type 'eb' is not known on line 3 in source list /etc/apt/sources.list
Failed to parse /etc/apt/sources.list. Edit again?  [Y/n]

引数を付けて/etc/apt/sources.list.d/以下の編集も出来る

$ ls /etc/apt/sources.list.d/
google-chrome.list  gyazo_gyazo-for-linux.list  owncloud-client.list
$ sudo apt edit-sources owncloud-client

Debian jessie以降,Rasbian jessie以降,Ubuntu vivid(15.04)以降でそれぞれ利用可能だと思う.

apt (0.9.13.1) unstable; urgency=low
 
  [ Colin Watson ]
  * fix "apt-get  --purge build-dep" (closes: #720597)
  * fix regression that APT::Keep-Fds is not honored (closes: #730490)
 
  [ Michael Vogt ]
  * add "-f" option to "build-dep" as sbuild is using it to fix
    regression with cross-building (LP: #1255806)
  * add autopkgtest support for the integration testsuite
  * merge mvo/feature/short-list
  * merge mvo/feature/edit-sources
  * fix segfault in pkgDepCache::SetCandidateRelease() (closes: #709560)
  * reset terminal on error (closes: #730795)
  * fix apport report writing (LP: #1254499)
 
 -- Michael Vogt <mvo@debian.org>  Fri, 29 Nov 2013 20:50:17 +0100


Raspberry Piで雑いpodcastサーバを作った

IMGP2678

先日試したpodracer

毎日実行して今日の分をまとめて再生して消してというように使う感じなのかもしれません.

ということで自動取得,自動再生すると家庭内ラジオのようにできるのではと思い試してみました.

環境はRaspberry Pi 1B (512MB)Rasbian jessieを導入したもので有線LAN 利用です.

導入パッケージ

podcast の取得のためにpodracer,プレイリストの配信にboaを利用,音声配信の為にvlc-noxを導入しました.

$ sudo apt install podracer boa vlc-nox

podcast 取得の準備

を参考にpodracerの設定をして下さい.~/.podracer/subscriptionsを用意した後1度catchup modeで実行しておきます.

$ podracer -c

これでRSS Feedをひと舐めして過去のpodcastを取得しないようにします.

VLC での配信テスト

以下の例ではpodracerで作成された今日のプレイリストをそのままhttp 8080ポートで配信して更にloopさせています.

$ cvlc  ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop

この状態で再生したい端末で $ cvlc http://raspberrypi.local:8080/ とか mplayer http://raspberrypi.local:8080/ などとしてアクセスすると再生されるはずです.
1曲毎に停まってしまい再度再生し直す必要がありますがこれは後で解決することにします.

VLC の設定

VLCで配信しますが,コントローラーも利用したいです.--extraintf=http オプションでwebコントローラーが利用できます.規定値では localhost 以外からアクセスできないので家のネットワークのどこからでもコントロールできるように /usr/share/vlc/lua/http/.hosts に利用可能なネットワークを登録しておきます.

192.168.1.0/24
192.168.2.0/24

以下のように実行するとwebコントローラーが8081ポートで起動します.パスワードは raspberry です.適当なブラウザで http://:raspberry@raspberrypi.local:8081/ な感じでアクセスするとコントローラが利用できると思います.

$ cvlc --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop

Screenshot_2016-01-31-19-04-03

パスワードを設定しないとパスワードの設定を促す画面が表示されて利用できないようです.

http の設定(プレイリストの作成)

boaの標準では /var/www 以下がDocumentRootになっています.ここにメニュー用の index.html とプレイリストの podcast.m3u を用意しておきます.

権限は www-data.www-data なので,以下のような感じで権限を設定して編集するといいかもしれません.

$ sudo chown www-data.www-data /var/www
$ sudo -u www-data vi /var/www/index.html
   :
  • /var/www/index.html の例
<html>
<body>
<ul>
<li><a href="./podcast.m3u">m3u</a></li>
<li><a href="http://:raspberry@192.168.2.200:8081/">VLC control</a></li>
</ul>
</body>
</html>

※AndroidではAvahiでの名前解決がうまく行かないのでIP アドレスで書いています.環境に合わせて変更して下さい.

  • /var/www/podcast.m3u の例
http://192.168.2.200:8080/
http://192.168.2.200/podcast.m3u

1行目だけだと1番組分で再生が停止してしまうので,2行目で自分自身を呼び出して再起しています.これで2番組以降でも続けて再生されます.
※AndroidではAvahiでの名前解決がうまく行かないのでip アドレスで書いています.環境に合わせて変更して下さい.

自動起動とpodcast更新処理

crontab で起動時に自動的に再生が始まるように&定期的にpodcast更新&再生リスト更新&古いpodcastの削除処理をします.

crontab -e コマンドで編集します.

@reboot cvlc --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop
3 */6 * * *     podracer;killall vlc;cvlc --extraintf=http --http-port=8081 --http-password='raspberry' ~/podcasts/`date +\%F`/`date +\%F`-podcasts.m3u --sout '#standard{access=http,mux=ts,dst=:8080}' --loop
10 0 * * *  rm -rf ~/podcasts/`date --date '1 weeks ago' +\%F`

1行目は @reboot で起動時にVLCを自動起動します.
2行目は6時間毎にpodcastを更新してVLCを起動しなおしています.
3行目で1週間前のpodcastデータを削除しています.

利用方法

ウェブブラウザで Raspberry Pi にアクセスします.

http://raspberrypi.local

以下のようなメニューが出て来ます.

Screenshot_2016-01-31-20-49-47

• m3u
• VLC control

m3u をクリックするとプレイリストがダウンロードされます.VLC 等の関連付けられたアプリケーションなどで再生できると思います.
Screenshot_2016-01-31-19-03-53

VLC control をクリックするとVLCのウェブコントローラーが表示されます.URLに認証情報を埋め込んでいるので認証はスキップされます.

問題点や改善点など

  • ブロードキャスト配信の断念. はじめブロードキャスト配信を試したのですが,かなりの頻度でパケットロスしてそのたびに音が途切れました.音が途切れるのはかなりストレスなので諦めました.プレイリストがなくても連続再生可能なのは良かったのですが…….
  • podcast更新時の番組強制終了.更新時にVLCをkillしています.番組の途中で切れてしまうので改善したいです.
  • podcast の音量や音質を揃える.試しにmp3/128kbpsや64kbpsにリアルタイムエンコーディングしつつ配信も試してみましたが Raspberry Pi でもCPU 25%前後なので実用的な感じです.
    帯域を絞ったストリームも同時配信するようにして外で聴きやすくするのもありかもしれません.
  • VLC から他のアプリケーションに変更.今回お手軽なので VLC を利用しましたが Gstreamer や ffmpeg などを試すのもありかもしれません.
  • スピーカーでも再生.環境によっては同時にスピーカーで再生してもいいかもしれません.
  • 番組情報の配信.今は未知のアーティストなどと表示される.アートワークも含めて改善したい.
    Screenshot_2016-01-31-20-50-06
  • 更新間隔の調整.ニュース番組など定時のある番組があるのでそれらに合わせて更新処理を行うようにすると便利かもしれません.
  • 名前解決.AndroidでAvahiが利用できないので家の中のDNSサーバに名前を登録してあげると便利かもしれません.
  • pifmを使ってFMラジオでも視聴.日本だと電波法違反になるので自重しました.


現在は主にAndroidアプリのVLCで再生しています.AndroidとPCはBluetooth A2DPで繋がっていて,PCで聞いています.PCから離れるときはAndroidにイヤホンジャックを差し替えるとシームレスに移動できます.

20160201_01:02:04-5807

Rasbian jessie で watchdog を設定する

Rasbian jessie 環境でも設定したのでメモとして.

パッケージの導入

$ sudo apt install watchdog

設定ファイル修正

/etc/watchdog.conf を以下のように編集

-#min-memory              = 1
+min-memory              = 5000
 
-#watchdog-device       = /dev/watchdog
+watchdog-device        = /dev/watchdog

min-memory はページサイズ.今回は4096*5000で約20MB.このサイズ(swapを含めた容量)を切ったら再起動するはず.大きいような気もするけどまずは動作確認のためにこのくらいにしてみる.

/etc/default/watchdog を以下のような感じに編集して bcm2708_wdog モジュールを読みこむようにする.

-watchdog_module="none"
+watchdog_module="bcm2708_wdog"

起動設定

$ sudo update-rc.d watchdog defaults
$ sudo update-rc.d watchdog enable

動作確認

再起動して

$ sudo reboot

モジュールの読み込み,デバイスの確認,デーモンの確認をする.

$ lsmod|grep dog
bcm2708_wdog            3926  1
$ ls -l /dev/watchdog
crw------- 1 root root 10, 130  1月 26 23:32 /dev/watchdog
$ ps -ef|grep dog
root       642     1  0 23:32 ?        00:00:00 /usr/sbin/watchdog

問題無さそうなら swap を無効にしてファイルシステムを read only や sync を有効にしておいてから Forkbomb で動作確認をしてみる.以下の例ではbashでのForkbomb

$ sudo swapoff -a
$ sync
$ sudo mount -o remount,ro /boot
$ sudo mount -o remount,sync /
$ :(){ :|:& };:

うまく再起動が走ったら後は /etc/watchdog.conf を詰めていく.

kernel panic 時の設定

bcm2708_wdog を使っているのでkernel panic 時にも watchdog は効くはずだけど念の為設定しておく.

/etc/sysctl.conf に以下を追記

kernel.panic = 180
kernel.panic_on_oops = 1

sysctl や再起動で反映.

$ sudo sysctl -p
kernel.panic = 60
kernel.panic_on_oops = 1

Debian の Steam が起動しなくなったので調べる

Debian stretch testing amd64 で steam:i386 パッケージで導入した Steam が起動しなくなっていました.

端末で直に叩くとこんな感じで怒られていました.

$ steam
find: The relative path '~/usr/local/bin' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find.  Please remove that entry from $PATH

PATH から ~/usr/local/bin を抜くとOK
PATH を /home/user/usr/local/bin としてもOK
てことで ~/.profile の ~ を $HOME に書き換えました.

- PATH="~/usr/local/bin:$PATH"
+ PATH="$HOME/usr/local/bin:$PATH"

とりあえずこれで動くようになりました.

Steam では最近は Unturned とかで遊んでいます.最近は Linux で動くゲームも増えて嬉しいです :)

CLI な podcast aggregator/downloader な podracer を試してみる

podcast aggregator に rhythmbox を利用しているのですが,たまにファイルが存在するのに何度やってもダウンロードに失敗したり NotePC で動かしているので容量の問題で古いのをファイルサーバに持って行ったりといった処理が面倒です.
CIL で動くものがあればファイルサーバで入手するようにして新しい物だけ手元に or ファイルサーバ経由で視聴するようにしら便利かもということで CLI で動く podcast aggregator が無いか探してみました.

$ apt-cache search podcast aggregator
gpodder - podcast client and feed aggregator
podracer - podcast aggregator/downloader

gpodder は GUI と CLI のセットで,podracer は CLI のみのようです.今回は podracer を試してみます.

導入

導入は apt 一発です.

$ sudo apt install podracer

設定ファイルの用意

~/.podracer/subscriptions というファイルに入手したいフィードを1フィード1行で書いておきます.# 行はコメントになるようです.

# 電脳空間カウボーイズ
http://feeds.feedburner.com/weblogs/csc
# backspace.fm
http://feeds.backspace.fm/backspacefm

実行

podracer コマンドを実行すると,~/.podracer/subscriptions からpodcast をダウンドードしてくれます.ダウンロードが完了すると自動的に終了します.

$ podracer

初回実行時には過去のものも入手するので時間が掛かるでしょう.特に画面には何も表示されないのでログファイル( ~/.podracer/podcast.log ) を確認するといいと思います.

$ tail -f ~/.podracer/podcast.log

取得した podcast は ~/podcasts 以下の日付ファイルの下に保存されます.この日付は実行日時です.

$ ls ~/podcasts
2016-01-27  2016-01-28
$ ls -lA ~/podcasts/2016-01-28
合計 59408
-rw-r--r-- 1 mk mk        0  1月 28 14:03 2016-01-28-podcasts.m3u
-rw-r--r-- 1 mk mk 60833627  1月 28 14:02 jlEV91AshKrq
$ file  ~/podcasts/2016-01-28/*
/home/mk/podcasts/2016-01-28/2016-01-28-podcasts.m3u: empty
/home/mk/podcasts/2016-01-28/jlEV91AshKrq:            Audio file with ID3 version 2.3.0

後は各種プレイヤーで再生できます.

$ mplayer ~/podcasts/2016-01-28/jlEV91AshKrq

ファイル名は podcast 提供者の物のままで同じディレクトリに格納されてしまうので名前が衝突したら多分新しい方で上書きされてしまいます.それとこのままではどのファイルがどの podcast なのかとかわからないですね.オプションも特に無いようなので沢山の podcast を保管しようという用途で使うのには向いていないかもしれません.
毎日実行して今日の分をまとめて再生して消してというように使う感じなのかもしれません.

追記)プレイリストの不具合?

podracer 実行時に 2016-01-28-podcasts.m3u のようなプレイリストが作られますが,mp3/ogg/m4a/m4b 以外の拡張子は登録されません.こんな感じで作り直すと良さそう.

$ ls -1A ~/podcasts/2016-01-28 | grep -v \.m3u$ > ~/podcasts/2016-01-28/2016-01-28-podcasts.m3u

この方がいいかな

$ ls -1A ~/podcasts/`date +%F` | grep -v \.m3u$ > ~/podcasts/`date +%F`/`date +%F`-podcasts.m3u

podracer 自体を修正してもいいかも.雑いけどこんなとか.
これだとサムネイル画像なども含まれてしまう.

$ diff -u /usr/bin/podracer podracer
--- /usr/bin/podracer   2015-07-04 22:39:26.000000000 +0900
+++ podracer    2016-01-28 18:34:40.317391930 +0900
@@ -415,10 +415,7 @@
                then
                (
                cd "$poddir"
-               find . -name \*.mp3 > "$m3u"
-               find . -name \*.ogg  >> "$m3u"
-               find . -name \*.m4a  >> "$m3u"
-               find . -name \*.m4b  >> "$m3u"
+               find . -name \* -type f | grep -v "$m3u" > "$m3u"
                )
        fi
 fi

追記2)
上の修正だとサムネイル画像なども登録されてしまう.
以下はその他のファイルを file command で調べて audio という文字列が入っていたら登録するもの.

$ diff -u /usr/bin/podracer ./podracer
--- /usr/bin/podracer   2015-07-04 22:39:26.000000000 +0900
+++ ./podracer  2016-01-28 19:12:31.980446668 +0900
@@ -419,6 +419,7 @@
                find . -name \*.ogg  >> "$m3u"
                find . -name \*.m4a  >> "$m3u"
                find . -name \*.m4b  >> "$m3u"
+               find . | egrep -v "\.mp3$|\.ogg$|\.m4a$|\.m4b$" | xargs file | grep -i audio | cut -f1 -d: >> "$m3u"
                )
        fi
 fi

awk 製 3Dシューティングゲーム awkaster で遊んでみた

awk 製 3Dシューティングゲームがあると聞いて遊んでみました.

遊ぶには GNU awk 4.0.0 以上が必要です.Debian だと gawk というパッケージです.とりあえず遊んでみるにはこんな感じで.

$ sudo apt install gawk
$ wget https://raw.githubusercontent.com/TheMozg/awk-raycaster/master/awkaster.awk
$ awk -f ./awkaster.awk

操作はこんな感じです.

  • 1234 画面表示切り替え
  • WASD 移動
  • JL 回転(16回で1回転)/Shiftを押しながらで高速回転(8回で1回転)
  • SPACE 攻撃
  • X エレベーターに乗る(ゲームクリア)
  • Q 終了

以下は遊んでいる様子です.

asciicast

3Dシューティングというとスターフォックスを思い浮かべたのですが,単純な 3D RPG 的な感じです.Wolfenstein 3D と doom に触発されたそうです.Wolfenstein 3DWolfenstein 3D は知らないのですが確かに doom みたいな感じです.
ターン制?なので敵の赤球が出てきても慌てず操作できます.

敵に触れるとHPが減っていって0になるとゲームオーバーでこんなメッセージが出ます.

GAME OVER! YOU LOSE!
Credits: Fedor 'TheMozg' Kalugin
https://github.com/TheMozg/awk-raycaster
Gameplay testing - Alex 'Yakojo' & Danya 'bogych97'
Go away!

うまいことエレベーターに到着して X を押すとゲームクリアです.
但し ELEVATOR COMING0 になっている必要があります.これは初め 1000 で1操作で1カウントダウンされます.ゴールのエレベーターの場所は見た目わかりません
敵が沢山居るところの辺りにあるので探してみて下さい.
(私は判んなくて結局 source 読んでクリアしましたorz)

YOU WIN! YOUR SCORE: 4900
Credits: Fedor 'TheMozg' Kalugin
https://github.com/TheMozg/awk-raycaster
Gameplay testing - Alex 'Yakojo' & Danya 'bogych97'
Go away!

ちなみにそこそこ広い領域が必要です.領域が狭いと画面に収まりきらずずれてしまいます.フォントサイズを小さくするなどして列と行を確保しましょう.
GNU screen 上でも Rasbian jessie 上でも問題なく動きました.

昔こんな3D迷路とかをポケコンBASIC で作っていたのを思い出しました.最近のマイコンやRaspberry Pi でこういうゲームを作ってみるのも楽しそうですね :)
(Arduboy とか POCKETC.H.I.P. とか )

デジモノステーション2016年2月号付録の0SIMをRaspberry Piで試す

デジモノステーション 2016年2月号に0SIM by So-net というものが付録で付いてきて一部で流行っています.
雑誌「デジモノステーション」最新号 – DIGIMONO!(デジモノ!)

IMG_20151229_022627IMG_20151229_022636

これはこの雑誌を買って付いてきた付録のSIMを使うと雑誌代(620円)だけで開通手続き手数料無料で月あたり500MB迄無料で利用できるというもの.勿論他にSIMを刺す端末は必要です.

【0SIM by So-net】 詳細
形状:nanoSIM 規格:0SIM by So-net 種類:データ通信専用
データ量と料金(2段階定額)
0MB~499MB:0円
500MB ~ 2047MB:100円~1500円
2048MB ~:1600円
速度制限:なし(ただし5GBまで)/ NTTドコモ 4G LTE(下り最大225Mbps)
開通期限:2016年2月24日

上限もあるのでうっかり使いすぎても安心感があります.ちなみに上限をよく超えるようだと別のプランにしたほうがお得です.
一人で複数契約は出来ないのでたくさん買って500MBごとに差し替えて使うと言ったことは出来ない,3ヶ月利用しないと自動解約されるようなので寝かせておくことも出来ないよう.
普通に使うとあっという間に500MB超えちゃうでしょうけど使いようによっては便利に使えそう(気象センサのデータを送るとかなら余裕).ということで試してみたかったのですがここは鹿児島.都内から最低でも2日遅れなので試せないでいました.昨日やっとコンビニで入手出来たので試してみました.

ちなみにAmazonでは売り切れでマーケットプレイス扱いの物しか無いようです.その中で安いものはSIMなしと書かれているので注意しましょう.

今回はUSBモデムとして以前500円ほどで買った Docomo L-02C を Rasbian jessie を導入した Raspberry Pi 2B に接続して wvdial で接続しました.このモデムは結構電気を食うらしく電源がある程度大容量でないととても不安定になります.今回は秘密結社オープンフォース河野総統謹製の RaspberryPot という GPIO 経由での電源を利用しました.RaspberryPot は現在恐らく入手出来ません.Raspberry Hubu の電源部分を切り出したものなので Raspberry Hubu でも同じことが出来ます.
#ちなみに Pi で動かす前に Debian testing stretch amd64 な NotePC でも同様の設定で動くのを確認しています.Debian oldstable 以降なら全部同じ手順で行けると思います.


RaspberryHabu – FABLIB Wiki – FABLIB – OSDN
秘密結社オープンフォース

IMG_20151229_071104

開通手続き

次のページから開通手続きを行います.開通手続きの期限は2016年02月24日.
http://lte.so-net.ne.jp/r/0sim/a/

ログイン情報はSIMの台紙に書かれています.
IMG_20151229_022855

必要なソフトウェアの導入

$ sudo apt update && sudo apt upgrade
$ sudo apt install cu wvdial usb-modeswitch

<追記>
※必要なソフトウェアの導入にusb-modeswitchパッケージを追加
</追記>

利用ユーザ pidialout グループへの登録

この手続きをしないと,ダイヤル時など毎回 sudo しないといけません.

$ sudo addgroup pi dialout

※反映には要ログインしなおし

Docomo L-02C への APN登録

モデムへの接続と動作確認

/dev/ttyUSB2 部分は dmesg|tailなどとして確認して下さい.モデムの他に何も接続していなければ ttyUSB0~ttyUSB3 の4つのデバイスが確認できるはずです.

% cu -l /dev/ttyUSB2 -s 115200
Connected.
atz
OK

現在のAPN確認

AT+CGDCONT?
+CGDCONT: 1,"IP","mopera.net",,0,0,0
+CGDCONT: 11,"IP","mopera.net",,0,0,0
OK

APN(so-net.jp)を設定

AT+CGDCONT=1,"IP","so-net.jp"
OK

※次のようにして複数のAPNを設定することも可能

AT+CGDCONT=2,"IP","lte.nttplala.com"
OK
AT+CGDCONT=3,"IP","mineo-d.jp"
OK

APNが登録できたか確認

AT+CGDCONT?
+CGDCONT: 1,"IP","so-net.jp",,0,0,0
+CGDCONT: 11,"IP","mopera.net",,0,0,0
OK

設定の書き込み

ATZ0
OK

モデムから切断

~.
Disconnected.

ダイヤルアップのために wvdial の設定

/etc/wvdial.conf に以下を追記.

[Dialer 0sim]
Modem Type = Analog Modem
Phone = *99***1#
Carrier Check = no
Auto Reconnect = yes
Stupid Mode = yes
ISDN = 0
Init1 = ATZ
Init2 = ATH
Init3 = AT+CGDCONT?
Init4 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Dial Command = ATD
Modem = /dev/ttyUSB2
Baud = 115200
Username = nuro
Password = nuro

接続

$ wvdial 0sim

接続確認

$ w3m -dump http://ifconfig.me/all
ip_addr: 118.241.XXX.XXX
remote_host: XXXXXXXXXX.ap.nuro.jp
user_agent: w3m/0.5.3+debian-19
port: 44286
lang: ja;q=1.0, en;q=0.5
connection: 
keep_alive: 
encoding: gzip, compress, bzip, bzip2, deflate
mime: text/html, text/*;q=0.5, image/*, application/*, audio/*, video/*, x-scheme-handler/*, x-content/*, inode/*
charset: 
via: 
forwarded: 

利用状況確認

対のページからログインして利用状況が確認できます.また,400MB を超えるとメールでお知らせも来るらしいです.
ユーザWebメインメニュー

20151229_07:12:50-10076

ということで暫く試してみたいと思います.

※Amazonで雑誌を買う場合はSIMなしのものもあるのでよく確認して購入しましょう.

関連URL

<追記>

Twitterで/dev/ttyUSBnが見つからないという書き込みを見て導入パッケージが足りなかったのに気づきました.これが足りないとUSBモデム接続時のdmesgで以下のようにCD-ROMのsr0デバイスが出て来てttyUSBnは出てきません.

$ dmesg | tail
[417400.989925] usb 2-1.1: Product: docomo L02C
[417400.989927] usb 2-1.1: Manufacturer: NTT DOCOMO, INC.
[417400.989928] usb 2-1.1: SerialNumber: 353168046719530
[417400.990982] usb-storage 2-1.1:1.0: USB Mass Storage device detected
[417400.991062] scsi host11: usb-storage 2-1.1:1.0
[417401.988387] scsi 11:0:0:0: CD-ROM            LG       Autorun          2.00 PQ: 0 ANSI: 0
[417401.988771] scsi 11:0:0:0: Attached scsi generic sg2 type 5
[417401.999991] sr 11:0:0:0: [sr0] scsi-1 drive
[417402.000001] cdrom: Uniform CD-ROM driver Revision: 3.20
[417402.000257] sr 11:0:0:0: Attached scsi CD-ROM sr0

この時のベンダーID:プロダクトIDは1004:61ddです.

$ lsusb|grep LG
Bus 002 Device 027: ID 1004:61dd LG Electronics, Inc. 

この場合usb-modeswitchパッケージを導入して,

$ sudo apt install usb-modeswitch

USBモデムを接続し直すと出てきます.

$ dmesg | tail
[417994.525827] usb 2-1.1: Product: docomo L02C
[417994.525830] usb 2-1.1: Manufacturer: NTT DOCOMO, INC.
[417994.527296] option 2-1.1:1.0: GSM modem (1-port) converter detected
[417994.527511] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB0
[417994.527807] option 2-1.1:1.1: GSM modem (1-port) converter detected
[417994.527997] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB1
[417994.528217] option 2-1.1:1.2: GSM modem (1-port) converter detected
[417994.528346] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB2
[417994.528597] option 2-1.1:1.3: GSM modem (1-port) converter detected
[417994.528741] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB3

プロダクトIDも61ddから618fに変わりました.

$ lsusb|grep LG
Bus 002 Device 029: ID 1004:618f LG Electronics, Inc. Ally/Optimus One

何故CD-ROMデバイスが出てくるかというとWindows環境などでのツールやドライバ導入のためです.このCD-ROMデバイス中にツールやドライバが入っていて簡単に導入が出来るというものなのですが,Linux版のツールやドライバは入っていないです.usb-modeswitchパッケージはCD-ROMからUSBモデムへのデバイスの切り替えをしてくれます.

</追記>

フレームバッファで焼かれるあひるを録画する(あひる焼き Advent Calendar 2015)

この記事は あひる焼き Advent Calendar 2015の12月15日分の記事です.
#2度めですが1週間ほど空きがあったので.


🔥

以前こんな記事を書きました.

この時は

#terminal をフレームバッファも含めて動画でスクリーンショットとる方法が解らず今回は仮想マシンで実行してキャプチャしました.だれか端末のフレームバッファも含めての動画でのスクリーンショットのとり方を知ってる人が居たら教えて下さいo

という感じでフレームバッファの動画の録画方法が解らず,別のカメラで画面を録画していました.調べたら方法が見つかったので今回はその手順を紹介したいと思います.

といっても avconvffmpeg でフレームバッファを指定するだけです.
#Debian stretch からはまた libav から FFmpeg に戻るようです. > libav and FFmpeg: switch over

$ avconv -f fbdev -i /dev/fb0 fb.mp4
$ ffmpeg -f fbdev -i /dev/fb0 fb.mp4

これで録画したのがこちらです.

これで画面をカメラで録画したりしなくても焼かれるあひるが録画できるようになりました :)