8

I want to create 'm3u8' file from the list of ts files. How can I do it?

I did search in google & read documentation of ffmpeg but I didn't find anything.

Mohammad Hossein Gerami
  • 1,360
  • 1
  • 10
  • 26
  • already an answer : https://stackoverflow.com/a/51274324/560435 if u want to take list of ts files making each entry from that list into a entry in a playlist. note - #EXT-X-DISCONTINUITY separates the list entry's . review the spec for 'discontinuity' for more on construction of your own list – Robert Rowntree Sep 01 '18 at 18:53

3 Answers3

7

It's not clear which of the following cases you're asking about, so here's a quick answer for both:

  1. If you're starting with a single file that contains your content This is the most common case. In general, there are three steps to creating a playable HlS stream from source material.
  • for each desired output level (let’s say Bitrate for simplicity), you need to create a collection of segmented .ts files.
  • For each output level you need a playlist manifest (m3u8) that contains the list of segment files making up the content.
  • For the whole stream you need a single master manifest (another m3u8) that lists the playlists.

FFMpeg can do all three of these.

  1. If you're starting with a collection of .ts files If you really are starting with a collection of .ts files, you could either hand-build an m3u8 file as described in the previous answer, or you could write a script to do it.

In either case, there are some considerations for the .ts files:

  • If the segment files do not belong to an uninterrupted sequence (as they would if they were transcoded from a single source clip for use in HLS), you’ll need to insert EXT-X-DISCONTINUITY tags between segments that don’t have the same encoding characteristics or that don’t have monotonically increasing PTS (presentation timestamp) values.

  • While the segments don't need to all be the same length, the longest one must not exceed the (integer) number of seconds specified in the EXT-X-TARGETDURATION tag.

  • "For VOD content, the average segment bit rate MUST be within 10% of the AVERAGE-BANDWIDTH attribute"

When you've built your m3u8 file, it helps to run it through a validator to find any problems.This is a lot easier than scratching your head wondering why an HLS stream plays poorly or inconsistently across players/browsers.

Eriko
  • 13
  • 3
thornfish
  • 84
  • 6
  • How to create the m3u8 file as a hand-build while we don't know the duration of each .ts file? – Misagh May 05 '19 at 12:46
2

You probably want a HLS structure. There's a lot of documentation at Apple (IIRC it was invented by Apple and then got adopted widely), e.g. a draft RFC and a page with example streams.

HLS consists of two levels: a master M3U8 which references other M3U8 which in turn reference the .ts files. You can omit the master M3U8 and just provide the "second level".

As a starting point, it may look something like this:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10, no desc
media-000001.ts
#EXTINF:10, no desc
media-000002.ts
#EXTINF:10, no desc
media-000003.ts

The EXT-X-TARGETDURATION specifies how long each .ts file is (they must all be of the same length). It may either be a relative or absolute path.

Community
  • 1
  • 1
DarkDust
  • 90,870
  • 19
  • 190
  • 224
2

Can be done with a bash script:

#!/usr/bin/env bash
file="hls.m3u8"
echo "#EXTM3U" > $file
echo "#EXT-X-VERSION:3" >> $file
echo "#EXT-X-MEDIA-SEQUENCE:24" >> $file
echo "#EXT-X-TARGETDURATION:10" >> $file    
for i in `find *.ts -type f | sort -g`; do
    l=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $i)
    echo "#EXTINF:$l," >> $file
    echo "$i" >> $file
done    
echo "#EXT-X-ENDLIST" >> $file
Nav
  • 19,885
  • 27
  • 92
  • 135