Update for aarch64 - RPi 4 & 5 - 10/02/2025
INTRO
I've mounted a transcoding server with a simple web control interface to help viewing your videos in a compatible web browser.
It includes ffmpeg own compilation ready to do real time transcode in rpi 3 and rpi 4 using omx and mmal.
It also works great spawned by tvheadend
Also includes nginx specific compile to help the transcoding process.
You can even add nginx additional configurations with an included php authorization server.
add-on will be identified as service.ffmpeg in kodi.
Download here:
https://mega.nz/file/oHZi3b5K#F1HMIak0x6-AkZlRpaUKekUnNPtZFwvkN87aNWvTlNY
DETAILS
FFmpeg TRANSCODING Server for Raspberry Pi
This add-on includes:
1 A small TRASNCODING web based service - you can transcode your local stored movies across the network.
even when on low bandwidth.
2 NGINX with:
rtmp and hls for transcoding services.
php scripts handler.
cgi scripts handler.
authorizaiton server running on port 444 (for form based authorizaiton - see bellow)
nginx can also publish your custom sites.
See examples in the default configuration site at:
/storage/.kodi/addons/service.ffmpeg/etc/nginx/sites-enabled
Your custom sites definitions goes into:
/storage/.kodi/userdata/addon_data/service.ffmpeg/sites-custom/
3 FFMPEG with omx and mmal support for Pi, and also libx264 with presets (for fast transcoding).
can be used in a tvheadend profile (see bellow).
Compatible with vlc player and chrome (must install a m3u8 extension for playing streams).
= QUICK SETUP
After install go to add-on settings in kodi:
- Change user and pass (defaults to user / pass)
Access to the User interface with a web-browser:
in which path_to_transcode is the directory path that contains video contents to be browsed and transcoded.
use linux format (example: /media/hdd/movies)
= TECH STUFF
1 TRANSCODING SERVER
- TRANSCODING CONTROL PORT : Defaults to 9996.
Simple CTRL GUI :
Start Transcode :
Stop Transcode :
Play stream :
Movies will default transcode to 640x480 @ 512kbps.
Publishing is made to rtmp://localhost/hls/movie (internal port 1935)
- USER AND PASSWORD:
User and password defaults to "user" and "pass".
Should be changed in kodi's add-on configuration screen.
- KODI ADD-ON CONFIGURATION:
In the add-on configuration screen, you can define:
- Server port (defaults to 9996);
- Transcoded streaming video frame size (defaults to 640 x 480);
- Transcoded streaming video bitrate (defaults to 512 Kbps);
- User and password to access the control site;
- Control GUI:
Should be called with the local server directory with movies to transcode.
Example:
This interface allows choosing the movie, start transcoding, start playback and stop transcoding.
m3u8 can be watched in chrome by installing an extension. VLC Plays them directly.
- TRANSCODE:
transcode.cgi can be called directly by giving the movie FULL PATH NAME WITHIN THE SERVER,
and several optional arguments.
The example bellow uses the default options:
All arguments are self explanatory, except "caller",
which is an optional address to transfer execution after the transcoding is started.
If "caller" is not passed as argument,
transcode.cgi will stay in browser with a small simple interface to playback and stop the stream.
2 NGINX - ADDITIONAL SITES:
As nginx is being used, you can define additional servers in:
/storage/.kodi/userdata/addon_data/service.ffmpeg/sites-custom
Or by samba as:
\\Userdata\addon_data\service.ffmpeg\sites-custom
You sites may also use cgi and php.
3 NGINX - THE AUTHORIZATION SERVER
- INCLUDE FILE
Script to include in nginx servers in order to test and request authentication
/storage/.kodi/addons/service.ffmpeg/etc/nginx/authentication.include;
Each location to protect should include a:
auth_request /oauth;
Locations to explicitly ignore auth_request should do a:
auth_request off;
- $authentication_server variable
it is defined to the internal server that will answer authorization requests, login and logout procedures.
defaults to http://127.0.0.1:444;
- LOGOUT
To force a logout, there is a virtual page that you can can force from your site.
- VIRTUAL LOCATIONS
This is a list of all virtual locations included with this config:
/oauth authorization validation (internal to nginx config)
/login_form.php login form (internal to nginx config)
/login_process.php form credentials test (called by form)
/logout.php force user logout (can be called externally)
The login user information is kept in a php session
- PASSWORD FILE
Should be in htpasswd format:
defined in $passwords variable
- TYPICAL IUSAGE:
server {
..... your server definitions ....
include /storage/.kodi/addons/service.ffmpeg/etc/nginx/authentication.include;
set $passwords /storage/path/password_file
# List of nginx variables that may be OPTIONALLY configured AFTER the include:
# set $autentication_server (internal LAN address - usually http://127.0.0.1:444)
# set $passwords (full path to the filename with the passwords)
# This location needs login & password
location /secure/ {
auth_request /oauth;
expires -1;
}
# This locatin will NOT request login
location /free/ {
auth_request off;
}
}
4 FFmpeg
ffmpeg is used as the encoding for the server,
but it is also usable trought command-line.
just call as:
ffmpeg
TVHEADEND
If you use tvheadend, you may define a profile that pipes video streams trough ffmpeg before delivering.
The following example uses x264 to live transocde with a Rapsberry Pi4.
Assuming ffmpeg server kodi add-on installed in LibreELEC:
- tvheaded / configiration / stream / stream profiles / add
- create and enable new stream profiles with the followig:
. enabled = true
. Data timeout = 0
. Restart on error = true
. Continue if descrambling fails = true
. Descrambling timeout = 10000
. Command Line
/storage/.kodi/addons/service.ffmpeg/bin/ffmpeg -loglevel quiet -i pipe:0 -vcodec libx264 -preset faster -s 640x480 -vb 512k -bufsize 1024k -g 100 -af "aresample=async=1:first_pts=0" -acodec aac -ab 128k -f mpegts pipe:1
. Kill signal = SIGTERM
. Kill timeout = 15
- The ffmpeg provided command will do live transcode with the major setup:
. video codec : libx264
. preset : faster
. frame size : 640x480
. video bitrate : 512k
. audio codec : aac
. audio bitrate : 128k
. audio sync with video (to handle received lost frames)
5 COMPILATION DETAILS
ffmpeg and nginx were compiled using the following flags:
ffmpeg version N-114580-g8a23a145d8 Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
configuration: --arch=aarch64 --prefix=/usr --enable-gpl --enable-libx264 --enable-libx265
--enable-libdrm --enable-libaom --enable-omx --enable-omx-rpi --enable-openssl --disable-ffplay
--disable-ffprobe --disable-doc --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes
--disable-libxcb-shape --enable-nonfree
nginx version: nginx/1.23.2
built by gcc 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enable
configure arguments:
--with-http_ssl_module --with-http_dav_module --with-http_flv_module
--with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module
--with-http_auth_request_module
--add-module=../nginx-rtmp-module --add-module=../echo-nginx-module
nginx was patched with patchelf to force usage of specific libcrypt.so.1
distributed with the bin
php-fpm
PHP 7.4.32 (fpm-fcgi)
(built: Sep 29 2022 16:15:14)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
configure arguments:
--without-iconv --enable-fpm
php-fpm was patched with patchelf to force usage of specific libraries
distributed with the bin