add some more docs

This commit is contained in:
jb-alvarado 2022-04-14 16:13:38 +02:00
parent 11c577aff5
commit e198b18c64
7 changed files with 143 additions and 50 deletions

25
Cargo.lock generated
View File

@ -192,9 +192,9 @@ dependencies = [
[[package]] [[package]]
name = "ffprobe" name = "ffprobe"
version = "0.3.0" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f439d57070a29c93e5bdf9f98b973360aa96b1b8c203793de54482f168fc216a" checksum = "e52fe7c1991d1d0f77383e9f3e584860a2e916fa22b834176b84a411fac7107a"
dependencies = [ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
@ -224,9 +224,9 @@ dependencies = [
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.22" version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"crc32fast", "crc32fast",
@ -459,9 +459,9 @@ dependencies = [
[[package]] [[package]]
name = "httparse" name = "httparse"
version = "1.6.0" version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba"
[[package]] [[package]]
name = "httpdate" name = "httpdate"
@ -651,9 +651,9 @@ dependencies = [
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.122" version = "0.2.123"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec647867e2bf0772e28c8bcde4f0d19a9216916e890543b5a03ed8ef27b8f259" checksum = "cb691a747a7ab48abc15c5b42066eaafde10dc427e3b6ee2a1cf43db04c763bd"
[[package]] [[package]]
name = "linked-hash-map" name = "linked-hash-map"
@ -712,12 +712,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.4.4" version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082"
dependencies = [ dependencies = [
"adler", "adler",
"autocfg",
] ]
[[package]] [[package]]
@ -1375,9 +1374,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.24" version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee" checksum = "6dfce9f3241b150f36e8e54bb561a742d5daa1a47b5dd9a5ce369fd4a4db2210"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
] ]

View File

@ -16,12 +16,13 @@ The main purpose of ffplayout is to provide a 24/7 broadcasting solution that pl
- have all values in a separate config file - have all values in a separate config file
- dynamic playlist - dynamic playlist
- replace missing playlist or clip with a dummy clip - replace missing playlist or clip with a dummy clip
- playing clips from [watched folder](https://github.com/ffplayout/ffplayout_engine/wiki/Watch-Folder) - playing clips in [watched](/docs/folder_mode.md) folder mode
- send emails with error message - send emails with error message
- overlay a logo - overlay a logo
- overlay text, controllable through [messenger](https://github.com/ffplayout/messenger) or [ffplayout-frontend](https://github.com/ffplayout/ffplayout-frontend) (needs ffmpeg with libzmq) - overlay text, controllable through [messenger](https://github.com/ffplayout/messenger) or [ffplayout-frontend](https://github.com/ffplayout/ffplayout-frontend) (needs ffmpeg with libzmq)
- EBU R128 loudness normalization (single pass) - EBU R128 loudness normalization (single pass)
- loop playlist infinitely - loop playlist infinitely
- [remote source](/docs/remote_source.md)
- trim and fade the last clip, to get full 24 hours - 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 - 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 - set custom day start, so you can have playlist for example: from 6am to 6am, instate of 0am to 12pm
@ -37,11 +38,12 @@ The main purpose of ffplayout is to provide a 24/7 broadcasting solution that pl
- **aevalsrc** (if video have no audio) - **aevalsrc** (if video have no audio)
- **apad** (add silence if audio duration is to short) - **apad** (add silence if audio duration is to short)
- **tpad** (add black frames if video duration is to short) - **tpad** (add black frames if video duration is to short)
- output: - [output](/docs/output.md):
- **stream** - **stream**
- **desktop** - **desktop**
- **HLS** - **HLS**
- JSON RPC server, for getting infos about current playing and controlling. - JSON RPC server, for getting infos about current playing and controlling
- [live ingest](/docs/live_ingest.md)
Requirements Requirements
----- -----
@ -79,38 +81,18 @@ JSON Playlist Example
"in": 0, "in": 0,
"out": 2531.36, "out": 2531.36,
"duration": 2531.36, "duration": 2531.36,
"source": "/Media/clip4.mp4", "source": "https://example.org/big_buck_bunny.webm",
"category": "" "category": ""
} }
] ]
} }
``` ```
**If you need a simple playlist generator check:** [playlist-generator](https://github.com/ffplayout/playlist-generator)
**Warning** **Warning**
----- -----
(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. (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.
Remote source from URL
-----
You can use sources from remote URL in that way:
```json
{
"in": 0,
"out": 149,
"duration": 149,
"source": "https://example.org/big_buck_bunny.webm"
}
```
But be careful with it, better test it multiple times!
More informations in [Wiki](https://github.com/ffplayout/ffplayout_engine/wiki/Remote-URL-Source)
----- -----
HLS output HLS output
@ -195,22 +177,28 @@ Start with Arguments
ffplayout also allows the passing of parameters: ffplayout also allows the passing of parameters:
- `-c, --config <CONFIG>` file path to ffplayout.conf ```
- `-f, --folder <FOLDER>` play folder content OPTIONS:
- `-h, --help` Print help information -c, --config <CONFIG> File path to ffplayout.conf
- `-i, --infinit` loop playlist infinitely -f, --folder <FOLDER> Play folder content
- `-l, --log <LOG>` file path for logging -g, --generate <YYYY-MM-DD>... Generate playlist for date. Date-range is possible, like:
- `-m, --play-mode <PLAY_MODE>` playing mode: folder, playlist 2022-01-01 - 2022-01-10.
- `-o, --output <OUTPUT>` set output mode: desktop, hls, stream -h, --help Print help information
- `-p, --playlist <PLAYLIST>` path from playlist -i, --infinit Loop playlist infinitely
- `-s, --start <START>` start time in 'hh:mm:ss', 'now' for start with first -l, --log <LOG> File path for logging
- `-t, --length <LENGTH>` set length in 'hh:mm:ss', 'none' for no length check -m, --play-mode <PLAY_MODE> Playing mode: folder, playlist
- `-v, --volume <VOLUME>` set audio volume -o, --output <OUTPUT> Set output mode: desktop, hls, stream
- `-V, --version` Print version information -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
```
You can run the command like: You can run the command like:
```Bash ```Bash
./ffplayout.py -l none -p ~/playlist.json -o desktop ./ffplayout -l none -p ~/playlist.json -o desktop
``` ```

View File

@ -46,6 +46,7 @@ echo ""
cargo deb --target=x86_64-unknown-linux-musl cargo deb --target=x86_64-unknown-linux-musl
mv ./target/x86_64-unknown-linux-musl/debian/ffplayout-engine_${version}_amd64.deb . mv ./target/x86_64-unknown-linux-musl/debian/ffplayout-engine_${version}_amd64.deb .
echo ""
echo "Create rhel package" echo "Create rhel package"
echo "" echo ""

10
docs/folder_mode.md Normal file
View File

@ -0,0 +1,10 @@
### Folder Mode
ffplayout can play files from a folder, no playlists are required for this mode. This folder is monitored for changes, and when new files are added or deleted, this is registered and updated accordingly.
You just have to set `mode: folder` in the config under `processing:` and under `storage:` you have to enter the correct folder and the file extensions you want to scan for.
Additionally there is a **shuffle** mode, if this is activated, the files will be played randomly.
If shuffle mode is off, the clips will be played in sorted order.

21
docs/live_ingest.md Normal file
View File

@ -0,0 +1,21 @@
### Live Ingest
With live ingest you have the possibility to switch from playlist, or folder mode to a live stream.
It works in a way, that it crate a ffmpeg instance in _listen_ (_server_) mode. For example when you stream over RTMP to it, you can set the ingest input parameters to:
```
-f live_flv -listen 1 -i rtmp://localhost:1936/live/stream
```
Have in mind, that the ingest mode **can't** pull from a server, it only can act as its own server and listen for income.
When it notice a incoming stream, it will stop the playlist playing and continue the live source. The output will not interrupt, so you have a continuously output stream.
In rare cases it can happen, that for a short moment after switching the image freezes, but then it will continue. Also a short frame flickering can happen.
You need to know, that **ffmpeg in current version has no authentication mechanism and it just listen to the protocol and port (no path or app name).**
For security you should not expose the ingest to the world. You localhost only, with an relay/reverse proxy where you can make your authentication. You could also use a [patch](https://gist.github.com/jb-alvarado/f8ee1e7a3cf5e482e818338f2b62c95f) for ffmpeg, but there is no guarantee if this really works.
In theory you can use every [protocol](https://ffmpeg.org/ffmpeg-protocols.html) from ffmpeg which support a **listen** mode.

57
docs/output.md Normal file
View File

@ -0,0 +1,57 @@
ffplayout supports different types of outputs, let's explain them a bit:
## Stream
The streaming output can be used for ever kind of classical streaming. For example for **rtmp, srt, rtp** etc. Every streaming type, which are supported from ffmpeg should be working
### Multiple Outputs:
If you would like to have multiple outputs, you can add you settings to `output_param:` like:
```yam
...
output_param: >-
...
-flags +global_header
-f flv rtmp://127.0.0.1/live/big
-s 1280x720
-c:v libx264
-crf 23
-x264-params keyint=50:min-keyint=25:scenecut=-1
-maxrate 2400k
-bufsize 4800k
-preset medium
-profile:v Main
-level 3.1
-c:a aac
-ar 44100
-b:a 128k
-flags +global_header
-f flv rtmp://127.0.0.1/live/middle
-s 640x360
-c:v libx264
-crf 23
-x264-params keyint=50:min-keyint=25:scenecut=-1
-maxrate 600k
-bufsize 1200k
-preset medium
-profile:v Main
-level 3.1
-c:a aac
-ar 44100
-b:a 128k
-flags +global_header
-f flv rtmp://127.0.0.1/live/small
```
## Desktop
In desktop mode you will get your picture on screen. For this you need a desktop system, theoretical all platforms should work here. ffplayout will need for that **ffplay**.
## HLS
In this mode you can output directly to a hls playlist. The nice thing here is, that ffplayout need less resources then in streaming mode.
#### Activating Output
To use one of the outputs you need to edit the **ffplayout.yml** config, here under **out** set your **mode** and use the different **output** options.

17
docs/remote_source.md Normal file
View File

@ -0,0 +1,17 @@
### Video from URL
Videos from URL are videos where you can watch directly in browser or download, for example:
```json
{
"in": 0,
"out": 149,
"duration": 149,
"source": "https://example.org/big_buck_bunny.webm"
}
```
This should work in general, because most time it have a duration information and it is faster playable then a real live stream source. Avoid seeking because it can take to much time.
**Live streams as input in playlist, like rtmp is not supported.**
Be careful with it, better test it multiple times!