2022-04-14 10:51:32 -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
[![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
2022-03-17 05:26:25 -04:00
The main purpose of 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
2022-04-14 10:13:38 -04:00
- playing clips in [watched ](/docs/folder_mode.md ) folder mode
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)
2022-03-24 09:51:46 -04:00
- EBU R128 loudness normalization (single pass)
2019-11-04 10:37:06 -05:00
- loop playlist infinitely
2022-04-14 10:13:38 -04:00
- [remote source ](/docs/remote_source.md )
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-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)
2022-04-14 10:13:38 -04:00
- [output ](/docs/output.md ):
2020-07-09 16:33:30 -04:00
- **stream**
- **desktop**
2022-03-31 16:09:22 -04:00
- **HLS**
2022-04-14 10:13:38 -04:00
- JSON RPC server, for getting infos about current playing and controlling
- [live ingest ](/docs/live_ingest.md )
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
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
2022-04-08 06:18:29 -04:00
- **ffmpeg** v4.2+ and **ffprobe** (**ffplay** if you want to play on desktop)
- if you want to overlay text, ffmpeg needs to have **libzmq**
-----
2019-06-06 12:30:51 -04:00
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,
2022-04-14 10:13:38 -04:00
"source": "https://example.org/big_buck_bunny.webm",
2019-03-12 16:13:58 -04:00
"category": ""
2019-03-06 09:06:06 -05:00
}
]
}
2018-01-07 07:58:45 -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-03-06 09:25:14 -05:00
-----
2020-07-09 16:33:30 -04:00
2022-03-31 16:09:22 -04:00
HLS output
-----
2019-03-06 09:25:14 -05:00
2022-03-31 16:09:22 -04:00
For outputting to HLS, output parameters should look like:
```yaml
out:
...
output_param: >-
...
-flags +cgop
-f hls
-hls_time 6
-hls_list_size 600
-hls_flags append_list+delete_segments+omit_endlist+program_date_time
-hls_segment_filename /var/www/html/live/stream-%09d.ts /var/www/html/live/stream.m3u8
2019-03-06 09:25:14 -05:00
```
2020-07-09 16:33:30 -04:00
2022-04-08 06:18:29 -04:00
-----
2019-03-06 09:25:14 -05:00
2022-04-07 15:11:20 -04:00
JSON RPC
-----
The ffplayout engine can run a JSON RPC server. A request show look like:
```Bash
curl -X POST -H "Content-Type: application/json" -H "Authorization: ---auth-key---" \
-d '{"jsonrpc": "2.0", "method": "player", "params":{"control":"next"}, "id":1 }' \
127.0.0.1:7070
```
At the moment this comments are possible:
```Bash
'{"jsonrpc": "2.0", "method": "player", "params":{"media":"current"}, "id":1 }' # get infos about current clip
2022-04-08 06:18:29 -04:00
'{"jsonrpc": "2.0", "method": "player", "params":{"media":"next"}, "id":2 }' # get infos about next clip
'{"jsonrpc": "2.0", "method": "player", "params":{"media":"last"}, "id":3 }' # get infos about last clip
'{"jsonrpc": "2.0", "method": "player", "params":{"control":"next"}, "id":4 }' # jump to next clip
'{"jsonrpc": "2.0", "method": "player", "params":{"control":"back"}, "id":5 }' # jump to last clip
'{"jsonrpc": "2.0", "method": "player", "params":{"control":"reset"}, "id":6 }' # reset playlist to old state
2022-04-07 15:11:20 -04:00
```
Output from `{"media":"current"}` show:
```JSON
{
"jsonrpc": "2.0",
"result": {
"current_media": {
"category": "",
"duration": 154.2,
"out": 154.2,
"seek": 0.0,
"source": "/opt/tv-media/clip.mp4"
},
"index": 39,
"play_mode": "playlist",
"played_sec": 67.80771999300123,
"remaining_sec": 86.39228000699876,
"start_sec": 24713.631999999998,
"start_time": "06:51:53.631"
},
"id": 1
}
```
2022-04-08 06:18:29 -04:00
When you are in playlist mode and jumping forward or backwards in time, the time shift will be saved so the playlist is still in sync. But have in mind, that then maybe your playlist gets to short. When you are not resetting the state, it will reset on the next day automatically.
2022-04-07 15:11:20 -04:00
2022-04-08 06:18:29 -04:00
-----
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
2022-03-17 05:26:25 -04:00
Copy the binary to `/usr/local/bin/`
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
2022-04-14 10:13:38 -04:00
```
OPTIONS:
-c, --config < CONFIG > File path to ffplayout.conf
-f, --folder < FOLDER > Play folder content
-g, --generate < YYYY-MM-DD > ... Generate playlist for date. Date-range is possible, like:
2022-01-01 - 2022-01-10.
-h, --help Print help information
-i, --infinit Loop playlist infinitely
-l, --log < LOG > File path for logging
-m, --play-mode < PLAY_MODE > Playing mode: folder, playlist
-o, --output < OUTPUT > Set output mode: desktop, hls, stream
-p, --playlist < PLAYLIST > Path from playlist
-s, --start < START > Start time in 'hh:mm:ss', 'now' for start with first
-t, --length < LENGTH > Set length in 'hh:mm:ss', 'none' for no length check
-v, --volume < VOLUME > Set audio volume
-V, --version Print version information
```
2022-03-17 05:26:25 -04:00
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
2022-03-24 09:51:46 -04:00
```Bash
2022-04-14 10:13:38 -04:00
./ffplayout -l none -p ~/playlist.json -o desktop
2019-03-18 16:31:10 -04:00
```