# rtsp-samsung-tv
## Description
Display  RTSP streams from IP Cameras on Samsung smart TV (Tizen TV)


[![npm version](https://badge.fury.io/js/rtsp-samsung-tv.svg)](https://badge.fury.io/js/rtsp-samsung-tv)
![rtsp-samsung-tv CI](https://github.com/vzakharchenko/rtsp-samsung-tv/workflows/rtsp-samsung-tv%20CI/badge.svg)
![rtsp-samsung-tv Docker amd64 arm64 armv7](https://github.com/vzakharchenko/rtsp-samsung-tv/workflows/rtsp-samsung-tv%20Docker%20amd64%20arm64%20armv7/badge.svg)
[![donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://secure.wayforpay.com/button/bf5d6c136e034)
# Features
 - support more than 999 RTSP streams.
 - switch channels(rtsp stream) using numpad on the remote control
 - [Run Inside docker container](#run-inside-docker-container)
 - use server to convert rtsp streams using ffmpeg
 - [group rtsp streams on the obe channel (Display 4 cameras streams on one channel)](#add-4-cameras-on-one-screen---)
 - support udp and tcp transport
 - tizen samsung tv application
 - [admin ui](#admin-ui)
 - [protect admin ui(optional)](#protect-admin-ui-using-keycloak-sso-optional)
 - [Voice Control](#voice-control)
 - [Remote Control](#remote-control)
 -  Supports parameters before "-i" and after it
 - [Raspberry Pi Hw acceleration](#raspberry-pi-hw-acceleration-on-ffmpeg-raspbian-lite-image)


![ipport.png](/img/ipport.png), ![camera1.png](/img/camera1.png), ![camera4.png](/img/camera4.png)

# Server Installation
```bash
sudo apt-get install ffmpeg
wget -qO- https://getpm2.com/install.sh | bash
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ${currentUser} --hp ${HOME}
sudo npm i rtsp-samsung-tv -g
sudo pm2 start `npm root -g`/rtsp-samsung-tv/server.js
sudo pm2 save
```
open ```http:\\<SERVER_IP>:3004``` (Default Login: **admin**, Default Password: **admin**) and add a new  Camera and click Save ![](img/addnewCamera.png) ![](img/addedNewDevice.png)

# Run Inside docker container
```
docker run -d --name=rtsp-samsung-tv  -p 3004:3004 -p 9999-10004:9999-10004  --restart=always vassio/rtsp-samsung-tv:latest
```
## Configuration on Host:
```
echo "{}" >/opt/channels.json
docker run -d --name=rtsp-samsung-tv  -p 3004:3004 -p 9999-10004:9999-10004  -v /opt/channels.json:/opt/config/channels.json --restart=always vassio/rtsp-samsung-tv:latest
```
## Keycloak Protection
```
echo "{}" >/opt/channels.json
docker run -d --name=rtsp-samsung-tv  -p 3004:3004 -p 9999-10004:9999-10004  -v /opt/channels.json:/opt/config/channels.json -v  `pwd`/keycloak.json:/opt/config/keycloak.json --restart=always vassio/rtsp-samsung-tv:latest
```


# Install Samsung TV Application(Tizen Application)

1. install java jdk
2. install Tizen SDK on your PC [https://developer.tizen.org/development/tizen-studio/download](https://developer.tizen.org/development/tizen-studio/download)
3. download application source ```git clone https://github.com/vzakharchenko/rtsp-samsung-tv.git```
4. in "Tizen Studio Package manager" install  "Tizen SDK Tools" ![](img/TizenSDK.png)
5. "Extension SDK" install "extras" ![](img/InstallAll.png)
6. open "Tizen Studio"
7. File -> Open Project From File System ![](img/FileImport.png)
8. open rtsp-samsung-tv/CameraDevice![](img/importProject.png)
9. [Enable Development mode on your TV](https://developer.samsung.com/smarttv/develop/getting-started/using-sdk/tv-device.html)
10. open Device manager ![](img/deviceManager.png)
11. click "Scan device" ![](img/deviceManager2.png)
12. set Connection to "On"
13. right click on your connection and select "Permit install" ![](img/deviceManager3.png)
  - If you see NO DUID For Selected Device
  ![](img/NoDUIDMessage.png)
    then you need to [generate certificate](#generate-samsung-certificate) for your TV
14. in Tizen studio select project and run it on TV.Channel ![](img/SelectDevice.jpeg) ![](img/RunAsTizenWeb.png)
15. setup server ip and port on TV. ![](/img/ipport.png)


# Admin UI
## **Url**:  ```http:\\<SERVER_IP>:3004```
- Default Login: **admin**
- Password: **admin**
![](/img/AdminUi.png)

where:
- **File**  path to config file.
- **Default Transport** Default RTSP Transport. Applicable to all cameras
- **Default RTSP FFmpeg parameters** Parameters before "-i". Applicable to all cameras
- **Default Encode FFmpeg parameters** Parameters before "-i". Applicable to all cameras
```
ffmpeg <Default RTSP FFmpeg parameters> -i rtsp://stream <Default Encode FFmpeg parameters>
```

## Camera Specific Columns:
- **Status** now on TV.
- **Camera** channel number.
- **Camera Mode** "1 Camera" : one camera on screen, "4 Cameras" : 4 cameras on one screen.
- **rtsp Streams** rtsp streams.
- **Transport** Camera RTSP Transport.
- **RTSP FFmpeg parameters** Parameters before "-i". Applicable to all cameras
- **Encode FFmpeg parameters** Parameters after "-i". Applicable to all cameras
```
ffmpeg <RTSP FFmpeg parameters> -i rtsp://stream <Encode FFmpeg parameters>
```

## **add 1 Camera**: ![](img/addnewCamera.png) ![](img/addedNewDevice.png) ![camera1.png](/img/camera1.png)
## **Add 4 cameras on one screen**: ![](img/add4Cameras.png) ![](img/added4Cameras.png) ![camera4.png](/img/camera4.png)
## **delete Camera** ![](img/deleteCamera.png)

# Protect Admin UI using Default Authentication
Default user: **admin/admin**

# Protect Admin UI using keycloak SSO (Optional)
1. download keycloak.json from the keycloak admin ui.
2. save keycloak.json to [./config/keycloak.json](/config) or /opt/config

example of keycloak.json
```json
{
  "realm": "RTSP",
  "auth-server-url": "https://localhost:8090/auth",
  "ssl-required": "external",
  "resource": "testClient",
  "credentials": {
    "secret": "secret"
  },
  "confidential-port": 0
}
```
# Raspberry Pi Hw acceleration on ffmpeg ([Raspbian Lite Image](https://www.raspberrypi.org/downloads/raspberry-pi-os/))
1. build ffmpeg with mmal feature
```bash
sudo apt-get install libomxil-bellagio-dev
sudo apt-get install libomxil-bellagio-bin
git clone https://github.com/FFmpeg/FFmpeg
cd FFmpeg
git checkout origin/release/3.2
sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-mmal  --enable-omx --enable-omx-rpi --enable-nonfree
sudo make -j4
sudo make install
```
2. ![](/img/RaspberryPiHW.png)
3. increase the GPU memory?
  - ```bash
    sudo raspi-config
    ```
-  **7 Advanced Options** ![](/img/raspberry1.png)
-  **A3 Memory Split** ![](/img/raspberry2.png)
-  set value **256** or more ![](/img/raspberry3.png)

# Voice Control
    1. Press VOICE button
    2. Say command
 **List of commands:**
 "Channel Up" (or the same on your language)
 "Channel Down" (or the same on your language)
 "1","2","3","4" ... "999"

# Remote Control

![](/img/RemoteControl.png)

# Generate Samsung Certificate

1. Open "Certificate Manager" ![](img/GenerateCertificate.png)
2. Add a new Samsung Certificate  ![](img/GenerateCertificate2.png) ![](img/GenerateCertificate3.png)
3. Select DeviceType "TV" ![](img/GenerateCertificate4.png)
4. Click Next ![](img/GenerateCertificate5.png)
4. Type any name and password ![](img/GenerateCertificate6.png)
5. Click Ok ![](img/GenerateCertificate7.png)
6. Login to Samsung Account ![](img/GenerateCertificate8.png)
7. Next ![](img/GenerateCertificate9.png)
8. Add [Individual DUID](#individual-duid) ![](img/GenerateCertificate10.png)
9. Finish

#  Individual DUID
 On TV select "Settings"->"Support"->"About TV"-> Information About Smart Hub-> Unique Device Id ![](img/TV_DUID2.png)

