Skip to content
streamneo.
Comparisons12 min read

FFmpeg filter_complex vs concat demuxer for YouTube Live loops

Choose between FFmpeg’s concat demuxer and concat filter by whether you need stream copy, re-encoding or media processing.

sn.
StreamNeoPublished 4 October 2026
Worth sharing?

For a YouTube Live loop, use FFmpeg’s concat demuxer when the source files are compatible and you want to preserve their encoded streams. Use the concat filter in a -filter_complex graph when you need to process, normalize or re-encode the media.

Those are choices at different stages of the media pipeline, not alternative YouTube ingest settings. You still need to prepare an output that matches the protocol you intend to use, and test it against your actual files and FFmpeg build.

Decide whether to preserve or process

Start with the media, not the command syntax. Ask whether the clips already have the characteristics you need, whether they can be joined while retaining their encoded streams, and whether the final stream will meet the requirements of your chosen YouTube ingest method. These questions determine the concat route; the destination’s protocol is a separate decision.

If you have a set of finished devotional videos with matching properties and no need for transitions or overlays, preserving the encoded streams may be the simplest route. The demuxer can sequence suitable inputs for output without decoding and encoding the video again. That does not make every playlist suitable: the files must work as a sequence, and the output must be accepted by the muxer and ingest path you select.

If the clips need to be resized, have their audio levels adjusted, or be given a common frame rate, the filter route is more appropriate. Filters operate on decoded media, so a processed video stream normally has to be encoded for output. You gain control over the content and format at the cost of processing and an encode step.

FFmpeg’s concat FAQ draws the same basic distinction: use the concat filter when re-encoding is needed, and consider the demuxer when avoiding re-encoding. The choice is not a promise that either method works with arbitrary files. Inspect your sources and verify the resulting output.

What the concat demuxer does

A demuxer reads media from input files and presents packets to the rest of the FFmpeg pipeline. The concat demuxer treats a set of files as a sequence, so FFmpeg can read from them in order as though they were one input. It acts before decoded frames reach filters; it is not itself a video-effects tool.

That distinction explains why the demuxer is useful when you want to avoid another encode. If the inputs and output arrangement allow the encoded streams to be passed through, you can use stream copy rather than decoding and encoding the media. Stream copy is not a quality-enhancement mode: it preserves encoded data rather than applying changes to the picture or sound.

A typical playlist description names the files in order. The details of the input list and command depend on the files, paths and intended output, so do not treat a generic snippet as a universal command. A list that opens successfully is not proof that the resulting sequence will play continuously or suit YouTube ingest. Check timestamps, stream layout, audio and video behaviour, and the final output.

The demuxer also should not be confused with looping a single image or GIF. FFmpeg documents loop-related options for certain demuxers, but those behaviours are separate from concatenating a playlist of video files. If your goal is a persistent video loop, the playlist sequence and the long-running broadcast are distinct parts of the job.

For a broader view of keeping a prerecorded source on air, see how to loop a video on a YouTube Live stream. That addresses the continuous-playback problem; the concat demuxer decision is specifically about how FFmpeg joins suitable media inputs.

When the demuxer can avoid re-encoding

The practical case for the demuxer is narrow and useful: you do not need to transform the media, the inputs are suitable for concatenation, and the output can preserve the encoded streams. Under those conditions, stream copy avoids a decode-and-encode cycle. It can reduce processing work and avoids the generation loss that may accompany another lossy encode.

Compatibility is the part to prove, not assume. Similar-looking files may differ in stream properties or timestamps. Different resolutions, codecs, frame rates, audio layouts or other characteristics can make a simple stream-copy sequence unsuitable or cause problems at joins. FFmpeg’s FAQ does not supply a universal checklist that guarantees compatibility for every combination, so compare the actual inputs and test the complete sequence.

Also consider what the receiving muxer expects. Even if FFmpeg can read the playlist and copy packets, the destination format and ingest protocol may impose constraints on packaging, codecs or timing. The concat method does not convert the stream to meet those constraints. If you discover that the inputs need standardization, treat that as a reason to evaluate the filter and encoding route rather than repeatedly trying stream copy.

This is especially important for a 24/7 channel. A short test can reveal whether a join produces a pause, a timestamp problem, a brief loss of audio or an unexpected format change. Test multiple joins, including the transition from the final file back to the first if the playlist is intended to repeat. A successful start alone does not establish that the sequence behaves properly over a full cycle.

For practical continuity issues at the broadcast level, preventing OBS from stopping a 24/7 YouTube stream is a separate concern from whether FFmpeg copies or re-encodes the media. It helps to keep the source-preparation test and the always-on operating plan as two checks.

What the concat filter does

The concat filter joins decoded audio and video streams inside a filtergraph. Unlike a demuxer, a filter works on media after it has been decoded. The filter can therefore be combined with other processing steps before FFmpeg encodes the resulting output.

A filtergraph is useful when joining is only one part of the job. You might scale clips to a consistent size, adjust or map audio, add a logo, or apply another supported transformation. The graph can connect multiple inputs and outputs and express relationships that do not fit a simple one-input, one-output chain. FFmpeg’s complex filtergraph documentation explains that -filter_complex is used for graphs that cannot be represented as a simple linear chain, including graphs with multiple inputs or outputs.

The price of that flexibility is processing. FFmpeg has to decode the media for the filters, and a transformed video stream generally needs encoding to be written as a new compressed stream. That takes compute and introduces another encoding decision: codec, quality or rate control, and output parameters must be chosen for the delivery format. Audio may also need re-encoding if you process or change it, though individual streams can be handled differently when the graph and output mapping allow it.

Do not choose -filter_complex merely because its name sounds more complete. A filtergraph is not a complete live-stream configuration, and it does not automatically make incompatible input content consistent. You must specify what the graph should do, what streams it should produce, and how those streams will be encoded and muxed for the destination.

Choose the filter for re-encoding or normalization

The filter route makes sense when the files need a common output shape or when the programme needs effects. For example, if one clip is a wide landscape video and another has a different frame size, you may want to scale and pad them to a common canvas. If music clips have noticeably different loudness, you may need an audio-processing step. If an ident must appear between segments, a graph can combine the inputs and the visual element.

These are not just file-joining operations. They alter decoded media, which is why the concat filter belongs in the processing path and why an encode is normally involved. Choose settings for the actual delivery target and available processing capacity, rather than copying a preset without checking whether it fits your footage and ingest method.

A complex graph can be harder to troubleshoot than a simple sequential input. Build it in stages: first confirm each input opens, then confirm the graph outputs the intended audio and video, then encode a short test, and finally check that the output plays across joins. Keep a known-good copy of the unprocessed source files so a filter mistake does not force you to reconstruct them.

If a playlist does not need effects or normalization, the extra processing may bring no benefit. Conversely, if a clip visibly changes size or audio format at every join, preserving the original streams may preserve the inconsistency too. The right question is not whether re-encoding is bad; it is whether the result you need requires processing.

For an always-on channel, there may also be a simpler operational route than maintaining your own FFmpeg process. StreamNeo addresses the specific burden of keeping a computer on to rebroadcast a prepared video: you upload the file, provide your YouTube stream key, and the stream can run with your computer switched off. That does not decide which FFmpeg method your source files need, or replace checking YouTube’s current ingest requirements.

Check compatibility and the cost of processing

Before committing to either route, inspect the media streams and test the intended output. Record the properties that matter for your work, such as video dimensions, frame rate, codec, audio presence and layout, and whether all segments have the same structure. FFmpeg’s probing tools can help you examine files, but the exact commands and output vary with the installed version and the media itself.

Question Demuxer with stream copy Filter in -filter_complex
Do the clips need visual or audio changes? Not suitable for applying those changes Suitable when the graph includes the required processing
Are you trying to preserve the existing encoded streams? This is the route to evaluate if inputs support it Decoding and processing generally means encoding affected output streams
Do the inputs differ in ways that matter at joins? Differences may prevent reliable stream-copy concatenation Processing can help standardize selected properties, but must be configured and tested
What is the main trade-off? Less processing when compatible, but limited ability to alter media More control, with added compute, encoding choices and potential quality loss
Does this choice satisfy YouTube ingest requirements? No; ingest configuration is separate No; ingest configuration is separate

A test should cover more than whether FFmpeg exits without an error. Watch and listen around each join. Check the beginning and end, inspect whether audio stays in sync, and confirm that the selected output container can be read by the intended live path. For a playlist that repeats, test the wrap from the last item to the first. If the result is important overnight, observe a long enough run to expose issues that only appear after an extended sequence.

Keep an eye on the cost of processing, too. A filtergraph and encoder need enough capacity to handle the chosen output continuously; a short file render may not reveal what happens during a sustained live run. Stream copy reduces the encoding work where it works, but it does not remove the need for a stable broadcasting process or network connection. Neither method by itself gives you monitoring or recovery for a failed live session.

The online FFmpeg documentation follows the newest revision and is regenerated nightly. If an option behaves differently on your machine, consult documentation matching your installed build; FFmpeg’s documentation index makes this version distinction explicit. Keep the version and command notes with your test results so you can repeat a known-good setup after an update.

Configure YouTube ingest separately

Concatenation determines how source files are sequenced or processed. Ingest is the separate step of delivering an encoded and muxed output to YouTube using the protocol selected for the channel. A demuxer command does not configure a stream key, ingest destination, muxer, video encoder, audio encoder, or reconnect strategy. A filtergraph does not configure those items either.

The protocol matters. YouTube’s HLS ingestion guide specifies requirements for HLS delivery, including muxed M2TS, H.264 or HEVC video, AAC audio, closed GOP, and support for frame rates up to 60 fps. Those details are for HLS ingestion, not a general profile for every YouTube Live method. Do not apply them as though they were RTMP instructions; check the current guidance for the protocol you actually use.

Once you know the protocol, define the output separately from the concat decision. If you copy encoded streams, verify that they satisfy the protocol and that the packaging stage can deliver them appropriately. If you filter and re-encode, configure the encoders and muxer to produce the required output. Then confirm the channel’s current live settings and conduct a private or otherwise controlled test before relying on the stream for a long broadcast.

Your stream key is sensitive and should be treated like a credential. The practical steps for entering and managing it depend on the software or service sending the stream. See how to set a YouTube stream key for a 24/7 VPS stream for that separate operational task; it is not a substitute for choosing the right FFmpeg concat method.

Plan for what happens if the broadcast stops, too. A locally run FFmpeg process depends on its host machine, power, software and network continuing to work. If you run it remotely, you still need to understand how the process is supervised and how you will notice a failure. The media pipeline can be correct while the live operation still needs attention.

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

Which FFmpeg concat method should I use for a YouTube Live loop?

Use the concat demuxer if the inputs are suitable and you want to avoid re-encoding. Choose the concat filter in -filter_complex when the sequence needs processing, normalization or re-encoding. Then configure and validate YouTube ingest separately.

Can I loop a playlist without re-encoding?

Potentially, if the files are compatible for concatenation and the output can preserve their encoded streams. Test the actual sequence, including the final-to-first join, and check the requirements of the selected ingest protocol. There is no universal compatibility guarantee for arbitrary files.

Does -filter_complex configure YouTube Live?

No. It defines a processing graph for media, such as combining inputs and applying filters. Encoding, muxing, protocol-specific output, stream key handling and live operation are separate parts of the setup.

Do YouTube’s HLS requirements apply to every live stream?

No. The cited YouTube guide describes HLS ingestion specifically. Check YouTube’s current documentation for the protocol you use rather than treating HLS requirements as a blanket profile.

YOU’VE REACHED THE END

Keep the ideas coming.

More guides, useful tools and a little help for your next broadcast.

Back to the journal ↗
YOUR NEXT READ

A little more to explore.

More Comparisons guides ↗ · All topics ↗