cri.dev about posts uses makes rss

Displaying RTSP stream on a Kindle Paperwhite

Published on

As crazy/stupid as it sounds, I did it.

Managed to show the local RTSP stream from a Tapo surveillance camera on a rooted / jailbroken Kindle Paperwhite, without servers, just ffmpeg and eips

The idea

eips is a custom e-ink support program for kindles

Find more info here

Fortunately on a Kindle (rooted) there is also a build of the ffmpeg lib, which will come in very handy.

The idea of the script that is running on the Kindle (no servers! “serverless” in the real sense, I can say :P) is the following:

I want to use the RTSP stream of my Tapo camera and grab a snapshot (1 frame of the stream)

Since I don’t have ImageMagick installed (and can’t compile it from source) on my Kindle, I’ll need to do everything with one ffmpeg command.

eips will come into play to render the image every few seconds.

This is going to be great-scale (alright, sorry for the pun)

The script

#/bin/sh

while true; do
  ffmpeg -y -rtsp_transport tcp \
    -i "rtsp://<username>:<password>@<tapocamip>:554/stream1" \
    -f image2 \
    -pix_fmt gray \
    -vf "scale=1920:-1,transpose=1" \
    -vframes 1 \
    output.png
  eips -cfg output.png
  sleep 5
done

FFmpeg

To break down the ffmpeg command:

  • -y to overwrite the output.png file at every run
  • -rtsp_transport tcp because I was getting dropped chunks during the transport with UDP on my spotty network
  • -i "rtsp://..." well that’s the source where I am getting the rstp stream duh
  • -f image2 tells ffmpeg to store a sequence of individual image frames as separate files (in conjuction with -vframes 1)
  • -pix_fmt gray because Kindles work best with 8-bit grayscale PNGs
  • -vf "scale=1920:-1,transpose=1" to scale the image maintaining the aspect ratio and rotate it 90deg clockwise, so it fills the whole screen of the Kindle

eips

The eips -cfg does the following:

  • -c clears the screen before updating it
  • -f perform a full screen update
  • -g to tell it it’s a PNG file

Prevent Kindle going to sleep

Borrowed from this repo

Prepend this to the script:

lipc-set-prop -i com.lab126.powerd preventScreenSaver 1
/etc/init.d/powerd stop

or use the KUAL Helper extension to prevent the screensaver manually.

Proof of Kindle

kindle tapo cam ffmpeg

Installation

You could spin this up in a cron, or through init.d

Or by using a generic cron that runs every minute an make a different script without the while loop, e.g.

* * * * * /mnt/us/cam-once.sh

To do that, first make your filesystem writable

mntroot rw

Then edit the crontab

vi /etc/crontab/root

Here, have a slice of pizza 🍕