A 24/7 YouTube lofi radio stream can be built by preparing compatible audio files, listing them in an FFmpeg concat manifest, and sending the resulting programme to YouTube Live. The manifest handles playback order; it does not make mismatched files compatible or supervise a failed process for you.
Plan the visual, normalise the media where needed, test transitions locally, then configure YouTube’s ingest settings for your chosen resolution and frame rate. For continuous operation, you also need a way to observe the encoder and connection and decide what to do when either stops behaving as expected.
Plan the lofi audio and visual elements
Start with the shape of the programme rather than the FFmpeg command. Decide which tracks belong in the rotation, whether order matters, and whether the stream uses a single static image, a seamless visual loop, or prepared video segments. These choices affect which media inputs and mappings you need, so settle them before building an output command.
Make a working inventory of the files. Record each path, expected duration, audio format, and any known problem such as an unusually quiet master, a long silence, or a track with a different sample rate. Listen across the intended sequence, not only to individual tracks: a playlist can contain technically playable files but still have abrupt changes in loudness or mood at each transition. For a practical check on level consistency, see this guide to normalising podcast volume before streaming episodes to YouTube; the same listening discipline helps with a music rotation.
Treat visual and audio planning separately. A static cover image is operationally simpler than a sequence of video clips, but still requires you to create a video stream at the output frame rate. A moving loop or animated scene can make the broadcast feel less static, though it adds input files and may increase encoding work. Do not assume a single FFmpeg command will suit all three approaches: the required input options, filters and stream mapping depend on the assets and the FFmpeg build you have installed.
Confirm that you have the rights needed for the music and visual material you intend to broadcast. A technically valid stream is not evidence that you have permission to use its contents. YouTube’s current policies and Live Control Room notices are the places to check for applicable platform requirements; do not rely on an encoder setting to answer rights questions.
Check and prepare consistent media
The concat demuxer reads files in sequence and adjusts timestamps, but it is not a general-purpose normaliser. FFmpeg’s concat demuxer documentation requires the files to have the same streams and compatible properties, including codecs and time bases. If one track differs, a playlist that works for most files may still fail or behave badly at that boundary.
Inspect the inputs before concatenating them. Check that each file opens, that its intended audio stream is present, and that the set has a consistent stream layout and encoding where the demuxer requires it. When the material does not match, prepare a consistent intermediate set or use a filter-and-re-encode workflow. FFmpeg’s FAQ on concatenation distinguishes the demuxer route from the concat filter route used when re-encoding is needed.
There is a trade-off. The demuxer avoids re-encoding compatible inputs and is attractive when the files already meet its requirements. Normalising through re-encoding gives you more control over a mixed collection, but consumes processing time and can change the audio or video. The concat filter can also give more control over how streams are assembled, at the cost of a more involved filter graph. Choose based on the actual inputs, not on a presumption that one route is always best.
For an audio-first channel, keeping the lofi audio as the playlist and creating or looping the visual separately can simplify the content plan. It does not remove the need to map the streams deliberately: verify that the final output includes the audio and the video you meant to send. If audio sample rates, channel layouts or video properties vary, deal with that during preparation rather than treating a concat manifest as a conversion step.
Listen for consistent perceived level as well as checking file properties. A technically compatible set can still jump in volume from one track to the next. If you adjust gain, retain a version of the originals and audition the whole sequence, including its quietest and loudest transitions. A lofi station often depends on an even background level; clipping or a sudden level change can be more distracting than a small difference in codec details.
Create the FFmpeg concat manifest
A concat manifest is a text file that names the files, in the order you want them played. A minimal example looks like this:
ffconcat version 1.0
file '/media/lofi/track-001.mp3'
file '/media/lofi/track-002.mp3'
file '/media/lofi/track-003.mp3'
Save it in a location the FFmpeg process can read. Use paths that make sense on the machine that will run the broadcast, not just on your editing computer. If the encoder runs under a separate user account, check its permissions and confirm that the mounted directory will remain available for the duration of the run.
Pay attention to filenames that contain spaces, quotes, backslashes or other special characters. The manifest has its own quoting and escaping rules, and a path that looks obvious in a shell command may not be parsed the same way in a concat script. Consult the documentation for the FFmpeg version installed on the host, including its safe path behaviour, before relying on relative paths or unusual filenames. A small test manifest is a quicker way to catch a path problem than discovering it after starting a live session.
The demuxer uses duration information to position the next file. If a file’s reported duration is inaccurate, transitions can contain gaps, overlaps or timestamp artefacts. FFmpeg documents a duration directive for overriding a file’s stored duration when needed. Use it only after checking the actual file and observed playback; guessing a duration can replace one timing problem with another.
A manifest by itself does not automatically make the playlist repeat forever. Decide how your installed FFmpeg workflow will return to the beginning or provide another sequence, and test that behaviour before the public broadcast. The exact loop arrangement can depend on whether you use a demuxer input, a filter graph or a wrapper process. Avoid copying an untested one-line command from a different asset layout: input options and stream mapping are not interchangeable.
For a repeatable run, keep the manifest readable and maintainable. Use predictable filenames, put the files in a known directory, and update the playlist in a controlled way rather than editing it while an encoder is actively reading it. A short local test with the same manifest and account permissions can reveal missing paths, quoting mistakes and unreadable files before YouTube is involved.
Configure the YouTube Live output
Create or select the broadcast in YouTube Live Control Room, then obtain the stream URL and key for the encoder. Keep the key private: YouTube describes it as functioning like a password and address for the stream. Do not place it in a public repository, screenshot, shared log or script that other people can read. If you believe it has been exposed, reset it in Live Control Room and update the encoder configuration.
Choose output settings against the intended resolution and frame rate. YouTube’s live encoder settings and bitrate guidance lists supported transport and encoder options, including RTMP or RTMPS, H.264, H.265/HEVC or AV1 video, and AAC or MP3 audio. It recommends constant bitrate encoding and a two-second keyframe interval, with a maximum interval of four seconds. Consult YouTube’s current bitrate table for the specific codec, resolution and frame rate you are sending; there is no single bitrate that is right for every lofi stream.
RTMPS is YouTube’s recommended encrypted transport. Make sure the chosen URL, output codec and stream settings agree with the current instructions in Live Control Room. If you use a command template, treat it as a starting point with explicit assumptions: which inputs provide audio and video, whether those streams are copied or transcoded, and what resolution and frame rate you intend to send. A command that is suitable for a static image with audio is not automatically suitable for a prepared video playlist.
Keep credentials separate from the media manifest. Where possible, store the stream key in a private configuration mechanism rather than embedding it in a script that may be copied or logged. Check that diagnostic output does not reveal it. This is an operational precaution, not a promise that every logging arrangement will conceal secrets automatically.
The YouTube settings page should be rechecked before a deployment, since available guidance can change. Do not choose a codec or bitrate merely because it worked on another channel: confirm it is supported for your selected output, then verify YouTube receives a healthy signal in the live dashboard. The target is a stable, valid feed for your actual media and connection, not the largest output setting the encoder can produce.
Test playback and playlist transitions
Run a local decode or short test output before pointing the encoder at the live broadcast. Check that each listed track opens and that audio remains present as files change. Listen to the joins, including the end of the last track and the return to the first if you are looping. Pay attention to silence, clicks, abrupt level changes and any point where the output loses audio.
Test with the same kind of motion and audio that the live programme will use. YouTube explicitly advises testing before going live with audio and video movement similar to the real broadcast. If your channel uses a static image, test the actual image and audio path; if it uses a moving scene, include representative movement. A test with a silent placeholder does not tell you whether a real playlist will stay in sync or produce the expected signal.
Then run a private or otherwise suitable YouTube test according to the controls available to your channel. Confirm that Live Control Room reports the intended video and audio, and check its stream-health messages. A local FFmpeg exit code alone cannot show whether YouTube is receiving the signal correctly. Conversely, a dashboard preview at one moment cannot prove that every file later in a long playlist is readable.
Test recovery deliberately but safely before relying on the setup. For example, observe what the operator sees if the process exits or the network is interrupted during a test, and establish how the encoder will be restarted and how the broadcast will be checked afterwards. Do not simulate failures during a public programme unless you have a clear plan for the impact. The goal is to learn which alerts and controls are available, not to claim the test guarantees future continuity.
Use the test to validate timing and the whole route from media to audience. For more on interpreting audio warnings and checking a music channel’s output, the guide to YouTube stream health warnings and loudness checks covers checks that are relevant beyond the initial setup.
Choose compute and connectivity for your circumstances
There is no universal host specification for a 24/7 lofi stream. The resources you need depend on whether you copy compatible media or re-encode it, the selected output resolution and frame rate, how much visual processing you use, and what else is running on the machine. Test your actual workflow and watch resource use under representative conditions before choosing a machine or hosted environment.
A local computer gives you direct access to the media library and physical control. It also depends on the computer staying on, the operating system not interrupting the process, and the local power and internet connection remaining usable. A hosted machine can separate the broadcast from your desk computer, but it introduces its own costs, access arrangements and network path. Neither choice is automatically more reliable for every operator; the useful question is which one you can monitor and recover when something fails.
Estimate upload capacity from the selected stream bitrate and leave room for other traffic and variation on the connection. YouTube’s streaming tips recommend leaving 20% headroom in the relevant bandwidth calculation. This is guidance for planning, not a guarantee that a particular broadband connection will remain stable. If other devices share the upload, account for that use rather than treating the advertised package speed as dedicated encoder capacity.
A 24/7 channel is an operating process, not just a media command. Decide where the files and manifest live, how logs are retained, who receives an alert if the encoder stops or output stalls, and who can act on that alert. A restart policy can bring back an exited process, but it does not by itself confirm that YouTube has accepted the feed or that audio has resumed. Include a check after restart.
For an FFmpeg-specific walkthrough of scheduling and process automation, see how to automate a 24/7 YouTube stream with FFmpeg. Treat automation as one part of the plan: it can reduce manual repetition, while monitoring and a recovery procedure handle the cases automation cannot interpret.
If maintaining a host, library access, process supervision and connection recovery yourself is the particular pain point, StreamNeo can take that ongoing computer-off operation out of your hands: you upload the file, supply your YouTube stream key, and the broadcast runs from the cloud with monitoring and automatic restart if it drops. It is YouTube-only, and you still need to prepare the content and check your channel’s setup.
Before committing, compare the operating options on the pricing page. When the file and channel are ready, start free — 24-hour trial, no card.
FAQ
How do I make a 24/7 lofi radio stream on YouTube?
Prepare a compatible set of audio files, list them in a concat workflow, provide a suitable video input, and send the mapped output to YouTube Live using its current ingest guidance. Then test the whole programme and arrange monitoring and recovery for the process and connection. The playlist command is only one part of keeping a continuous channel operating.
Can I loop an FFmpeg concat playlist?
You can arrange a playlist workflow to repeat, but a basic manifest only describes files and their order; it is not, by itself, proof of a working infinite loop. The repeat mechanism depends on the way you construct the FFmpeg inputs or surrounding process. Test the last-to-first transition locally and in a suitable YouTube test before relying on it.
Why does FFmpeg concat fail when my files have different formats?
The concat demuxer expects matching streams and compatible properties; it does not convert each file into a common format as it reads. Prepare consistent intermediate files or use a concat-filter workflow that re-encodes as appropriate. Check the FFmpeg documentation and inspect the actual streams when diagnosing a failure.
What bitrate should I use for YouTube Live?
Use YouTube’s current bitrate table for the codec, resolution and frame rate you have selected. A value suitable for one output is not a universal recommendation for another. Test the resulting feed and leave upload headroom for network variation and other traffic.