2021-05-28 04:31:55 -04:00
**ffplayout_engine**
2018-01-07 07:58:45 -05:00
================
2020-07-09 16:33:30 -04:00
2019-03-14 10:25:13 -04:00
[![made-with-python ](https://img.shields.io/badge/Made%20with-Python-1f425f.svg )](https://www.python.org/)
[![License: GPL v3 ](https://img.shields.io/badge/License-GPLv3-blue.svg )](https://www.gnu.org/licenses/gpl-3.0)
2018-01-07 07:58:45 -05:00
2019-06-05 05:23:52 -04:00
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.
2018-01-07 07:58:45 -05:00
2020-09-28 04:09:26 -04:00
**Check [ffplayout-frontend ](https://github.com/ffplayout/ffplayout-frontend ): web-based GUI for ffplayout**
2018-01-07 07:58:45 -05:00
2020-07-09 16:33:30 -04:00
**Features**
2018-01-07 07:58:45 -05:00
-----
- have all values in a separate config file
- dynamic playlist
2019-03-30 16:28:25 -04:00
- replace missing playlist or clip with a dummy clip
2021-05-28 04:31:55 -04:00
- playing clips from [watched folder ](https://github.com/ffplayout/ffplayout_engine/wiki/Watch-Folder )
2018-01-07 07:58:45 -05:00
- send emails with error message
- overlay a logo
2021-04-28 02:28:38 -04:00
- overlay text, controllable through [messenger ](https://github.com/ffplayout/messenger ) or [ffplayout-frontend ](https://github.com/ffplayout/ffplayout-frontend ) (needs ffmpeg with libzmq)
2019-11-11 15:44:55 -05:00
- **EBU R128 loudness** normalization (single pass) (experimental)
2021-05-28 04:31:55 -04:00
- loop clip in playlist which `out` value is higher then its `duration` , see also [Loop Clip ](https://github.com/ffplayout/ffplayout_engine/wiki/Loop-Clip )
2019-11-04 10:37:06 -05:00
- loop playlist infinitely
2019-07-19 06:49:01 -04:00
- trim and fade the last clip, to get full 24 hours
2019-07-20 18:54:06 -04:00
- when playlist is not 24 hours long, loop filler clip until time is full
2018-01-07 07:58:45 -05:00
- set custom day start, so you can have playlist for example: from 6am to 6am, instate of 0am to 12pm
2018-01-07 11:22:24 -05:00
- normal system requirements and no special tools
2019-06-06 12:30:51 -04:00
- no GPU power is needed
- stream to server or play on desktop
2019-10-31 17:21:24 -04:00
- on posix systems ffplayout can reload config with *SIGHUP*
2019-11-12 06:35:16 -05:00
- logging to files, or colored output to console
2019-09-04 15:39:33 -04:00
- add filters to input, if is necessary to match output stream:
2020-07-09 16:33:30 -04:00
- **yadif** (deinterlacing)
- **pad** (letterbox or pillarbox to fit aspect)
- **fps** (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)
2021-05-28 04:31:55 -04:00
- add custom [filters ](https://github.com/ffplayout/ffplayout_engine/tree/master/ffplayout/filters )
- add custom [arguments ](https://github.com/ffplayout/ffplayout_engine/tree/master/ffplayout/config )
- different types of [output ](https://github.com/ffplayout/ffplayout_engine/wiki/Outputs ):
2020-07-09 16:33:30 -04:00
- **stream**
- **desktop**
- **HLS**
- **custom**
2022-01-24 11:40:31 -05:00
- Multi channel
2022-01-25 14:37:22 -05:00
- Live ingest (experimental)
2018-01-07 07:58:45 -05:00
2019-06-06 12:30:51 -04:00
Requirements
-----
2020-07-09 16:33:30 -04:00
2022-01-02 12:18:05 -05:00
- python version 3.7+, dev version 3.9
2020-02-04 09:28:06 -05:00
- python module **watchdog** (only when `playlist_mode: False` )
2019-10-31 17:21:24 -04:00
- python module **colorama** if you are on windows
2021-02-04 10:26:07 -05:00
- python modules **PyYAML** , **requests** , **supervisor**
2019-09-09 14:27:36 -04:00
- **ffmpeg v4.2+** and **ffprobe** (**ffplay** if you want to play on desktop)
2019-12-14 14:21:35 -05:00
- if you want to overlay text, ffmpeg needs to have **libzmq**
2019-06-06 12:30:51 -04:00
- RAM and CPU depends on video resolution, minimum 4 threads and 3GB RAM for 720p are recommend
2019-03-06 09:06:06 -05:00
JSON Playlist Example
2018-01-07 07:58:45 -05:00
-----
2019-03-06 09:06:06 -05:00
```json
{
"channel": "Test 1",
"date": "2019-03-05",
"program": [{
"in": 0,
"out": 647.68,
"duration": 647.68,
2019-08-04 12:03:03 -04:00
"source": "/Media/clip1.mp4"
2019-03-12 16:13:58 -04:00
}, {
2019-03-06 09:06:06 -05:00
"in": 0,
"out": 149,
"duration": 149,
2019-08-04 12:03:03 -04:00
"source": "/Media/clip2.mp4"
2019-03-12 16:13:58 -04:00
}, {
2019-03-06 09:06:06 -05:00
"in": 0,
"out": 114.72,
"duration": 114.72,
2019-03-12 16:13:58 -04:00
"source": "/Media/clip3.mp4",
"category": "advertisement"
}, {
2019-03-06 09:06:06 -05:00
"in": 0,
"out": 2531.36,
2019-03-06 09:29:37 -05:00
"duration": 2531.36,
2019-03-12 16:13:58 -04:00
"source": "/Media/clip4.mp4",
"category": ""
2019-03-06 09:06:06 -05:00
}
]
}
2018-01-07 07:58:45 -05:00
```
2021-02-05 09:03:59 -05:00
**If you need a simple playlist generator check:** [playlist-generator ](https://github.com/ffplayout/playlist-generator )
2021-02-10 05:35:35 -05:00
The playlist can be extend, to use custom attributes in your [filters ](/ffplayout/filters/ ).
2021-02-05 09:03:59 -05:00
2020-07-09 16:33:30 -04:00
**Warning**
-----
2019-10-31 17:21:24 -04:00
(Endless) streaming over multiple days will only work when config have **day_start** value and the **length** value is **24 hours** . If you need only some hours for every day, use a *cron* job, or something similar.
2019-03-06 09:06:06 -05:00
2019-11-12 06:35:16 -05:00
Remote source from URL
2019-03-06 09:25:14 -05:00
-----
2020-07-09 16:33:30 -04:00
2019-11-12 06:35:16 -05:00
You can use sources from remote URL in that way:
2019-03-06 09:25:14 -05:00
```json
{
"in": 0,
"out": 149,
"duration": 149,
2019-03-13 09:59:05 -04:00
"source": "https://example.org/big_buck_bunny.webm"
2019-03-06 09:25:14 -05:00
}
```
2020-07-09 16:33:30 -04:00
2019-03-06 09:25:14 -05:00
But be careful with it, better test it multiple times!
2021-05-28 04:31:55 -04:00
More informations in [Wiki ](https://github.com/ffplayout/ffplayout_engine/wiki/Remote-URL-Source )
2019-03-06 09:25:14 -05:00
2018-01-07 11:22:24 -05:00
Installation
-----
2020-07-09 16:33:30 -04:00
2020-02-04 08:38:05 -05:00
Check [INSTALL.md ](docs/INSTALL.md )
2019-03-18 16:31:10 -04:00
2019-04-01 16:05:46 -04:00
Start with Arguments
2019-03-18 16:31:10 -04:00
-----
2020-07-09 16:33:30 -04:00
2019-03-18 16:31:10 -04:00
ffplayout also allows the passing of parameters:
2020-07-09 16:33:30 -04:00
2019-08-21 15:35:18 -04:00
- `-c, --config` use given config file
- `-f, --folder` use folder for playing
2019-11-12 06:35:16 -05:00
- `-l, --log` for user-defined log path, *none* for console output
2019-11-11 15:44:55 -05:00
- `-i, --loop` loop playlist infinitely
2021-02-10 03:53:02 -05:00
- `-m, --mode` set output mode: **desktop** , **hls** , **stream** , ...
2019-08-11 11:33:11 -04:00
- `-p, --playlist` for playlist file
2021-05-18 09:27:57 -04:00
- `-s, --start` set start time in *hh:mm:ss* , *now* for start at playlist begin
2019-11-11 15:44:55 -05:00
- `-t, --length` set length in *hh:mm:ss* , *none* for no length check
2019-03-18 16:31:10 -04:00
2019-08-11 11:33:11 -04:00
You can run the command like:
2019-03-18 16:31:10 -04:00
2020-07-09 16:33:30 -04:00
```SHELL
2021-02-04 10:26:07 -05:00
./ffplayout.py -l none -p ~/playlist.json -d -s now -t none -m desktop
2019-03-18 16:31:10 -04:00
```