Understanding HLS Segment Structure
HTTP Live Streaming (HLS) works by breaking a continuous media stream into small, downloadable segments. Each segment is typically stored as a Transport Stream (.ts) file, which is robust against packet loss and widely supported across devices. The master control file, known as an M3U8 playlist, contains the metadata necessary for players to locate and play these segments in sequence. In Kali Linux, ffmpeg provides a built-in HLS muxer that automates this segmentation and indexing process without requiring external tools.
Preparing the Environment
Before running the conversion command, ensure that ffmpeg is installed and updated on your Kali Linux system. Open a terminal and verify the installation by checking the version. If ffmpeg is not present, install it using the package manager. It is also advisable to have a source video file ready for testing. Common source formats include MP4, MKV, or AVI files. Ensure the source file has sufficient bitrate and resolution appropriate for your target streaming environment. Poor quality source material will result in low-quality segments regardless of the encoding settings used.
Constructing the FFmpeg Command
The core of the process involves constructing a precise ffmpeg command line. You must specify the input file, the output playlist filename, and several critical flags that dictate how segments are created. The most important flag is -hls_playlist_type, which determines whether the playlist is marked as event or vod. Without this flag, some players may fail to load the stream correctly. Additionally, you should define the segment duration using -hls_time. This value controls the length of each .ts file in seconds. A common default is 10 seconds, but this can be adjusted based on latency requirements.
ffmpeg -i input.mp4 -c copy -hls_time 10 -hls_list_size 0 -hls_playlist_type vod output.m3u8
In this command, -i input.mp4 specifies the source file. The -c copy flag instructs ffmpeg to copy the audio and video streams without re-encoding, which speeds up the process significantly. However, if you need to change codecs or resolutions, replace -c copy with specific encoder settings like -c:v libx264. The -hls_time 10 sets each segment to ten seconds. The -hls_list_size 0 ensures that all segments are included in the playlist, rather than limiting the list to the most recent few. Finally, -hls_playlist_type vod marks the stream as Video on Demand, allowing players to seek freely through the timeline.
Advanced Configuration Options
For more complex streaming needs, you may need to adjust additional parameters. One useful option is -hls_segment_filename, which allows you to customize the naming convention of the generated .ts files. By default, ffmpeg names them segment0.ts, segment1.ts, etc. Using a pattern like segment_%03d.ts ensures zero-padded filenames, which is often required for proper sorting in web servers. Another important consideration is the initialization segment. Some players require a separate init segment containing codec headers. You can enable this by adding -hls_init_time 1 or by using the -f hls flag explicitly before the output file.
If you encounter issues with large files or memory usage, consider enabling single-file mode. This creates a single concatenated TS file instead of multiple segments, though it defeats the purpose of adaptive streaming. For true adaptive bitrate streaming, you would need to run multiple instances of this command with different resolutions and bitrates, then combine them into a master playlist. This advanced setup is beyond the scope of basic segment creation but is essential for professional deployments. For related troubleshooting on playback issues, see our guide on Troubleshooting FFmpeg-Recorded RTSP Video Stream Not Displayed in VLC Media Player.
Verifying the Output
After the command completes, check the output directory for the generated files. You should see one .m3u8 file and several .ts files. Open the .m3u8 file in a text editor to verify its contents. It should contain tags such as #EXTM3U, #EXT-X-TARGETDURATION, and references to each segment file. Use a media player like VLC or a web browser to test the playlist. Load the .m3u8 file directly into the player. If the video plays smoothly without buffering errors, the segmentation was successful. If you experience errors, check the console output from ffmpeg for warnings about unsupported codecs or invalid timestamps.
Frequently Asked Questions
Why are my TS segments not playing in order?
This usually happens when the segment filenames are not sorted correctly by the media player. Ensure you use zero-padded filenames in the segment name pattern, such as %03d.ts. This forces the operating system and players to sort them numerically rather than alphabetically, preventing playback gaps.
Can I re-encode the video while creating segments?
Yes, simply remove the -c copy flag and specify new codecs. For example, use -c:v libx264 -crf 23 to re-encode video with H.264 at a moderate quality level. Re-encoding allows you to reduce file size or change compatibility profiles, but it requires more CPU time during generation.
What is the difference between vod and event playlist types?
The vod type indicates a complete video available for seeking anywhere, while event implies a live stream where only the end is available. Use vod for pre-recorded files to allow full scrubbing. Use event for live broadcasts to optimize buffer management and prevent seeking into non-existent future data.
How do I limit the number of segments kept in the playlist?
Use the -hls_list_size flag followed by a number. Setting it to 5 keeps only the five most recent segments in the M3U8 file. This is useful for live streaming to reduce file size and memory usage, but it prevents users from watching older parts of the broadcast.
Does this method work for audio-only files?
Yes, the HLS muxer supports audio-only streams. Replace the video input with an audio file like input.mp3 and omit video-specific flags. The resulting segments will contain only audio data, which is ideal for podcast distribution or background music streaming over HTTP.