Skip to content
streamneo.
Streaming Settings12 min read

How to Stream Vertical Prerecorded Videos in a Continuous YouTube Playlist with FFmpeg

Prepare portrait clips, set a vertical FFmpeg output and check YouTube Live ingest before running a continuous playlist.

sn.
StreamNeoPublished 7 October 2026
Worth sharing?

A vertical prerecorded stream is a live YouTube broadcast whose output frame is taller than it is wide, with portrait clips arranged to fit that frame. You can push it with FFmpeg over RTMPS, but YouTube does not provide a single official FFmpeg command for advancing through a multi-file playlist continuously.

The practical work is to prepare compatible clips, decide how each will be framed, create a playlist workflow that advances reliably, and test the resulting live output in YouTube Studio. The details below separate YouTube’s current vertical options from the choices you make in FFmpeg.

What a vertical live output means

A vertical live output is a portrait-shaped video sent to YouTube as a live broadcast. It is not simply a collection of portrait files playing in a browser playlist: the encoder produces one ongoing live feed, and YouTube receives that feed through the stream endpoint and key shown in Live Control Room.

Your output dimensions determine the shape viewers receive. A frame such as 1080 by 1920 is portrait; 1920 by 1080 is landscape. The source clips do not all have to share the output’s aspect ratio, but a landscape clip placed in a portrait frame needs a deliberate treatment. Depending on your filter or layout, it may be cropped, padded, or placed within a designed composition. Check faces, lyrics, captions and other important details rather than assuming every clip fits unchanged.

There are two distinct playback goals. If you want one clip to repeat, FFmpeg’s documented loop video filter can repeat frames from an input indefinitely. If you want a sequence of different clips, you need an ordered playlist or another process that schedules each file and maintains a continuous output. The loop filter alone does not manage that multi-file queue. For a devotional channel, for example, one workflow might repeat a single morning prayer video; another might move through a prepared list of bhajans in a set order.

Decide which goal you have before building the chain. A single-file loop is simpler to validate. A multi-file queue gives you variety and control over sequence, but introduces boundaries where a transition, audio stream, or file mismatch can interrupt playback. For a broader comparison of playlist approaches, see this guide to rotating devotional videos during festival streams.

Check YouTube Live’s vertical options

YouTube’s Live Control Room supports vertical layouts, including centre crop, fit-to-phone-width and stacked formats. The available experience and labels can change, so check the current controls on your channel before choosing an encoder layout. YouTube also describes creating horizontal and vertical formats together. If you use a third-party encoder for a vertical version, make sure the intended format is sent to the matching stream key rather than treating one portrait feed as an automatic substitute for a landscape feed.

Start by confirming that the channel can go live. YouTube’s live streaming help page says channel verification is required and that the channel must not have live-streaming restrictions in the preceding 90 days. Open or create the stream in Live Control Room, then copy the RTMPS address and stream key provided there. Treat the key as a credential: keep it out of public scripts, screenshots and shared documents.

For a straightforward FFmpeg push, RTMPS is the relevant ingest route. RTMPS carries RTMP over TLS. Google’s RTMPS ingestion guide explains the secure endpoint requirements, including use of port 443 and the correct server, application path and hostname information for the TLS connection. Use the address displayed by YouTube and make sure your client can establish TLS; do not replace it with an assumed endpoint copied from an old setup.

Do not confuse this encoder push with YouTube’s HLS ingest method. HLS ingest is a more specialised segment-upload workflow with requirements for muxed segments, a rolling media playlist and sequencing. A local playlist of video files is not the same thing as YouTube’s HLS live-ingest playlist. If your goal is simply to send an encoded live feed from FFmpeg, follow the RTMPS setup unless you have a specific reason and compatible implementation for HLS.

Prepare portrait clips and the playlist

Before configuring the output, inspect every source file. Note its dimensions, frame rate, video and audio codecs, audio channel layout, duration and whether it has an audio track. Clips that align on these properties are easier to join into a continuous sequence. Mixed formats can still be used, but they may require separate decoding and normalisation before the output encoder receives them.

Choose the sequence intentionally. Keep an ordered list of file paths and a separate record of the order you expect them to play. Avoid relying on directory order, which may not match your intended running order. If the playlist is meant to change over time, decide how changes are introduced: editing a live input list without testing may interrupt the current sequence or cause the next file to be missed.

A continuous output needs a playback chain that can supply each next item without ending the encoder session. There are several ways to arrange this, and the exact FFmpeg command depends on the operating system, FFmpeg build, input compatibility and playlist method. A concat workflow is most straightforward when files are prepared to match; an orchestration process can instead schedule files one by one while keeping the encoder output open. Do not assume a short command that repeats one input will automatically rotate through a folder of distinct clips.

If the goal is one source repeated, FFmpeg’s filter documentation describes the loop filter and its infinite-loop setting. That is useful for repeating video frames, but it does not solve playlist scheduling or guarantee that accompanying audio repeats in step. Test the audio separately, particularly at the end of a clip. A useful related diagnostic is this explanation of video repeating while audio stops looping.

For multiple sources, standardise clips where practical before going live. That may mean converting them to a common frame rate, audio layout and codec, and choosing a common duration or transition style. Keep the originals so a normalisation mistake can be corrected. If you are already using OBS rather than FFmpeg, this guide to looping a folder of music videos in OBS covers a different playback path; the playlist logic is not interchangeable with an FFmpeg command.

Set portrait output dimensions and framing

Set the encoder’s output canvas to portrait dimensions, then decide how each source maps onto it. A 1080 by 1920 frame is one example of a portrait canvas, not a requirement for every channel or input. Choose a resolution and frame rate that your encoding machine and reliable upload connection can sustain. The source may be a different shape or size, so an explicit scale and crop, padding, or layout operation is usually needed.

Cropping fills the output but removes part of the source. It may work well for a centred subject, but can cut off a person at the edge, a temple detail, or text in a landscape title card. Fit-to-frame preserves the full image but can leave unused bands; you can keep those bands plain or design a background treatment. A composed layout can place the entire source inside a portrait canvas with captions or a background, but it adds editing and testing work.

Think about the content’s safe area before selecting a crop. A presenter framed for landscape may have hands, instruments or accompanying text outside the central region. A vertical devotional clip may already use the full portrait frame and need only scaling. Preview representative clips from the beginning, middle and end of the playlist, including any landscape items, and confirm that text remains readable on a phone-sized preview.

YouTube’s own vertical layout options offer another route when the channel’s workflow supports them. A centre crop prioritises filling the vertical view, while fit-to-phone-width and stacked layouts handle content differently. Those choices belong to YouTube’s layout experience; an FFmpeg-produced portrait frame is a separate output decision. Confirm what your encoder sends and what the Live Control Room preview shows, rather than assuming the platform will correct framing for you.

Choose compatible encoding and ingest settings

For a conventional SDR live feed, YouTube’s current encoder settings guidance recommends H.264, constant bitrate (CBR), frame rates up to 60 fps and a two-second keyframe interval, not exceeding four seconds. AAC is a practical audio choice for a standard live encode. Set the output’s pixel format and audio parameters deliberately, and check that the FFmpeg build has the required codecs.

YouTube’s H.264 bitrate table gives these reference points for common resolutions and frame rates:

Output YouTube H.264 guidance
720p at 30 fps 3 Mbps minimum; 8 Mbps recommended
1080p at 30 fps 5 Mbps minimum; 14 Mbps recommended

These are YouTube’s encoder recommendations, not a guarantee that your internet connection can maintain the chosen rate. Pick a bitrate your upload can sustain consistently, with room for normal variation, and check stream health during a test. A high setting that exceeds the connection’s reliable capacity is not an improvement. The same table may not describe every vertical resolution or frame-rate combination, so consult the current page for your exact output.

Use the RTMPS endpoint and key from the control room. Confirm that the client is using RTMPS rather than cleartext RTMP, and that the TLS connection supplies the right hostname or SNI information. A connection failure can come from the protocol, path, key, TLS setup or network, not just the video encoder settings. Avoid putting the stream key directly in a public command example or log; use a private configuration method suitable for your system.

Keep the encoded feed’s timing consistent across playlist boundaries. Clips with differing frame rates or audio layouts may need normalising so the output does not pause, drift or change format when the next item starts. A bitrate setting is only one part of compatibility: the actual dimensions, frame rate, codec profile, keyframe cadence and audio behaviour should all be checked in the YouTube preview.

Start and monitor the playlist stream

Run a test before making the stream public. Use a private or unlisted broadcast where appropriate, start the encoder, and wait for the Live Control Room preview and stream-health information. Check that the output is portrait, the crop is acceptable, audio is present and the first transition occurs as expected. YouTube recommends testing with audio and motion similar to the planned stream; a static test frame will not reveal motion or boundary problems.

For a multi-file playlist, observe more than the opening clip. Test transitions between files with different source properties, and listen across the boundary for missing audio, overlap or a sudden change in loudness. Verify that the intended next file begins and the encoder stays active. A long-running broadcast has at least three separate states to watch: the process reading and encoding the files, the network carrying the upload and YouTube’s broadcast and ingest state.

YouTube’s Live Streaming API describes a broadcast as a distinct watchable video bound to a stream, and its documentation illustrates a 24/7 feed use case. This describes how broadcasts and streams relate; it does not promise uninterrupted delivery. Treat “continuous” as an operating goal that requires checking, not as a property created merely by naming a playlist continuous.

For an always-on setup, record encoder output and arrange a way to notice when the process exits or ingest health changes. A restart policy can help after a process failure, but it cannot repair a bad file, a lost network connection or every YouTube-side issue. After a restart, verify the preview and output rather than assuming the broadcast resumed correctly. If your computer is the encoder, it must remain on and connected; if avoiding that overnight dependency is the specific problem, StreamNeo can remove the need to leave your own computer running by handling the uploaded video as an ongoing YouTube live stream.

Monitor the upload connection and local resources as part of the run. Confirm that the machine is not sleeping, that the playlist files remain available and that storage for logs or working files is not filling up. For a local FFmpeg setup, these checks are your responsibility; an open terminal is not itself a monitoring plan. Keep the stream key private and have a clear way to stop or replace the broadcast if the wrong file or framing appears.

Troubleshoot framing, transitions and failures

If the video appears horizontal in the preview, first check the dimensions FFmpeg is actually outputting, not just the dimensions of the source clips. Then check whether the control room is displaying a vertical layout or a different version of a dual-format stream. A portrait source can still be placed inside a landscape output, and a vertical canvas can still show landscape material with padding or cropping.

If faces or text are cut off, revisit the crop and scaling choices for the affected source. A single crop position may not suit every item in a playlist. You may need to prepare a different crop for particular clips, use a fit layout, or make a designed portrait composition. Preview the clips most likely to fail rather than adjusting the whole playlist based only on its first file.

If playback stops at a boundary, check whether the playlist mechanism reached the end of its inputs, whether the next file was readable and whether the encoder process exited. If video continues but audio stops, inspect the audio path and loop behaviour separately. A filter that repeats video frames does not imply that the audio is being repeated or advanced correctly. The OBS disk-read troubleshooting guide addresses another local playback bottleneck; the same general lesson applies: distinguish a source-read problem from an ingest or network problem.

If the YouTube preview reports poor stream health, compare the configured bitrate and output format with the current YouTube guidance, then check the actual upload path and local encoder load. Reduce output demands if the connection or machine cannot sustain them, and retest with representative motion and audio. Do not treat a brief successful connection as evidence that an overnight stream will remain uninterrupted.

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

Can FFmpeg loop several portrait videos in order forever?

Not by applying the video loop filter to one input: that filter repeats frames from an input and does not manage a multi-file playlist. For several clips, use an ordered sequence or a scheduler that feeds the next file while keeping the output encoder running, then test the transitions and audio. The exact command depends on the files and your platform.

Do all clips need to be portrait?

No, but each clip needs a framing decision for the portrait output. A landscape clip can be cropped, fitted with padding or placed in a designed layout, and each choice trades full image coverage against filling the frame. Check faces, captions and other essential details in the preview.

What output size and bitrate should I use?

Choose a portrait canvas your encoder and upload can sustain; 1080 by 1920 is an example, not a universal requirement. YouTube’s encoder guidance lists H.264 bitrate recommendations for specific resolution and frame-rate combinations, including 720p30 and 1080p30. Check its current table for your exact output and test stream health on your own connection.

Is a local FFmpeg playlist the same as YouTube HLS ingest?

No. A local playlist is how you arrange prerecorded files for playback into an encoder. YouTube’s HLS ingest is a separate segment-based protocol with its own media and sequencing requirements; a straightforward FFmpeg push ordinarily uses the RTMPS endpoint and key from Live Control Room.

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 Streaming Settings guides ↗ · All topics ↗