Skip to main content
🇪🇸 Español 🇧🇷 Português 🇩🇪 Deutsch
Image Converter Video Converter Audio Converter Document Converter
Tools Guides Formats Pricing API
Log In
Guide

M3U8 and HLS: The Complete Guide to HTTP Live Streaming

PC By Pablo Cirre

Frequently Asked Questions

M3U is a simple playlist format for local or remote media files, while M3U8 is the UTF-8 encoded version that forms the foundation of HLS (HTTP Live Streaming). A basic M3U file lists media file paths with optional EXTINF metadata. An HLS M3U8 is much more complex: it can be a master playlist (listing multiple quality variants) or a media playlist (listing short video segments with timing information). HLS M3U8 enables adaptive bitrate streaming, where the player automatically switches quality based on network speed.

M3U is a simples playlist formato para local ou remote media files, while M3U8 is the UTF-8 encoded version that forms the foundation of HLS (HTTP Live Streaming). A basic M3U arquivo lists media arquivo paths com optional EXTINF metadata. An HLS M3U8 is much more complexo: it can be a master playlist (listing multiple quality variants) ou a media playlist (listing short video segments com timing information). HLS M3U8 enables adaptive bitrate streaming, where the player automatically switches quality based on network speed.

M3U is a einfach playlist Format für local oder remote media files, while M3U8 is the UTF-8 encoded version that forms the foundation von HLS (HTTP Live Streaming). A basic M3U Datei lists media Datei paths mit optional EXTINF metadata. An HLS M3U8 is much more complex: it can be a master playlist (listing multiple quality variants) oder a media playlist (listing short video segments mit timing information). HLS M3U8 enables adaptive Bitrate streaming, where the player automatically switches quality based on network speed.

M3U is a simple playlist formato para local o remote media files, while M3U8 is the UTF-8 encoded version that forms the foundation de HLS (HTTP Live Streaming). A basic M3U archivo lists media archivo paths con optional EXTINF metadata. An HLS M3U8 is much more complex: it can be a master playlist (listing multiple quality variants) o a media playlist (listing short video segments con timing information). HLS M3U8 enables adaptive bitrate streaming, where the player automatically switches quality based on network speed.

AV1 is the most efficient (royalty-free, ~30% smaller than H.265) but encoding is slow. H.265 (HEVC) saves ~30–50% over H.264 and is supported by every modern phone and desktop. H.264 remains the safest baseline for legacy compatibility. Rule of thumb: archives → AV1, daily use → H.265, broadest reach → H.264.

Use FFmpeg with the stream copy option: ffmpeg -i https://example.com/stream/master.m3u8 -c copy -movflags +faststart output.mp4. This downloads all segments and merges them without re-encoding. For content on streaming platforms, yt-dlp is a better choice since it handles authentication, quality selection, and subtitle merging: yt-dlp -f 'best[height<=1080]' https://platform.com/video/xyz. Note that downloading DRM-protected HLS streams may violate terms of service.

Use FFmpeg com the stream copy option: ffmpeg -i https://example.com/stream/master.m3u8 -c copy -movflags +faststart output.mp4. This downloads all segments e merges them sem re-encoding. para content on streaming plataformas, yt-dlp is a better choice since it handles authentication, quality selection, e subtitle merging: yt-dlp -f 'best[height<=1080]' https://platform.com/video/xyz. Note that baixando DRM-protected HLS streams may violate terms of service.

Use FFmpeg mit the stream copy option: ffmpeg -i https://example.com/stream/master.m3u8 -c copy -movflags +faststart output.mp4. This downloads all segments und merges them ohne re-encoding. für content on streaming Plattformen, yt-dlp is a better choice since it handles authentication, quality selection, und subtitle merging: yt-dlp -f 'best[height<=1080]' https://platform.com/video/xyz. Note that downloading DRM-protected HLS streams may violate terms von service.

Use FFmpeg con the stream copy option: ffmpeg -i https://example.com/stream/master.m3u8 -c copy -movflags +faststart output.mp4. This downloads all segments y merges them sin re-encoding. para content on streaming plataformas, yt-dlp is a better choice since it handles authentication, quality selection, y subtitle merging: yt-dlp -f 'best[height<=1080]' https://platform.com/video/xyz. Note that downloading DRM-protected HLS streams may violate terms de service.

CRF (Constant Rate Factor) is the best default for offline files: ffmpeg picks the bitrate frame-by-frame to maintain perceived quality. Two-pass is only better when you must hit an exact final size (DVD targets). Constant bitrate is for streaming with a fixed channel. For "smallest at quality X" always use CRF.

Use FFmpeg with the -f hls flag. For a basic single-quality stream: ffmpeg -i input.mp4 -codec:v libx264 -crf 20 -codec:a aac -b:a 128k -hls_time 10 -hls_list_size 0 -hls_segment_filename 'seg_%03d.ts' output.m3u8. For multi-bitrate adaptive streaming, use FFmpeg's filter_complex to split the video into multiple streams and the -var_stream_map flag to create separate playlists for each quality level.

Use FFmpeg com the -f hls flag. para a basic single-quality stream: ffmpeg -i input.mp4 -codec:v libx264 -crf 20 -codec:a aac -b:a 128k -hls_time 10 -hls_list_size 0 -hls_segment_filename 'seg_%03d.ts' output.m3u8. para multi-bitrate adaptive streaming, usar FFmpeg's filter_complex to split the video em multiple streams e the -var_stream_map flag to create separate playlists para each quality level.

Use FFmpeg mit the -f hls flag. für a basic single-quality stream: ffmpeg -i input.mp4 -codec:v libx264 -crf 20 -codec:a aac -b:a 128k -hls_time 10 -hls_list_size 0 -hls_segment_filename 'seg_%03d.ts' output.m3u8. für multi-bitrate adaptive streaming, verwenden FFmpeg's filter_complex to split the video in multiple streams und the -var_stream_map flag to create separate playlists für each quality level.

Common causes: (1) variable framerate source rendered as constant (use <code>-vsync vfr</code> to preserve VFR); (2) different audio sample rates not resampled (add <code>-ar 48000</code>); (3) container limitations (MP4 with variable framerate misbehaves — prefer MKV during editing, encode to MP4 only at the end). Always run <code>ffprobe</code> on both source and output to compare timing.

Safari and iOS/iPadOS have native HLS support — just set the video src to the .m3u8 URL. For Chrome, Firefox, and Edge, use the hls.js JavaScript library: include hls.js from a CDN, check Hls.isSupported(), create a new Hls() instance, call hls.loadSource(m3u8Url) and hls.attachMedia(videoElement). The library handles segment fetching, buffering, and automatic quality switching via the ABR (Adaptive Bitrate) algorithm.

Safari e iOS/iPadOS have native HLS support — just set the video src para o .m3u8 URL. para Chrome, Firefox, e Edge, usar the hls.js JavaScript library: include hls.js de a CDN, check Hls.isSupported(), create a new Hls() instance, call hls.loadSource(m3u8Url) e hls.attachMedia(videoElement). The library handles segment fetching, buffering, e automatic quality switching via the ABR (Adaptive bitrate) algorithm.

Safari und iOS/iPadOS have native HLS support — just set the video src zum .m3u8 URL. für Chrome, Firefox, und Edge, verwenden the hls.js JavaScript library: include hls.js von a CDN, check Hls.isSupported(), create a new Hls() instance, call hls.loadSource(m3u8Url) und hls.attachMedia(videoElement). The library handles segment fetching, buffering, und automatic quality switching via the ABR (Adaptive Bitrate) algorithm.

Safari y iOS/iPadOS have native HLS support — just set the video src al .m3u8 URL. para Chrome, Firefox, y Edge, usar the hls.js JavaScript library: include hls.js de a CDN, check Hls.isSupported(), create a new Hls() instance, call hls.loadSource(m3u8Url) y hls.attachMedia(videoElement). The library handles segment fetching, buffering, y automatic quality switching via the ABR (Adaptive bitrate) algorithm.

Yes if you only change the container: <code>ffmpeg -i in.mkv -c copy out.mp4</code>. This remuxes the stream without re-encoding, takes seconds even for hours of footage. Limitations: codec must be supported by the target container (e.g. you cannot put H.264 in WebM, only VP8/VP9/AV1). To shrink size you must re-encode.

We use cookies and similar technologies to personalise content and ads, and to analyse traffic. Learn more about cookies.