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 ffmpegVerify 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.key2. 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
| Resolution | Video Bitrate | Audio Bitrate | Use Case |
|---|---|---|---|
| 360p | 600-800 kbps | 64-96 kbps | Mobile network |
| 480p | 1000-1500 kbps | 96-128 kbps | Standard WiFi |
| 720p | 2500-4000 kbps | 128 kbps | High-speed network |
| 1080p | 4500-6000 kbps | 192 kbps | Fiber broadband |