Skip to content

Instantly share code, notes, and snippets.

@BusterNeece
Last active January 16, 2025 06:52
Show Gist options
  • Save BusterNeece/5dbfb4dbc1846055c9ab07a7c685899c to your computer and use it in GitHub Desktop.
Save BusterNeece/5dbfb4dbc1846055c9ab07a7c685899c to your computer and use it in GitHub Desktop.
Liquidsoap 2.1 Video Stream with HLS
# What is This Script?
# This script allows you to broadcast your AzuraCast radio signal to a remote video stream, using a
# static video file that loops in the background and dynamically writing the currently playing track
# on top of that video file.
#
# This script replaces the previous "radio-video-stream" project, allowing you to manage files directly from
# within AzuraCast and not requiring any changes to your Docker configuration at all.
#
# To use this script, you must be running at least AzuraCast 0.19.0 or a later Rolling Release version.
#
# Before Using This Script:
# - Upload a video file to a folder under your station's media library (in the example below, named "videostream")
# - Choose a font to display Now Playing data and upload a TTF version of that font to the same folder
#
# How to Use This Script
# - Copy the section below.
# - Visit your station's "Edit Liquidsoap Configuration" section (under "Broadcasting" in newer versions)
# - Paste the code into the bottom-most configuration section
# - Customize as necessary with your station's media directory and font specifications
# - Click "Save Changes" and then "Restart Broadcasting"
# - Enjoy!
#
# VIDEO STREAM
#
# Edit This: Station Base Directory
station_base_dir = "/var/azuracast/stations/station_name"
# Edit This: YouTube Stream Key
youtube_key = "abcd-1234-abcd-1234"
# Path to the video file that will loop behind the Now Playing text (you have to provide this)
video_file = station_base_dir ^ "/media/videostream/video.mp4"
# Path to a font (TTF) file that will be used to draw the Now Playing text (you have to provide this)
font_file = station_base_dir ^ "/media/videostream/font.ttf"
# A static file auto-generated by AzuraCast in the "config" dir.
nowplaying_file = station_base_dir ^ "/config/nowplaying.txt"
# Align text
font_size = "50"
font_x = "340"
font_y = "990"
font_color = "white"
# Method to overlay now playing text
def add_nowplaying_text(s) =
def mkfilter(graph)
let {video = video_track} = source.tracks(s)
video_track = ffmpeg.filter.video.input(graph, video_track)
video_track = ffmpeg.filter.drawtext(fontfile=font_file,fontsize=font_size,x=font_x,y=font_y,fontcolor=font_color,textfile=nowplaying_file,reload=5,graph,video_track)
video_track = ffmpeg.filter.video.output(graph, video_track)
source({
video = video_track
})
end
ffmpeg.filter.create(mkfilter)
end
videostream = single(video_file)
videostream = add_nowplaying_text(videostream)
videostream = source.mux.video(video=videostream, radio)
# Output to YouTube
enc = %ffmpeg(
format="mpegts",
%video.raw(codec="libx264", pixel_format="yuv420p", b="300k", preset="superfast", r=25, g=50),
%audio(
codec="aac",
samplerate=44100,
channels=2,
b="96k",
profile="aac_low"
)
)
output.youtube.live.hls(key=youtube_key, fallible=true, encoder=enc, videostream)
@aryanbt
Copy link

aryanbt commented Nov 23, 2024

This works perfect for me. But getting bit rate issue (Warning
The stream's current bitrate (597.48 Kbps) is lower than the recommended bitrate. We recommend that you use a stream bitrate of 2500 Kbps.) How can I set bit rate?

@acleitao-projects
Copy link

dude do you know how F* great is this ? thx so much for the script

@acleitao-projects
Copy link

@aryanbt... you see the b=300k? thats the video bitrate, and the audio is the b=96k... this is what I am using right now

Output to YouTube

enc = %ffmpeg(
format="mpegts",
%video.raw(codec="libx264", pixel_format="yuv420p", b="2000k", preset="superfast", r=25, g=50),
%audio(
codec="aac",
samplerate=44100,
channels=2,
b="192k",
profile="aac_low"
)
)

Hope it helps

@aryanbt
Copy link

aryanbt commented Nov 28, 2024

@aryanbt... you see the b=300k? thats the video bitrate, and the audio is the b=96k... this is what I am using right now

Output to YouTube

enc = %ffmpeg( format="mpegts", %video.raw(codec="libx264", pixel_format="yuv420p", b="2000k", preset="superfast", r=25, g=50), %audio( codec="aac", samplerate=44100, channels=2, b="192k", profile="aac_low" ) )

Hope it helps

Thanks a lot it works great.

@viaviktor
Copy link

Can someone please share a link to a live example? I'm planning to implement that this year some time.. Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment