FFmpeg M3U8 Conversion Tutorial

Published on Jan 12, 2026

FFmpeg is the most powerful open-source video processing tool. This tutorial teaches you how to convert any video to M3U8/HLS format using FFmpeg.

📦 Install FFmpeg

🍎 macOS

brew install ffmpeg

🐧 Ubuntu/Debian

sudo apt update && sudo apt install ffmpeg

🪟 Windows

Download from official site and add to system PATH:

https://ffmpeg.org/download.html

Verify installation:

ffmpeg -version

🎬 Basic Conversion

Simplest Conversion

ffmpeg -i input.mp4 \
  -codec: copy \
  -start_number 0 \
  -hls_time 10 \
  -hls_list_size 0 \
  -f hls \
  output.m3u8

Parameters:

  • -i input.mp4 - Input file
  • -codec: copy - Copy codec without re-encoding
  • -hls_time 10 - Each segment is 10 seconds
  • -hls_list_size 0 - Keep all segments
  • -f hls - Output HLS format

Re-encode Conversion (Recommended)

ffmpeg -i input.mp4 \
  -c:v libx264 -crf 23 -preset medium \
  -c:a aac -b:a 128k \
  -hls_time 6 \
  -hls_playlist_type vod \
  -hls_segment_filename "segment_%03d.ts" \
  output.m3u8

📊 Adaptive Bitrate (ABR)

To enable automatic quality switching based on network conditions, generate multiple bitrate versions:

Generate Multiple Bitrates

# 360p
ffmpeg -i input.mp4 -vf scale=640:360 -c:v libx264 -b:v 800k \
  -c:a aac -b:a 96k -hls_time 6 -hls_playlist_type vod \
  -hls_segment_filename "360p_%03d.ts" 360p.m3u8

# 720p
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -b:v 2800k \
  -c:a aac -b:a 128k -hls_time 6 -hls_playlist_type vod \
  -hls_segment_filename "720p_%03d.ts" 720p.m3u8

# 1080p
ffmpeg -i input.mp4 -vf scale=1920:1080 -c:v libx264 -b:v 5000k \
  -c:a aac -b:a 192k -hls_time 6 -hls_playlist_type vod \
  -hls_segment_filename "1080p_%03d.ts" 1080p.m3u8

Create Master Playlist

Manually create master.m3u8 file:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p.m3u8

🔐 AES-128 Encryption

Encryption protects video content from unauthorized downloads. Note this is basic protection and can be bypassed by advanced users.

1. Generate Key

openssl rand 16 > encrypt.key

2. Create Key Info File

Create encrypt.keyinfo:

https://your-server.com/encrypt.key
encrypt.key

3. Encrypted Conversion

ffmpeg -i input.mp4 \
  -c:v libx264 -c:a aac \
  -hls_time 6 \
  -hls_key_info_file encrypt.keyinfo \
  -hls_playlist_type vod \
  encrypted.m3u8

⚠️ Common Issues

Audio/Video Out of Sync

Solution: Add -async 1 parameter

ffmpeg -i input.mp4 -async 1 ...

Inaccurate Segment Duration

Solution: Force keyframe interval

-force_key_frames "expr:gte(t,n_forced*6)"

Conversion Too Slow

Use -preset ultrafast (trade quality for speed) or enable hardware acceleration (e.g., -c:v h264_nvenc)

Recommended Settings

ResolutionVideo BitrateAudio BitrateUse Case
360p600-800 kbps64-96 kbpsMobile network
480p1000-1500 kbps96-128 kbpsStandard WiFi
720p2500-4000 kbps128 kbpsHigh-speed network
1080p4500-6000 kbps192 kbpsFiber broadband

After conversion, test playback immediately

Open M3U8 Player