Go to file
2023-11-04 22:27:04 +01:00
.github Update rust.yml 2023-11-01 18:07:10 +00:00
assets update frontend, set audio_copy default to false 2023-08-07 13:06:37 +02:00
debian embed static files from frontend in ffpapi, add db path argument 2023-10-31 23:43:33 +01:00
docker format text 2023-06-21 08:17:09 +02:00
docs embed static files from frontend in ffpapi, add db path argument 2023-10-31 23:43:33 +01:00
ffplayout-api conditional embed frontend 2023-11-02 21:29:14 +01:00
ffplayout-engine Use enum for Role everywhere, fix time shift, fix #433, get config also as normal user 2023-11-02 13:40:56 +01:00
ffplayout-frontend@8f615c3582 Use enum for Role everywhere, fix time shift, fix #433, get config also as normal user 2023-11-02 13:40:56 +01:00
lib inject filler to current list, when clip not exist 2023-10-17 15:13:53 +02:00
scripts cleanup, update version 2023-11-04 22:26:36 +01:00
tests remove openssl dependency, remove TLS debug log messages, fix program hang when mail sending not work 2023-10-13 08:20:35 +02:00
.gitignore generate playlists based on template, serialize paths to PathBuf 2023-09-05 14:46:32 +02:00
.gitmodules Update .gitmodules 2023-11-01 18:11:52 +00:00
Cargo.lock cleanup, update version 2023-11-04 22:26:36 +01:00
Cargo.toml cleanup, update version 2023-11-04 22:26:36 +01:00
CHANGELOG.md Update CHANGELOG.md 2023-10-22 20:16:13 +02:00
CONTRIBUTING.md change from issue to discussions 2022-11-11 11:40:33 +01:00
LICENSE add LICENSE 2022-04-14 17:10:59 +02:00
README.md cleanup 2023-10-01 13:04:44 +02:00

ffplayout

License: GPL v3

ffplayout-engine (ffplayout)

ffplayout 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.

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.

Check the releases for pre compiled version.

Features

  • have all values in a separate config file
  • dynamic playlist
  • replace missing playlist or clip with single filler or multiple fillers from folder, if no filler exists, create dummy clip
  • playing clips in watched folder mode
  • send emails with error message
  • overlay a logo
  • overlay text, controllable through ffplayout-frontend (needs ffmpeg with libzmq and enabled JSON RPC server)
  • loop playlist infinitely
  • remote source
  • trim and fade the last clip, to get full 24 hours
  • when playlist is not 24 hours long, loop fillers 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
  • log to files or color output to console
  • add filters to input, if is necessary to match output stream:
    • 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)
  • output:
    • stream
    • desktop
    • HLS
    • null (for debugging)
  • JSON RPC server, to get information about what is playing and to control it
  • live ingest
  • image source (will loop until out duration is reached)
  • extra audio source, has priority over audio from video (experimental *)
  • multiple audio tracks (experimental *)
  • Stream Copy mode (experimental *)
  • custom filters globally in config, or in playlist for specific clips
  • import playlist from text or m3u file, with CLI or frontend
  • audio only, for radio mode (experimental *)
  • Piggyback Mode, mostly for non Linux systems (experimental *)
  • generate playlist based on template (experimental *)

For preview stream, read: /docs/preview_stream.md

* Experimental features do not guarantee the same stability and may fail under unusual circumstances. Code and configuration options may change in the future.

ffplayout-api (ffpapi)

ffpapi serves the frontend and it acts as a REST API for controlling the engine, manipulate playlists, add settings etc.

Requirements

  • RAM and CPU depends on video resolution, minimum 4 threads and 3GB RAM for 720p are recommend
  • ffmpeg v5.0+ and ffprobe (ffplay if you want to play on desktop)
  • if you want to overlay text, ffmpeg needs to have libzmq

Install

Check install for details about how to install ffplayout.


JSON Playlist Example

{
    "channel": "Test 1",
    "date": "2019-03-05",
    "program": [{
            "in": 0,
            "out": 647.68,
            "duration": 647.68,
            "source": "/Media/clip1.mp4"
        }, {
            "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]"
        }, {
            "in": 0,
            "out": 149,
            "duration": 149,
            "source": "/Media/clip3.mp4",
            "category": "advertisement"
        }, {
            "in": 0,
            "out": 114.72,
            "duration": 114.72,
            "source": "/Media/image1.jpg",
        }, {
            "in": 0,
            "out": 230.30,
            "duration": 230.30,
            "source": "/Media/image2.jpg",
            "audio": "/Media/audio1.mp3"
        }, {
            "in": 0,
            "out": 2531.36,
            "duration": 2531.36,
            "source": "https://example.org/big_buck_bunny.webm",
            "category": ""
        }
    ]
}

Warning

(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.


HLS output

For outputting to HLS, output parameters should look like:

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        

JSON RPC

The ffplayout engine can run a simple RPC server. A request looks like:

curl -X POST -H "Content-Type: application/json" -H "Authorization: ---auth-key---" \
    -d '{"control":"next"}' \
    127.0.0.1:7070

At the moment this commends are possible:

'{"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", \
  "message": {"text": "Hello from ffplayout", "x": "(w-text_w)/2", "y": "(h-text_h)/2", \
  "fontsize": 24, "line_spacing": 4, "fontcolor": "#ffffff", "box": 1, \
  "boxcolor": "#000000", "boxborderw": 4, "alpha": 1.0}}' # send text to drawtext filter from ffmpeg

Output from {"media":"current"} show:

{
    "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"
}

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.