.gitignore | ||
ffplayout.conf | ||
ffplayout.py | ||
ffplayout.service | ||
gen_playlist_from_subfolders.sh | ||
LICENSE | ||
live.txt | ||
logo.png | ||
README.md | ||
requirements.txt |
ffplayout-engine
The purpose with ffplayout is to provide a 24/7 broadcasting solution that plays a json playlist for every day, while keeping the current playlist editable.
Check ffplayout-gui: web-based GUI for ffplayout.
Features
- have all values in a separate config file
- dynamic playlist
- replace missing playlist or clip with a dummy clip
- playing clips from watched folder
- send emails with error message
- overlay a logo
- overlay scrolling text
- trim and fade the last clip, to get full 24 hours
- when playlist is not 24 hours long, loop filler clip until time is full
- set custom day start, so you can have playlist for example: from 6am to 6am, instate of 0am to 12pm
- normal system requirements and no special tools
- no GPU power is needed
- stream to server or play on desktop
- add filters to input, if is necessary to match output stream:
- yadif (deinterlacing)
- pad (letterbox or pillarbox to fit aspect)
- framerate (change fps)
- scale (fit target resolution)
- aevalsrc (if video have no audio)
- apad (add silence if audio duration is to short)
- tpad (add black frames if video duration is to short)
Requirements
- python version 3.6+
- python module watchdog (only when
playlist_mode = False
) - ffmpeg v4.2+ and ffprobe (ffplay if you want to play on desktop)
- RAM and CPU depends on video resolution, minimum 4 threads and 3GB RAM for 720p are recommend
JSON Playlist Example
{
"channel": "Test 1",
"date": "2019-03-05",
"length": "24:00:00.000",
"program": [{
"in": 0,
"out": 647.68,
"duration": 647.68,
"source": "/Media/clip1.mp4"
}, {
"in": 0,
"out": 149,
"duration": 149,
"source": "/Media/clip2.mp4"
}, {
"in": 0,
"out": 114.72,
"duration": 114.72,
"source": "/Media/clip3.mp4",
"category": "advertisement"
}, {
"in": 0,
"out": 2531.36,
"duration": 2531.36,
"source": "/Media/clip4.mp4",
"category": ""
}
]
}
"length"
are optional, when you leave it blank, there will be no check if real playlist length is correct.
Warning:
(Endless) streaming over multiple days will only work when config have day_start value and the length value of the playlist is 24 hours. If you need only some hours for every day, use a cron job, or something similar.
Source from URL / Live Stream
You can use sources from url or live stream in that way:
...
{
"in": 0,
"out": 149,
"duration": 149,
"source": "https://example.org/big_buck_bunny.webm"
},
...
{
"in": 0,
"out": 2531.36,
"duration": 0,
"source": "rtmp://example.org/live/stream"
}
...
But be careful with it, better test it multiple times!
More informations in Wiki
Installation
- install ffmpeg, ffprobe (and ffplay if you need the preview mode)
- copy ffplayout.py to /usr/local/bin/
- copy ffplayout.conf to /etc/ffplayout/
- create folder with correct permissions for logging (check config)
- copy ffplayout.service to /etc/systemd/system/
- change user in /etc/systemd/system/ffplayout.service
- create playlists folder, in that format: /playlists/year/month
- set variables in config file to your needs
- use gen_playlist_from_subfolders.sh /path/to/mp4s/ as a starting point for your playlists (path in script needs to change)
- activate service and start it: sudo systemctl enable ffplayout && sudo systemctl start ffplayout
Start with Arguments
ffplayout also allows the passing of parameters:
-c, --config
use given config file-f, --folder
use folder for playing-l, --log
for user-defined log file-p, --playlist
for playlist file
You can run the command like:
python3 ffplayout.py -l ~/ffplayout.log -p ~/playlist.json
Preview Mode on Desktop
For playing on desktop set preview = True
in config under [OUT]
.