# Multiview: TV Camera Viewing System

**URL:** https://discussion.scottibyte.com/t/multiview-tv-camera-viewing-system/1526
**Category:** Uncategorized
**Created:** [June 23, 2026, 12:42am UTC](https://discussion.scottibyte.com/t/multiview-tv-camera-viewing-system/1526 "2026-06-23T00:42:56Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![scott](https://discussion.scottibyte.com/letter_avatar_proxy/v4/letter/s/3e96dc/32.png) [@scott](https://discussion.scottibyte.com/u/scott)
#### Post date: [June 23, 2026, 12:42am UTC](https://discussion.scottibyte.com/t/multiview-tv-camera-viewing-system/1526/1 "2026-06-23T00:42:56Z")

</div>

The ScottiBYTE MultiView Server coupled with the ScottiBYTE Android TV Client application provides a completely private self hosted, high performance RTSP camera viewing solution with all your credentials secured on your server and not on any TV device.

For the last eight years I have used TinyCam Pro on my phone, tablets, and Fire TV devices. TinyCam Pro is a flexible and powerful Android application and it usually performs rather well. The issue I have had with it is that whenever I add or modify a camera configuration, I have to visit every device with TinyCam Pro and make changes. There is an option to store the camera configuration to Google Drive or NextCloud, but that option does not always work well.

Worse yet, all your camera credentials are a part of each TinyCam Pro configuration and so your configuration including passwords are on every phone, tablet and Android TV box on which you use the application.

The other issue is that newer cameras are now 4k, have higher bitrates and use h.265 compression. This means that those Fire TV devices which have minimal CPU resources are quickly overwhelmed. I had my cameras displayed on my Fire TV in a 2x2 Matrix on the main screen and TinyCam Pro would frequently lock up or crash entirely.

I developed Multiview as a Client/Server application to solve these problems. The Multiview Server stores all of your camera credentials and manages all of your camera stream configurations.

At the core of the Multiview server is the Stream Engine which is powered by MediaMTX. MediaMTX is a **lightweight live video/audio streaming server and proxy**. Think of it as a **media router** : cameras, FFmpeg, OBS, or other devices can publish streams into it, and clients can read those streams back using different protocols. Multview uses FFmpeg to transcode streams and publish them using MediaMTX.

Here’s the data flow.

Camera → Stream URL → MediaMTX/Stream Relay → Multiview Backend → Android TV App

Start by creating an Incus Container for the MultiStream Server. Since MultiStream is a docker application, you can also just load it on your existing docker server.

```auto
incus launch images:ubuntu/26.04 MultiviewServer -p default -p vlan30 -c boot.autostart=true -c security.nesting=true 

```

My vlan30 profile above is for my IoT vlan since that is where my cameras are located. You can use “bridgeprofile” like my other projects to create your container if your cameras are not on any special vlan.

Move inside of the new container.

```auto
incus shell MultiviewServer

```

Accept the updates.

```auto
apt update && apt upgrade -y

```

Install some dependencies.

```auto
apt install nano curl net-tools openssh-server -y

```

Install docker from the script on the docker website.

```auto
curl https://get.docker.com | sh

```

Add a user.

```auto
adduser scott

```

Put the user in the sudo and docker groups.

```auto
usermod -aG sudo,docker scott

```

Log into the new user account.

```auto
su - scott

```

Create the application folder and move inside it.

```auto
mkdir multiview-server && cd multiview-server

```

Edit a docker compose file.

```auto
nano compose.yml

```

Put the following text into the editor.

```auto
services:

  mediamtx:
    image: bluenviron/mediamtx:latest
    container_name: multiview-server-mediamtx
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./mediamtx/mediamtx.yml:/mediamtx.yml:ro

  multiview-server:
    image: scottibyte/multiview-server:latest
    # For local development, comment the image line above and uncomment:
    # build: .
    container_name: multiview-server
    restart: unless-stopped
    network_mode: host
    environment:
      - NODE_ENV=production
      - PORT=8080
      - TZ=${TZ}
      - MULTIVIEW_PUBLIC_URL=${MULTIVIEW_PUBLIC_URL}
      - MULTIVIEW_DATA_DIR=/app/data
      - MEDIAMTX_API_BASE=${MEDIAMTX_API_BASE}
      - MEDIAMTX_HLS_BASE=${MEDIAMTX_HLS_BASE}
    volumes:
      - ./data:/app/data
      - ./logs:/app/logs

```

Do a CTRL O and enter to save the file and a CTRL X to exit the nano editor.

Edit the environment variables file.

```auto
nano .env

```

Insert the following into the editor.

```auto
# ScottiBYTE MultiView Server local configuration

TZ=America/Chicago

# Public URL for the protected MultiView Server web UI/API.
# Example:
# MULTIVIEW_PUBLIC_URL=https://multiview-server.example.com
MULTIVIEW_PUBLIC_URL=http://serverip:8080

# MediaMTX API is normally local to the host-network containers.
MEDIAMTX_API_BASE=http://127.0.0.1:9997

# HLS base URL used by web/TV clients.
# Keep this LAN-only unless you intentionally expose/protect HLS separately.
MEDIAMTX_HLS_BASE=http://serverip:8888

```

Change your timezone accordingly. Change the MULTIVIEW\_PUBLIC\_URL serverip value to the address of your incus container or your docker server. The public URL can also be served via NginX Proxy Manager if desired. Set the MEDIAMTX\_HLS\_BASE serverip to the address of your incus container or docker server. MEDIAMTX\_HLS\_BASE must be a local address.

Save the file with CTRL O and enter and CTRL X to exit the nano editor.

Make a folder for MediaMTX.

```auto
mkdir mediamtx

```

Edit the MediaMTX configuration file.

```auto
nano mediamtx/mediamtx.yml

```

Insert the following text.

```auto
logLevel: info

api: yes
apiAddress: 0.0.0.0:9997

rtsp: yes
rtspAddress: 0.0.0.0:8554

hls: yes
hlsAddress: 0.0.0.0:8888
hlsVariant: mpegts
hlsSegmentCount: 6
hlsSegmentDuration: 2s
hlsAlwaysRemux: yes

webrtc: yes
webrtcAddress: 0.0.0.0:8889

paths:
  all_others:
    source: publisher

```

Save the file with CTRL O and enter and CTRL X to exit the nano editor.

Start the Multiview Server.

```auto
docker compose up -d

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/2/24182fb289d52c5501abbae3ec701a7acece2404.jpeg)

Check to see that it is running.

```auto
docker ps

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/3/34907c81d4bb20cbe90531d37101aef00b6f53be.jpeg)

Also the logs…

```auto
docker compose logs

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/e/ee643fffcaad00fcefc42052f9b72f5bb01b21e1.jpeg)

Find out the address of the incus container (yours will differ).

```auto
ifconfig

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/c/c36e6772becfdf379fa13084bccda2127dac8dce.jpeg)

Go to your web browser at the address you found at port 8080.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/c/cf3c5e13df8366b4e5a554f4f00483473aa75f44.jpeg)

Once you create the admin user you are logged in on the dashboard.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/3/32a5373b2f7a54b0b1fba5625196b87d3e30f9aa.jpeg)

Go the the Cameras button and enter one or more cameras with their RTSP URL as documented by each camera manufacturer.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/9/94fe8edc77b9d88d765d4592a4076a997eb9e47a.jpeg)

Once you add a camera, if it properly connects, it will display a thumbnail picture to the left of its name.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/a/a03cd086ad233d381d5ff54464ea420ae9088bd1.jpeg)

If you go back and edit the camera settings with the edit button, there are a few more options.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/7/746c7c406f1a2fda91ae932c8e64f2989f999b9a.jpeg)

If you click on the “Live” button you will see the live stream from that camera.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/5/5bb94629ddb2127a20838df7a9007d1b79dff495.jpeg)

The “Groups” menu lets you optionally organize your cameras into groups just for your own reference.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/0/0ec9b0b56a977aff88efcd314c108e1872e87ca0.jpeg)

The Matrix menu option displays your cameras in a Matrix with dedicated cards for each.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/1/1c531374b5acb74a5dde4856e32122514b06c0f6.jpeg)

Stream Engine shows the status of your camera streams.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/a/a9090bb7be2baaf09ef79b2d8dac2417096bd58e.jpeg)

TV Clients is the menu where you authorize & de-authorize the clients allowed to access your cameras.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/f/f57c46a42de949c567412d85b63877115e87e56b.jpeg)

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/f/ff2af1787003e06166d79aa0e47fe484d17e393e.png)

Now that we have the MultiView Server application installed and configured, it’s time to head over to your Fire TV. Start by going into “My Fire TV”

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/e/ea8251155c058b1bbe9daca9b55cd85fa6f8aca5.jpeg)

On the next screen, click “About”.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/f/fdd357f9945e326a78590fbe5441870cc73dd619.jpeg)

On the next screen shown below, tap on “Fire Stick 4k” five times until it says you are a developer.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/4/4d2a1b9c622b3aa6505f5694d94423240c1cb8eb.jpeg)

Go back one menu level to the “MY FILE TV” menu and you should see a “Developer Options” menu item.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/6/65f6d50c53cd330e02a6c7aa532206e266c15531.jpeg)

Choose “Developer Options” and turn on both options.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/c/c31dd9b9de7c5b0595c83fb2d5b174b3f0f0b2c4.jpeg)

Go back to the command line on your MultiView Server we just built and install the Android Debug Bridge (ADB) tool.

```auto
sudo apt install adb

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/f/fa4a01a62c988c856916e196c0440ce502bf06bd.jpeg)

Look at your network router or your Fire TV network options to find the IP address of the Fire TV/Android device.

Start the adb server.

```auto
adb start-server

```

![image](https://discussion.scottibyte.com/uploads/default/original/2X/5/567da8d9fa84e258481b25014e47863ba8ea78c1.png)

Use adb connect to connect to your Fire TV at the address of your Fire TV. It will fail.

![image](https://discussion.scottibyte.com/uploads/default/optimized/2X/b/bc8113a3564867baef0bdba8584ce05a9804c643_2_690x61.png)

If you go to your Fire TV device, it will have flashed up a message to accept a connection. Follow the video tutorial and provide the authorization.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/6/6803422516768bcb9fea985dd546e20a11b1b58c.jpeg)

Back at the MutiviewServer command line if you reissue the command, you will see that you are now connected. Be sure to use your Fire TV IP address and not the one I am showing.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/6/687c7147ef2bb3e23b0d18e3a84a073a155a65d2.jpeg)

Download a copy of the ScottiBYTE MultiView for Android TV client.

```auto
wget https://github.com/ScottiBYTE/multiview-android-tv/releases/download/v1.0.0-rc30/ScottiBYTE-MultiView-AndroidTV-FireTV-v1.0.0-rc30.apk

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/e/e3cc6fd64f1e96665bdc652f11bf64fedcb3920e.jpeg)

You can list the file to see that it has been downloaded.

```auto
ls -al

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/d/d9521f807b7fd59519d772086c5c0fd227deb418.jpeg)

Since we are already connected to the Fire TV, the command to install the package follows. Again, be sure to change the IP address. The port 5555 will be the same.

```auto
adb -s 192.168.30.26:5555 install ~/multiview-server/ScottiBYTE-MultiView-AndroidTV-FireTV-v1.0.0-rc30.apk

```

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/8/88b022b070aba00f43fecde173cc5598e6c6a936.png)

At the bottom of the application list on your Fire TV device you should see “ScottiBYTE Multiview”.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/d/d4b130c183760890b5cb0ca1011e286a7ebbe229.jpeg)

When you launch the application, enter the address of your Multiview Server container. Don’t forget the port 8080 at the end like I did in the tutorial.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/7/74c6522c9a5d539ff34c8ee416884b16fdceb830.jpeg)

Once the address is correct with the port number as shown above, click “Pair This TV”.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/4/4b36e28a51baf36d4ba221f6d49e415788b9829a.jpeg)

Over on the ScottiBYTE MultiView Server, you will see a client is pending approval.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/8/8a00b2c6d5f2e06c8fcbefe093f4940f19d99763.jpeg)

Click the “Authorize” button and the request moves to "Approved/Waiting for Client briefly.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/c/c928eab85d423b7e7c2cc7a09362b4dd85156d58.jpeg)

Refresh the web screen and you will see it is an authorized client now.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/e/e0d5a05582b2a66403a850c0c467c6f153d6e72f.jpeg)

Now when you go back to your Fire TV, the pairing is processed and your camera(s) thumbnails are displayed.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/6/65e30af0a435b28d68c5a29cad47a9862ec79b0f.jpeg)

I only configured a single camera and I didn’t create any groups, so the Sidewalk camera is in the default group. Once I click on the Sidewalk camera, it displays. It was at an extreme sun angle, so it looks washed out.

 ![image](https://discussion.scottibyte.com/uploads/default/original/2X/1/17442631b8943f280237726b4fe4b9076880d713.jpeg)

The real power of the app is the ability to instantly access your cameras with no waiting and to automatically cycle/rotate through cameras that you select.

I hope that you like ScottiBYTE Multiview Server & the Multiview Android viewer. This took me more time than you can imagine and donations are very much appreciated.
