2022-06-22 15:39:59 -04:00
**ffplayout**
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-07-24 13:23:52 -04:00
## **ffplayout-engine (ffplayout)**
2018-01-07 07:58:45 -05:00
2023-02-03 06:38:16 -05:00
[ffplayout ](/ffplayout-engine/README.md ) is a 24/7 broadcasting solution. It can playout a folder containing audio or video clips, or play a *JSON* playlist for each day, keeping the current playlist editable.
2022-06-22 15:39:59 -04:00
2023-02-03 06:38:16 -05:00
The ffplayout applications are mostly designed to run as system services on Linux. But in general they should run on any platform supported by Rust.
2022-07-28 04:46:55 -04:00
Check the [releases ](https://github.com/ffplayout/ffplayout/releases/latest ) for pre compiled version.
2022-06-22 15:39:59 -04:00
### Features
2018-01-07 07:58:45 -05:00
- have all values in a separate config file
- dynamic playlist
2023-07-25 06:16:15 -04:00
- replace missing playlist or clip with single filler or multiple fillers from folder, if no filler exists, create 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
2022-07-28 04:46:55 -04:00
- overlay text, controllable through [ffplayout-frontend ](https://github.com/ffplayout/ffplayout-frontend ) (needs ffmpeg with libzmq and enabled JSON RPC server)
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
2023-07-25 06:16:15 -04:00
- when playlist is not 24 hours long, loop fillers 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
2023-02-03 06:38:16 -05:00
- log to files or color 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-06-27 05:49:43 -04:00
- **null** (for debugging)
2023-02-03 06:38:16 -05:00
- JSON RPC server, to get information about what is playing and to control it
2022-04-14 10:13:38 -04:00
- [live ingest ](/docs/live_ingest.md )
2022-08-07 12:00:20 -04:00
- image source (will loop until out duration is reached)
2023-02-21 08:10:06 -05:00
- extra audio source, has priority over audio from video (experimental *)
2022-10-14 04:40:35 -04:00
- [multiple audio tracks ](/docs/multi_audio.md ) (experimental *)
2023-02-03 06:38:16 -05:00
- [custom filters ](/docs/custom_filters.md ) globally in config, or in playlist for specific clips
2022-10-02 16:05:01 -04:00
- import playlist from text or m3u file, with CLI or frontend
2023-02-03 06:38:16 -05:00
- audio only, for radio mode (experimental *)
2023-02-21 08:10:06 -05:00
- [Piggyback Mode ](/ffplayout-api/README.md#piggyback-mode ), mostly for non Linux systems (experimental *)
2018-01-07 07:58:45 -05:00
2022-07-24 13:23:52 -04:00
For preview stream, read: [/docs/preview_stream.md ](/docs/preview_stream.md )
2023-02-03 06:38:16 -05:00
**\* Experimental features do not guarantee the same stability and may fail under unusual circumstances. Code and configuration options may change in the future.**
2022-10-14 04:40:35 -04:00
2022-07-24 13:23:52 -04:00
## **ffplayout-api (ffpapi)**
2022-07-28 04:46:55 -04:00
ffpapi serves the [frontend ](https://github.com/ffplayout/ffplayout-frontend ) and it acts as a [REST API ](/ffplayout-api/README.md ) for controlling the engine, manipulate playlists, add settings etc.
2022-06-22 15:25:30 -04:00
2022-07-24 13:23:52 -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**
2022-07-26 05:18:25 -04:00
### Install
Check [install ](docs/install.md ) for details about how to install ffplayout.
2022-04-08 06:18:29 -04:00
-----
2019-06-06 12:30:51 -04:00
2022-07-24 13:23:52 -04: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"
2022-08-31 15:22:15 -04:00
}, {
"in": 0,
"out": 890.02,
"duration": 890.02,
"source": "/Media/clip2.mp4",
"custom_filter": "eq=gamma_b=0.6:gamma_g=0.7[c_v_out]"
2019-03-12 16:13:58 -04:00
}, {
2019-03-06 09:06:06 -05:00
"in": 0,
"out": 149,
"duration": 149,
2022-08-31 15:22:15 -04:00
"source": "/Media/clip3.mp4",
2022-08-07 12:00:20 -04:00
"category": "advertisement"
2019-03-12 16:13:58 -04:00
}, {
2019-03-06 09:06:06 -05:00
"in": 0,
"out": 114.72,
"duration": 114.72,
2022-08-07 12:00:20 -04:00
"source": "/Media/image1.jpg",
}, {
"in": 0,
"out": 230.30,
"duration": 230.30,
"source": "/Media/image2.jpg",
"audio": "/Media/audio1.mp3"
2019-03-12 16:13:58 -04:00
}, {
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
```
2022-07-24 13:23:52 -04:00
## **Warning**
2023-02-03 06:38:16 -05:00
(Endless) streaming over multiple days will only work if config has a **day_start** value and the **length** value is **24 hours** . If you only need a few hours for each 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-07-24 13:23:52 -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-07-24 13:23:52 -04:00
## JSON RPC
2022-04-07 15:11:20 -04:00
2023-06-19 10:57:25 -04:00
The ffplayout engine can run a simple RPC server. A request looks like:
2022-04-07 15:11:20 -04:00
```Bash
curl -X POST -H "Content-Type: application/json" -H "Authorization: ---auth-key---" \
2023-06-19 10:57:25 -04:00
-d '{"control":"next"}' \
2022-04-07 15:11:20 -04:00
127.0.0.1:7070
```
2022-09-02 10:35:11 -04:00
At the moment this commends are possible:
2022-04-07 15:11:20 -04:00
```Bash
2023-06-19 10:57:25 -04:00
'{"media":"current"}' # get infos about current clip
'{"media":"next"}' # get infos about next clip
'{"media":"last"}' # get infos about last clip
'{"control":"next"}' # jump to next clip
'{"control":"back"}' # jump to last clip
'{"control":"reset"}' # reset playlist to old state
'{"control":"text", \
2022-06-16 12:14:58 -04:00
"message": {"text": "Hello from ffplayout", "x": "(w-text_w)/2", "y": "(h-text_h)/2", \
"fontsize": 24, "line_spacing": 4, "fontcolor": "#ffffff", "box": 1, \
2023-06-19 10:57:25 -04:00
"boxcolor": "#000000", "boxborderw": 4, "alpha": 1.0}}' # send text to drawtext filter from ffmpeg
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-07-28 04:46:55 -04:00
2023-02-03 06:38:16 -05:00
If you are in playlist mode and move backwards or forwards in time, the time shift is saved so the playlist is still in sync. Bear in mind, however, that this may make your playlist too short. If you do not reset it, it will automatically reset the next day.