diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..abfe935 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,38 @@ +--- +version: '3.6' + +services: + owncast: + container_name: "owncast_server" + image: "gabekangas/owncast:latest" + entrypoint: sh /app/run-server.sh + restart: unless-stopped + volumes: + - ./run-server.sh:/app/run-server.sh + - ./owncast-data:/app/data + networks: + - ffplayout-network + ports: + - "8080:8080" + ffplayout: + container_name: ffplayout + build: ffplayout/. + volumes: + - "./ffplayout/ffplayout.yml:/etc/ffplayout/ffplayout.yml" + - "./logs:/logs" + - "./video:/video" + - "/etc/localtime:/etc/localtime:ro" + - "/etc/timezone:/etc/timezone:ro" + # - "./logo.png:/usr/share/ffplayout/logo.png:ro" + depends_on: + - owncast + networks: + - ffplayout-network + ports: + - "8787:8787" + restart: unless-stopped + +networks: + ffplayout-network: + name: ffplayout-network + driver: bridge diff --git a/ffplayout/Dockerfile b/ffplayout/Dockerfile new file mode 100644 index 0000000..13bf24b --- /dev/null +++ b/ffplayout/Dockerfile @@ -0,0 +1,12 @@ +FROM ubuntu:latest + +ENV DEBIAN_FRONTEND=noninteractive + +COPY ffplayout_0.24.0-rc3-1_amd64.deb /tmp + +RUN apt update && apt-get install -y ffmpeg +RUN apt install -y /tmp/ffplayout_0.24.0-rc3-1_amd64.deb + +EXPOSE 8787 + +CMD [ "/bin/ffplayout", "-i", "--log", "/logs", "--folder", "/video", "--play-mode", "folder", "--config", "/etc/ffplayout/ffplayout.yml"] \ No newline at end of file diff --git a/ffplayout/ffplayout.yml b/ffplayout/ffplayout.yml new file mode 100644 index 0000000..d68d6c8 --- /dev/null +++ b/ffplayout/ffplayout.yml @@ -0,0 +1,142 @@ +general: + help_text: Sometimes it can happen, that a file is corrupt but still playable, + this can produce an streaming error over all following files. The only way + in this case is, to stop ffplayout and start it again. Here we only say when + it stops, the starting process is in your hand. Best way is a systemd service + on linux. 'stop_threshold' stop ffplayout, if it is async in time above this + value. A number below 3 can cause unexpected errors. + stop_threshold: 11 + +rpc_server: + help_text: Run a JSON RPC server, for getting infos about current playing and + for some control functions. + enable: true + address: 127.0.0.1:7070 + authorization: av2Kx8g67lF9qj5wEH3ym1bI4cCs + +mail: + help_text: + Send error messages to email address, like missing playlist; invalid + json format; missing clip path. Leave recipient blank, if you don't need this. + 'mail_level' can be INFO, WARNING or ERROR. 'interval' means seconds until + a new mail will be sended. + subject: Playout Error + smtp_server: mail.example.org + starttls: true + sender_addr: ffplayout@example.org + sender_pass: "abc123" + recipient: + mail_level: ERROR + interval: 30 + +logging: + help_text: + If 'log_to_file' is true, log to file, when is false log to console. + 'backup_count' says how long log files will be saved in days. 'local_time' to + false will set log timestamps to UTC. Path to /var/log/ only if you run this + program as daemon. 'log_level' can be DEBUG, INFO, WARNING, ERROR. + 'ffmpeg_level' can be info, warning, error. + log_to_file: true + backup_count: 7 + local_time: true + timestamp: true + log_path: /var/log/ffplayout/ + log_level: DEBUG + ffmpeg_level: error + +processing: + help_text: + Default processing for all clips, to have them unique. Mode can be playlist + or folder. 'aspect' must be a float number. 'logo' is only used if the path exist. + 'logo_scale' scale the logo to target size, leave it blank when no scaling + is needed, format is 'number:number', for example '100:-1' for proportional + scaling. With 'logo_opacity' logo can become transparent. With 'logo_filter' + 'overlay=W-w-12:12' you can modify the logo position. With 'use_loudnorm' + you can activate single pass EBU R128 loudness normalization. 'loud_*' can + adjust the loudnorm filter. With 'custom_filter' it is possible, to apply further + filters. The filter outputs should end with [c_v_out] for video filter, + and [c_a_out] for audio filter. + mode: playlist + width: 1024 + height: 576 + aspect: 1.778 + fps: 25 + add_logo: true + logo: /usr/share/ffplayout/logo.png + logo_scale: + logo_opacity: 0.7 + logo_filter: overlay=W-w-12:12 + add_loudnorm: false + loudnorm_ingest: false + loud_i: -18 + loud_tp: -1.5 + loud_lra: 11 + volume: 1 + custom_filter: + +ingest: + help_text: + Run a server for a ingest stream. This stream will override the normal streaming + until is done. There is only a very simple authentication mechanism, which check if the + stream name is correct. + enable: false + input_param: -f live_flv -listen 1 -i rtmp://127.0.0.1:1936/live/stream + +playlist: + help_text: > + 'path' can be a path to a single file, or a directory. For directory put + only the root folder, for example '/playlists', subdirectories are read by the + script. Subdirectories needs this structure '/playlists/2018/01'. 'day_start' + means at which time the playlist should start, leave day_start blank when playlist + should always start at the begin. 'length' represent the target length from + playlist, when is blank real length will not consider. 'infinit: true' works with + single playlist file and loops it infinitely. + path: /var/lib/ffplayout/playlists + day_start: "5:59:25" + length: "24:00:00" + infinit: false + +storage: + help_text: Play ordered or randomly files from path. 'filler_clip' is for fill + the end to reach 24 hours, it will loop when is necessary. 'extensions' search + only files with this extension. Set 'shuffle' to 'true' to pick files randomly. + path: "/var/lib/ffplayout/tv-media" + filler_clip: "/var/lib/ffplayout/tv-media/filler/filler.mp4" + extensions: + - "mp4" + - "mkv" + shuffle: true + +text: + help_text: + Overlay text in combination with libzmq for remote text manipulation. + On windows fontfile path need to be like this 'C\:/WINDOWS/fonts/DejaVuSans.ttf'. + 'text_from_filename' activate the extraction from text of a filename. With 'style' + you can define the drawtext parameters like position, color, etc. Post Text over + API will override this. With 'regex' you can format file names, to get a title from it. + add_text: false + text_from_filename: false + fontfile: "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf" + style: "x=(w-tw)/2:y=(h-line_h)*0.9:fontsize=24:fontcolor=#ffffff:box=1:boxcolor=#000000:boxborderw=4" + regex: ^.+[/\\](.*)(.mp4|.mkv)$ + +out: + help_text: + The final playout compression. Set the settings to your needs. 'mode' + has the options 'desktop', 'hls', 'null', 'stream'. Use 'stream' and adjust + 'output_param:' settings when you want to stream to a rtmp/rtsp/srt/... server. + In production don't serve hls playlist with ffpapi, use nginx or another web server! + mode: stream + output_param: >- + -vcodec libx264 + -profile:v high + -g 48 + -r 24 + -sc_threshold 0 + -b:v 3000k + -preset veryfast + -c:a aac + -ar 44100 + -b:a 128k + -flags +global_header + -f flv rtmp://owncast/live/CIRpaLEipOOS diff --git a/ffplayout/ffplayout_0.24.0-rc3-1_amd64.deb b/ffplayout/ffplayout_0.24.0-rc3-1_amd64.deb new file mode 100644 index 0000000..7bd7d53 Binary files /dev/null and b/ffplayout/ffplayout_0.24.0-rc3-1_amd64.deb differ diff --git a/run-server.sh b/run-server.sh new file mode 100644 index 0000000..c673f78 --- /dev/null +++ b/run-server.sh @@ -0,0 +1 @@ +./owncast --streamkey CIRpaLEipOOS diff --git a/video/README.md b/video/README.md new file mode 100644 index 0000000..21b901a --- /dev/null +++ b/video/README.md @@ -0,0 +1 @@ +media files goes here diff --git a/video/bumper.mp4 b/video/bumper.mp4 new file mode 100644 index 0000000..2d57d7e Binary files /dev/null and b/video/bumper.mp4 differ