|
|
|
@ -1900,9 +1900,6 @@ flexible implementation of a segmenter, and can be used to perform HLS |
|
|
|
|
segmentation. |
|
|
|
|
|
|
|
|
|
@subsection Options |
|
|
|
|
|
|
|
|
|
This muxer supports the following options: |
|
|
|
|
|
|
|
|
|
@table @option |
|
|
|
|
@item hls_init_time @var{duration} |
|
|
|
|
Set the initial target segment length. Default value is @var{0}. |
|
|
|
@ -1910,9 +1907,9 @@ Set the initial target segment length. Default value is @var{0}. |
|
|
|
|
@var{duration} must be a time duration specification, |
|
|
|
|
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. |
|
|
|
|
|
|
|
|
|
Segment will be cut on the next key frame after this time has passed on the first m3u8 list. |
|
|
|
|
After the initial playlist is filled @command{ffmpeg} will cut segments |
|
|
|
|
at duration equal to @code{hls_time} |
|
|
|
|
Segment will be cut on the next key frame after this time has passed on the |
|
|
|
|
first m3u8 list. After the initial playlist is filled, @command{ffmpeg} will cut |
|
|
|
|
segments at duration equal to @option{hls_time}. |
|
|
|
|
|
|
|
|
|
@item hls_time @var{duration} |
|
|
|
|
Set the target segment length. Default value is 2. |
|
|
|
@ -1929,12 +1926,12 @@ will contain all the segments. Default value is 5. |
|
|
|
|
Set the number of unreferenced segments to keep on disk before @code{hls_flags delete_segments} |
|
|
|
|
deletes them. Increase this to allow continue clients to download segments which |
|
|
|
|
were recently referenced in the playlist. Default value is 1, meaning segments older than |
|
|
|
|
@code{hls_list_size+1} will be deleted. |
|
|
|
|
@option{hls_list_size+1} will be deleted. |
|
|
|
|
|
|
|
|
|
@item hls_start_number_source |
|
|
|
|
@item hls_start_number_source @var{source} |
|
|
|
|
Start the playlist sequence number (@code{#EXT-X-MEDIA-SEQUENCE}) according to the specified source. |
|
|
|
|
Unless @code{hls_flags single_file} is set, it also specifies source of starting sequence numbers of |
|
|
|
|
segment and subtitle filenames. In any case, if @code{hls_flags append_list} |
|
|
|
|
Unless @option{hls_flags single_file} is set, it also specifies source of starting sequence numbers of |
|
|
|
|
segment and subtitle filenames. In any case, if @option{hls_flags append_list} |
|
|
|
|
is set and read playlist sequence number is greater than the specified start sequence number, |
|
|
|
|
then that value will be used as start value. |
|
|
|
|
|
|
|
|
@ -1943,26 +1940,25 @@ It accepts the following values: |
|
|
|
|
@table @option |
|
|
|
|
|
|
|
|
|
@item generic (default) |
|
|
|
|
Set the starting sequence numbers according to @var{start_number} option value. |
|
|
|
|
Set the start numbers according to the @option{start_number} option value. |
|
|
|
|
|
|
|
|
|
@item epoch |
|
|
|
|
The start number will be the seconds since epoch (1970-01-01 00:00:00) |
|
|
|
|
Set the start number as the seconds since epoch (1970-01-01 00:00:00). |
|
|
|
|
|
|
|
|
|
@item epoch_us |
|
|
|
|
The start number will be the microseconds since epoch (1970-01-01 00:00:00) |
|
|
|
|
Set the start number as the microseconds since epoch (1970-01-01 00:00:00). |
|
|
|
|
|
|
|
|
|
@item datetime |
|
|
|
|
The start number will be based on the current date/time as YYYYmmddHHMMSS. e.g. 20161231235759. |
|
|
|
|
|
|
|
|
|
Set the start number based on the current date/time as YYYYmmddHHMMSS. e.g. 20161231235759. |
|
|
|
|
@end table |
|
|
|
|
|
|
|
|
|
@item start_number @var{number} |
|
|
|
|
Start the playlist sequence number (@code{#EXT-X-MEDIA-SEQUENCE}) from the specified @var{number} |
|
|
|
|
when @var{hls_start_number_source} value is @var{generic}. (This is the default case.) |
|
|
|
|
Unless @code{hls_flags single_file} is set, it also specifies starting sequence numbers of segment and subtitle filenames. |
|
|
|
|
when @option{hls_start_number_source} value is @var{generic}. (This is the default case.) |
|
|
|
|
Unless @option{hls_flags single_file} is set, it also specifies starting sequence numbers of segment and subtitle filenames. |
|
|
|
|
Default value is 0. |
|
|
|
|
|
|
|
|
|
@item hls_allow_cache @var{allowcache} |
|
|
|
|
@item hls_allow_cache @var{bool} |
|
|
|
|
Explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments. |
|
|
|
|
|
|
|
|
|
@item hls_base_url @var{baseurl} |
|
|
|
@ -1975,29 +1971,37 @@ which can be cyclic, for example if the @option{wrap} option is |
|
|
|
|
specified. |
|
|
|
|
|
|
|
|
|
@item hls_segment_filename @var{filename} |
|
|
|
|
Set the segment filename. Unless @code{hls_flags single_file} is set, |
|
|
|
|
@var{filename} is used as a string format with the segment number: |
|
|
|
|
Set the segment filename. Unless the @option{hls_flags} option is set with |
|
|
|
|
@samp{single_file}, @var{filename} is used as a string format with the |
|
|
|
|
segment number appended. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.nut -hls_segment_filename 'file%03d.ts' out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
|
|
|
|
|
will produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
@file{file000.ts}, @file{file001.ts}, @file{file002.ts}, etc. |
|
|
|
|
|
|
|
|
|
@var{filename} may contain full path or relative path specification, |
|
|
|
|
but only the file name part without any path info will be contained in the m3u8 segment list. |
|
|
|
|
@var{filename} may contain a full path or relative path specification, |
|
|
|
|
but only the file name part without any path will be contained in the m3u8 segment list. |
|
|
|
|
Should a relative path be specified, the path of the created segment |
|
|
|
|
files will be relative to the current working directory. |
|
|
|
|
When strftime_mkdir is set, the whole expanded value of @var{filename} will be written into the m3u8 segment list. |
|
|
|
|
When @option{strftime_mkdir} is set, the whole expanded value of @var{filename} will be written into the m3u8 segment list. |
|
|
|
|
|
|
|
|
|
When @code{var_stream_map} is set with two or more variant streams, the |
|
|
|
|
@var{filename} pattern must contain the string "%v", this string specifies |
|
|
|
|
the position of variant stream index in the generated segment file names. |
|
|
|
|
When @option{var_stream_map} is set with two or more variant streams, the |
|
|
|
|
@var{filename} pattern must contain the string "%v", and this string will be |
|
|
|
|
expanded to the position of variant stream index in the generated segment file |
|
|
|
|
names. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ |
|
|
|
|
-map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \ |
|
|
|
|
-hls_segment_filename 'file_%v_%03d.ts' out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will produce the playlists segment file sets: |
|
|
|
|
|
|
|
|
|
will produce the playlists segment file sets: |
|
|
|
|
@file{file_0_000.ts}, @file{file_0_001.ts}, @file{file_0_002.ts}, etc. and |
|
|
|
|
@file{file_1_000.ts}, @file{file_1_001.ts}, @file{file_1_002.ts}, etc. |
|
|
|
|
|
|
|
|
@ -2007,48 +2011,60 @@ sub-directory or filename.) If the string %v is present in the directory name, t |
|
|
|
|
sub-directories are created after expanding the directory name pattern. This |
|
|
|
|
enables creation of segments corresponding to different variant streams in |
|
|
|
|
subdirectories. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ |
|
|
|
|
-map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \ |
|
|
|
|
-hls_segment_filename 'vs%v/file_%03d.ts' vs%v/out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will produce the playlists segment file sets: |
|
|
|
|
will produce the playlists segment file sets: |
|
|
|
|
@file{vs0/file_000.ts}, @file{vs0/file_001.ts}, @file{vs0/file_002.ts}, etc. and |
|
|
|
|
@file{vs1/file_000.ts}, @file{vs1/file_001.ts}, @file{vs1/file_002.ts}, etc. |
|
|
|
|
|
|
|
|
|
@item strftime |
|
|
|
|
Use strftime() on @var{filename} to expand the segment filename with localtime. |
|
|
|
|
The segment number is also available in this mode, but to use it, you need to specify second_level_segment_index |
|
|
|
|
hls_flag and %%d will be the specifier. |
|
|
|
|
@item strftime @var{bool} |
|
|
|
|
Use @code{strftime()} on @var{filename} to expand the segment filename with |
|
|
|
|
localtime. The segment number is also available in this mode, but to use it, |
|
|
|
|
you need to set @samp{second_level_segment_index} in the @option{hls_flag} and |
|
|
|
|
%%d will be the specifier. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.nut -strftime 1 -hls_segment_filename 'file-%Y%m%d-%s.ts' out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
will produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
@file{file-20160215-1455569023.ts}, @file{file-20160215-1455569024.ts}, etc. |
|
|
|
|
Note: On some systems/environments, the @code{%s} specifier is not available. See |
|
|
|
|
@code{strftime()} documentation. |
|
|
|
|
Note: On some systems/environments, the @code{%s} specifier is not |
|
|
|
|
available. See @code{strftime()} documentation. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.nut -strftime 1 -hls_flags second_level_segment_index -hls_segment_filename 'file-%Y%m%d-%%04d.ts' out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
will produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
@file{file-20160215-0001.ts}, @file{file-20160215-0002.ts}, etc. |
|
|
|
|
|
|
|
|
|
@item strftime_mkdir |
|
|
|
|
Used together with -strftime_mkdir, it will create all subdirectories which |
|
|
|
|
is expanded in @var{filename}. |
|
|
|
|
@item strftime_mkdir @var{bool} |
|
|
|
|
Used together with @option{strftime}, it will create all subdirectories which |
|
|
|
|
are present in the expanded values of option @option{hls_segment_filename}. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.nut -strftime 1 -strftime_mkdir 1 -hls_segment_filename '%Y%m%d/file-%Y%m%d-%s.ts' out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will create a directory 201560215 (if it does not exist), and then |
|
|
|
|
will create a directory @file{201560215} (if it does not exist), and then |
|
|
|
|
produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
@file{20160215/file-20160215-1455569023.ts}, @file{20160215/file-20160215-1455569024.ts}, etc. |
|
|
|
|
@file{20160215/file-20160215-1455569023.ts}, |
|
|
|
|
@file{20160215/file-20160215-1455569024.ts}, etc. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.nut -strftime 1 -strftime_mkdir 1 -hls_segment_filename '%Y/%m/%d/file-%Y%m%d-%s.ts' out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will create a directory hierarchy 2016/02/15 (if any of them do not exist), and then |
|
|
|
|
produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
@file{2016/02/15/file-20160215-1455569023.ts}, @file{2016/02/15/file-20160215-1455569024.ts}, etc. |
|
|
|
|
will create a directory hierarchy @file{2016/02/15} (if any of them do not |
|
|
|
|
exist), and then produce the playlist, @file{out.m3u8}, and segment files: |
|
|
|
|
@file{2016/02/15/file-20160215-1455569023.ts}, |
|
|
|
|
@file{2016/02/15/file-20160215-1455569024.ts}, etc. |
|
|
|
|
|
|
|
|
|
@item hls_segment_options @var{options_list} |
|
|
|
|
Set output format options using a :-separated list of key=value |
|
|
|
@ -2065,7 +2081,7 @@ format. The optional third line specifies the initialization vector (IV) as a |
|
|
|
|
hexadecimal string to be used instead of the segment sequence number (default) |
|
|
|
|
for encryption. Changes to @var{key_info_file} will result in segment |
|
|
|
|
encryption with the new key/IV and an entry in the playlist for the new key |
|
|
|
|
URI/IV if @code{hls_flags periodic_rekey} is enabled. |
|
|
|
|
URI/IV if @option{hls_flags periodic_rekey} is enabled. |
|
|
|
|
|
|
|
|
|
Key info file format: |
|
|
|
|
@example |
|
|
|
@ -2111,22 +2127,22 @@ ffmpeg -f lavfi -re -i testsrc -c:v h264 -hls_flags delete_segments \ |
|
|
|
|
-hls_key_info_file file.keyinfo out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
|
|
|
|
|
@item -hls_enc @var{enc} |
|
|
|
|
@item hls_enc @var{bool} |
|
|
|
|
Enable (1) or disable (0) the AES128 encryption. |
|
|
|
|
When enabled every segment generated is encrypted and the encryption key |
|
|
|
|
is saved as @var{playlist name}.key. |
|
|
|
|
|
|
|
|
|
@item -hls_enc_key @var{key} |
|
|
|
|
16-octet key to encrypt the segments, by default it |
|
|
|
|
is randomly generated. |
|
|
|
|
@item hls_enc_key @var{key} |
|
|
|
|
Specify a 16-octet key to encrypt the segments, by default it is randomly |
|
|
|
|
generated. |
|
|
|
|
|
|
|
|
|
@item -hls_enc_key_url @var{keyurl} |
|
|
|
|
@item hls_enc_key_url @var{keyurl} |
|
|
|
|
If set, @var{keyurl} is prepended instead of @var{baseurl} to the key filename |
|
|
|
|
in the playlist. |
|
|
|
|
|
|
|
|
|
@item -hls_enc_iv @var{iv} |
|
|
|
|
16-octet initialization vector for every segment instead |
|
|
|
|
of the autogenerated ones. |
|
|
|
|
@item hls_enc_iv @var{iv} |
|
|
|
|
Specify the 16-octet initialization vector for every segment instead of the |
|
|
|
|
autogenerated ones. |
|
|
|
|
|
|
|
|
|
@item hls_segment_type @var{flags} |
|
|
|
|
Possible values: |
|
|
|
@ -2139,23 +2155,23 @@ compatible with all HLS versions. |
|
|
|
|
@item fmp4 |
|
|
|
|
Output segment files in fragmented MP4 format, similar to MPEG-DASH. |
|
|
|
|
fmp4 files may be used in HLS version 7 and above. |
|
|
|
|
|
|
|
|
|
@end table |
|
|
|
|
|
|
|
|
|
@item hls_fmp4_init_filename @var{filename} |
|
|
|
|
Set filename to the fragment files header file, default filename is @file{init.mp4}. |
|
|
|
|
Set filename for the fragment files header file, default filename is @file{init.mp4}. |
|
|
|
|
|
|
|
|
|
Use @code{-strftime 1} on @var{filename} to expand the segment filename with localtime. |
|
|
|
|
When @option{strftime} is enabled, @var{filename} is expanded to the segment filename with localtime. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8 |
|
|
|
|
ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This will produce init like this |
|
|
|
|
@file{1602678741_init.mp4} |
|
|
|
|
will produce init like this @file{1602678741_init.mp4}. |
|
|
|
|
|
|
|
|
|
@item hls_fmp4_init_resend |
|
|
|
|
@item hls_fmp4_init_resend @var{bool} |
|
|
|
|
Resend init file after m3u8 file refresh every time, default is @var{0}. |
|
|
|
|
|
|
|
|
|
When @code{var_stream_map} is set with two or more variant streams, the |
|
|
|
|
When @option{var_stream_map} is set with two or more variant streams, the |
|
|
|
|
@var{filename} pattern must contain the string "%v", this string specifies |
|
|
|
|
the position of variant stream index in the generated init file names. |
|
|
|
|
The string "%v" may be present in the filename or in the last directory name |
|
|
|
@ -2172,11 +2188,12 @@ Possible values: |
|
|
|
|
If this flag is set, the muxer will store all segments in a single MPEG-TS |
|
|
|
|
file, and will use byte ranges in the playlist. HLS playlists generated with |
|
|
|
|
this way will have the version number 4. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i in.nut -hls_flags single_file out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
Will produce the playlist, @file{out.m3u8}, and a single segment file, |
|
|
|
|
will produce the playlist, @file{out.m3u8}, and a single segment file, |
|
|
|
|
@file{out.ts}. |
|
|
|
|
|
|
|
|
|
@item delete_segments |
|
|
|
@ -2191,7 +2208,7 @@ and remove the @code{#EXT-X-ENDLIST} from the old segment list. |
|
|
|
|
Round the duration info in the playlist file segment info to integer |
|
|
|
|
values, instead of using floating point. |
|
|
|
|
If there are no other features requiring higher HLS versions be used, |
|
|
|
|
then this will allow ffmpeg to output a HLS version 2 m3u8. |
|
|
|
|
then this will allow @command{ffmpeg} to output a HLS version 2 m3u8. |
|
|
|
|
|
|
|
|
|
@item discont_start |
|
|
|
|
Add the @code{#EXT-X-DISCONTINUITY} tag to the playlist, before the |
|
|
|
@ -2206,137 +2223,165 @@ detect updates to the encryption info. Be sure to replace this file atomically, |
|
|
|
|
including the file containing the AES encryption key. |
|
|
|
|
|
|
|
|
|
@item independent_segments |
|
|
|
|
Add the @code{#EXT-X-INDEPENDENT-SEGMENTS} to playlists that has video segments |
|
|
|
|
and when all the segments of that playlist are guaranteed to start with a Key frame. |
|
|
|
|
Add the @code{#EXT-X-INDEPENDENT-SEGMENTS} tag to playlists that has video segments |
|
|
|
|
and when all the segments of that playlist are guaranteed to start with a key frame. |
|
|
|
|
|
|
|
|
|
@item iframes_only |
|
|
|
|
Add the @code{#EXT-X-I-FRAMES-ONLY} to playlists that has video segments |
|
|
|
|
Add the @code{#EXT-X-I-FRAMES-ONLY} tag to playlists that has video segments |
|
|
|
|
and can play only I-frames in the @code{#EXT-X-BYTERANGE} mode. |
|
|
|
|
|
|
|
|
|
@item split_by_time |
|
|
|
|
Allow segments to start on frames other than keyframes. This improves |
|
|
|
|
behavior on some players when the time between keyframes is inconsistent, |
|
|
|
|
Allow segments to start on frames other than key frames. This improves |
|
|
|
|
behavior on some players when the time between key frames is inconsistent, |
|
|
|
|
but may make things worse on others, and can cause some oddities during |
|
|
|
|
seeking. This flag should be used with the @code{hls_time} option. |
|
|
|
|
seeking. This flag should be used with the @option{hls_time} option. |
|
|
|
|
|
|
|
|
|
@item program_date_time |
|
|
|
|
Generate @code{EXT-X-PROGRAM-DATE-TIME} tags. |
|
|
|
|
|
|
|
|
|
@item second_level_segment_index |
|
|
|
|
Makes it possible to use segment indexes as %%d in hls_segment_filename expression |
|
|
|
|
besides date/time values when strftime is on. |
|
|
|
|
To get fixed width numbers with trailing zeroes, %%0xd format is available where x is the required width. |
|
|
|
|
Make it possible to use segment indexes as %%d in the |
|
|
|
|
@option{hls_segment_filename} option expression besides date/time values when |
|
|
|
|
@option{strftime} option is on. To get fixed width numbers with trailing zeroes, %%0xd format |
|
|
|
|
is available where x is the required width. |
|
|
|
|
|
|
|
|
|
@item second_level_segment_size |
|
|
|
|
Makes it possible to use segment sizes (counted in bytes) as %%s in hls_segment_filename |
|
|
|
|
expression besides date/time values when strftime is on. |
|
|
|
|
To get fixed width numbers with trailing zeroes, %%0xs format is available where x is the required width. |
|
|
|
|
Make it possible to use segment sizes (counted in bytes) as %%s in |
|
|
|
|
@option{hls_segment_filename} option expression besides date/time values when |
|
|
|
|
strftime is on. To get fixed width numbers with trailing zeroes, %%0xs format |
|
|
|
|
is available where x is the required width. |
|
|
|
|
|
|
|
|
|
@item second_level_segment_duration |
|
|
|
|
Makes it possible to use segment duration (calculated in microseconds) as %%t in hls_segment_filename |
|
|
|
|
expression besides date/time values when strftime is on. |
|
|
|
|
To get fixed width numbers with trailing zeroes, %%0xt format is available where x is the required width. |
|
|
|
|
Make it possible to use segment duration (calculated in microseconds) as %%t in |
|
|
|
|
@option{hls_segment_filename} option expression besides date/time values when |
|
|
|
|
strftime is on. To get fixed width numbers with trailing zeroes, %%0xt format |
|
|
|
|
is available where x is the required width. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -i sample.mpeg \ |
|
|
|
|
-f hls -hls_time 3 -hls_list_size 5 \ |
|
|
|
|
-hls_flags second_level_segment_index+second_level_segment_size+second_level_segment_duration \ |
|
|
|
|
-strftime 1 -strftime_mkdir 1 -hls_segment_filename "segment_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts" stream.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This will produce segments like this: |
|
|
|
|
will produce segments like this: |
|
|
|
|
@file{segment_20170102194334_0003_00122200_0000003000000.ts}, @file{segment_20170102194334_0004_00120072_0000003000000.ts} etc. |
|
|
|
|
|
|
|
|
|
@item temp_file |
|
|
|
|
Write segment data to filename.tmp and rename to filename only once the segment is complete. A webserver |
|
|
|
|
serving up segments can be configured to reject requests to *.tmp to prevent access to in-progress segments |
|
|
|
|
before they have been added to the m3u8 playlist. This flag also affects how m3u8 playlist files are created. |
|
|
|
|
If this flag is set, all playlist files will written into temporary file and renamed after they are complete, similarly as segments are handled. |
|
|
|
|
But playlists with @code{file} protocol and with type (@code{hls_playlist_type}) other than @code{vod} |
|
|
|
|
are always written into temporary file regardless of this flag. Master playlist files (@code{master_pl_name}), if any, with @code{file} protocol, |
|
|
|
|
are always written into temporary file regardless of this flag if @code{master_pl_publish_rate} value is other than zero. |
|
|
|
|
|
|
|
|
|
Write segment data to @file{filename.tmp} and rename to filename only once the |
|
|
|
|
segment is complete. |
|
|
|
|
|
|
|
|
|
A webserver serving up segments can be configured to reject requests to *.tmp to |
|
|
|
|
prevent access to in-progress segments before they have been added to the m3u8 |
|
|
|
|
playlist. |
|
|
|
|
|
|
|
|
|
This flag also affects how m3u8 playlist files are created. If this flag is set, |
|
|
|
|
all playlist files will be written into a temporary file and renamed after they |
|
|
|
|
are complete, similarly as segments are handled. But playlists with @code{file} |
|
|
|
|
protocol and with @option{hls_playlist_type} type other than @samp{vod} are |
|
|
|
|
always written into a temporary file regardless of this flag. |
|
|
|
|
|
|
|
|
|
Master playlist files specified with @option{master_pl_name}, if any, with |
|
|
|
|
@code{file} protocol, are always written into temporary file regardless of this |
|
|
|
|
flag if @option{master_pl_publish_rate} value is other than zero. |
|
|
|
|
@end table |
|
|
|
|
|
|
|
|
|
@item hls_playlist_type event |
|
|
|
|
Emit @code{#EXT-X-PLAYLIST-TYPE:EVENT} in the m3u8 header. Forces |
|
|
|
|
@option{hls_list_size} to 0; the playlist can only be appended to. |
|
|
|
|
@item hls_playlist_type @var{type} |
|
|
|
|
If type is @samp{event}, emit @code{#EXT-X-PLAYLIST-TYPE:EVENT} in the m3u8 |
|
|
|
|
header. This forces @option{hls_list_size} to 0; the playlist can only be |
|
|
|
|
appended to. |
|
|
|
|
|
|
|
|
|
@item hls_playlist_type vod |
|
|
|
|
Emit @code{#EXT-X-PLAYLIST-TYPE:VOD} in the m3u8 header. Forces |
|
|
|
|
@option{hls_list_size} to 0; the playlist must not change. |
|
|
|
|
If type is @samp{vod}, emit @code{#EXT-X-PLAYLIST-TYPE:VOD} in the m3u8 |
|
|
|
|
header. This forces @option{hls_list_size} to 0; the playlist must not change. |
|
|
|
|
|
|
|
|
|
@item method |
|
|
|
|
@item method @var{method} |
|
|
|
|
Use the given HTTP method to create the hls files. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -f hls -method PUT http://example.com/live/out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example will upload all the mpegts segment files to the HTTP |
|
|
|
|
server using the HTTP PUT method, and update the m3u8 files every |
|
|
|
|
@code{refresh} times using the same method. |
|
|
|
|
Note that the HTTP server must support the given method for uploading |
|
|
|
|
will upload all the mpegts segment files to the HTTP server using the HTTP PUT |
|
|
|
|
method, and update the m3u8 files every @code{refresh} times using the same |
|
|
|
|
method. Note that the HTTP server must support the given method for uploading |
|
|
|
|
files. |
|
|
|
|
|
|
|
|
|
@item http_user_agent |
|
|
|
|
@item http_user_agent @var{agent} |
|
|
|
|
Override User-Agent field in HTTP header. Applicable only for HTTP output. |
|
|
|
|
|
|
|
|
|
@item var_stream_map |
|
|
|
|
Map string which specifies how to group the audio, video and subtitle streams |
|
|
|
|
into different variant streams. The variant stream groups are separated |
|
|
|
|
by space. |
|
|
|
|
@item var_stream_map @var{stream_map} |
|
|
|
|
Specify a map string defining how to group the audio, video and subtitle streams |
|
|
|
|
into different variant streams. The variant stream groups are separated by |
|
|
|
|
space. |
|
|
|
|
|
|
|
|
|
Expected string format is like this "a:0,v:0 a:1,v:1 ....". Here a:, v:, s: are |
|
|
|
|
the keys to specify audio, video and subtitle streams respectively. |
|
|
|
|
Allowed values are 0 to 9 (limited just based on practical usage). |
|
|
|
|
|
|
|
|
|
When there are two or more variant streams, the output filename pattern must |
|
|
|
|
contain the string "%v", this string specifies the position of variant stream |
|
|
|
|
contain the string "%v": this string specifies the position of variant stream |
|
|
|
|
index in the output media playlist filenames. The string "%v" may be present in |
|
|
|
|
the filename or in the last directory name containing the file. If the string is |
|
|
|
|
present in the directory name, then sub-directories are created after expanding |
|
|
|
|
the directory name pattern. This enables creation of variant streams in |
|
|
|
|
subdirectories. |
|
|
|
|
|
|
|
|
|
A few examples follow. |
|
|
|
|
|
|
|
|
|
@itemize |
|
|
|
|
@item |
|
|
|
|
Create two hls variant streams. The first variant stream will contain video |
|
|
|
|
stream of bitrate 1000k and audio stream of bitrate 64k and the second variant |
|
|
|
|
stream will contain video stream of bitrate 256k and audio stream of bitrate |
|
|
|
|
32k. Here, two media playlist with file names @file{out_0.m3u8} and |
|
|
|
|
@file{out_1.m3u8} will be created. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ |
|
|
|
|
-map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \ |
|
|
|
|
http://example.com/live/out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example creates two hls variant streams. The first variant stream will |
|
|
|
|
contain video stream of bitrate 1000k and audio stream of bitrate 64k and the |
|
|
|
|
second variant stream will contain video stream of bitrate 256k and audio |
|
|
|
|
stream of bitrate 32k. Here, two media playlist with file names out_0.m3u8 and |
|
|
|
|
out_1.m3u8 will be created. If you want something meaningful text instead of indexes |
|
|
|
|
in result names, you may specify names for each or some of the variants |
|
|
|
|
as in the following example. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@item |
|
|
|
|
If you want something meaningful text instead of indexes in result names, you |
|
|
|
|
may specify names for each or some of the variants. The following example will |
|
|
|
|
create two hls variant streams as in the previous one. But here, the two media |
|
|
|
|
playlist with file names @file{out_my_hd.m3u8} and @file{out_my_sd.m3u8} will be |
|
|
|
|
created. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ |
|
|
|
|
-map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0,name:my_hd v:1,a:1,name:my_sd" \ |
|
|
|
|
http://example.com/live/out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
|
|
|
|
|
This example creates two hls variant streams as in the previous one. |
|
|
|
|
But here, the two media playlist with file names out_my_hd.m3u8 and |
|
|
|
|
out_my_sd.m3u8 will be created. |
|
|
|
|
|
|
|
|
|
@item |
|
|
|
|
Create three hls variant streams. The first variant stream will be a video only |
|
|
|
|
stream with video bitrate 1000k, the second variant stream will be an audio only |
|
|
|
|
stream with bitrate 64k and the third variant stream will be a video only stream |
|
|
|
|
with bitrate 256k. Here, three media playlist with file names @file{out_0.m3u8}, |
|
|
|
|
@file{out_1.m3u8} and @file{out_2.m3u8} will be created. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k \ |
|
|
|
|
-map 0:v -map 0:a -map 0:v -f hls -var_stream_map "v:0 a:0 v:1" \ |
|
|
|
|
http://example.com/live/out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example creates three hls variant streams. The first variant stream will |
|
|
|
|
be a video only stream with video bitrate 1000k, the second variant stream will |
|
|
|
|
be an audio only stream with bitrate 64k and the third variant stream will be a |
|
|
|
|
video only stream with bitrate 256k. Here, three media playlist with file names |
|
|
|
|
out_0.m3u8, out_1.m3u8 and out_2.m3u8 will be created. |
|
|
|
|
|
|
|
|
|
@item |
|
|
|
|
Create the variant streams in subdirectories. Here, the first media playlist is |
|
|
|
|
created at @file{http://example.com/live/vs_0/out.m3u8} and the second one at |
|
|
|
|
@file{http://example.com/live/vs_1/out.m3u8}. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ |
|
|
|
|
-map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \ |
|
|
|
|
http://example.com/live/vs_%v/out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example creates the variant streams in subdirectories. Here, the first |
|
|
|
|
media playlist is created at @file{http://example.com/live/vs_0/out.m3u8} and |
|
|
|
|
the second one at @file{http://example.com/live/vs_1/out.m3u8}. |
|
|
|
|
|
|
|
|
|
@item |
|
|
|
|
Create two audio only and two video only variant streams. In addition to the |
|
|
|
|
@code{#EXT-X-STREAM-INF} tag for each variant stream in the master playlist, the |
|
|
|
|
@code{#EXT-X-MEDIA} tag is also added for the two audio only variant streams and |
|
|
|
|
they are mapped to the two video only variant streams with audio group names |
|
|
|
|
'aud_low' and 'aud_high'. |
|
|
|
|
By default, a single hls variant containing all the encoded streams is created. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k -b:v:1 3000k \ |
|
|
|
|
-map 0:a -map 0:a -map 0:v -map 0:v -f hls \ |
|
|
|
@ -2344,14 +2389,15 @@ ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k -b:v:1 3000k \ |
|
|
|
|
-master_pl_name master.m3u8 \ |
|
|
|
|
http://example.com/live/out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example creates two audio only and two video only variant streams. In |
|
|
|
|
addition to the #EXT-X-STREAM-INF tag for each variant stream in the master |
|
|
|
|
playlist, #EXT-X-MEDIA tag is also added for the two audio only variant streams |
|
|
|
|
and they are mapped to the two video only variant streams with audio group names |
|
|
|
|
'aud_low' and 'aud_high'. |
|
|
|
|
|
|
|
|
|
By default, a single hls variant containing all the encoded streams is created. |
|
|
|
|
@item |
|
|
|
|
|
|
|
|
|
Create two audio only and one video only variant streams. In addition to the |
|
|
|
|
@code{#EXT-X-STREAM-INF} tag for each variant stream in the master playlist, the |
|
|
|
|
@code{#EXT-X-MEDIA} tag is also added for the two audio only variant streams and |
|
|
|
|
they are mapped to the one video only variant streams with audio group name |
|
|
|
|
'aud_low', and the audio group have default stat is NO or YES. |
|
|
|
|
By default, a single hls variant containing all the encoded streams is created. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \ |
|
|
|
|
-map 0:a -map 0:a -map 0:v -f hls \ |
|
|
|
@ -2359,14 +2405,15 @@ ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \ |
|
|
|
|
-master_pl_name master.m3u8 \ |
|
|
|
|
http://example.com/live/out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example creates two audio only and one video only variant streams. In |
|
|
|
|
addition to the #EXT-X-STREAM-INF tag for each variant stream in the master |
|
|
|
|
playlist, #EXT-X-MEDIA tag is also added for the two audio only variant streams |
|
|
|
|
and they are mapped to the one video only variant streams with audio group name |
|
|
|
|
'aud_low', and the audio group have default stat is NO or YES. |
|
|
|
|
|
|
|
|
|
By default, a single hls variant containing all the encoded streams is created. |
|
|
|
|
|
|
|
|
|
@item |
|
|
|
|
Create two audio only and one video only variant streams. In addition to the |
|
|
|
|
@code{#EXT-X-STREAM-INF} tag for each variant stream in the master playlist, the |
|
|
|
|
@code{#EXT-X-MEDIA} tag is also added for the two audio only variant streams and |
|
|
|
|
they are mapped to the one video only variant streams with audio group name |
|
|
|
|
'aud_low', and the audio group have default stat is NO or YES, and one audio |
|
|
|
|
have and language is named ENG, the other audio language is named CHN. By |
|
|
|
|
default, a single hls variant containing all the encoded streams is created. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \ |
|
|
|
|
-map 0:a -map 0:a -map 0:v -f hls \ |
|
|
|
@ -2374,15 +2421,11 @@ ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \ |
|
|
|
|
-master_pl_name master.m3u8 \ |
|
|
|
|
http://example.com/live/out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example creates two audio only and one video only variant streams. In |
|
|
|
|
addition to the #EXT-X-STREAM-INF tag for each variant stream in the master |
|
|
|
|
playlist, #EXT-X-MEDIA tag is also added for the two audio only variant streams |
|
|
|
|
and they are mapped to the one video only variant streams with audio group name |
|
|
|
|
'aud_low', and the audio group have default stat is NO or YES, and one audio |
|
|
|
|
have and language is named ENG, the other audio language is named CHN. |
|
|
|
|
|
|
|
|
|
By default, a single hls variant containing all the encoded streams is created. |
|
|
|
|
|
|
|
|
|
@item |
|
|
|
|
Create a single variant stream. Add the @code{#EXT-X-MEDIA} tag with |
|
|
|
|
@code{TYPE=SUBTITLES} in the master playlist with webvtt subtitle group name |
|
|
|
|
'subtitle'. Make sure the input file has one text subtitle stream at least. |
|
|
|
|
@example |
|
|
|
|
ffmpeg -y -i input_with_subtitle.mkv \ |
|
|
|
|
-b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \ |
|
|
|
@ -2390,83 +2433,86 @@ ffmpeg -y -i input_with_subtitle.mkv \ |
|
|
|
|
-c:s webvtt -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0 -map 0:s:0 \ |
|
|
|
|
-f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle" \ |
|
|
|
|
-master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \ |
|
|
|
|
10 -master_pl_publish_rate 10 -hls_flags \ |
|
|
|
|
10 -master_pl_publish_rate 10 -hls_flags \ |
|
|
|
|
delete_segments+discont_start+split_by_time ./tmp/video.m3u8 |
|
|
|
|
@end example |
|
|
|
|
@end itemize |
|
|
|
|
|
|
|
|
|
This example adds @code{#EXT-X-MEDIA} tag with @code{TYPE=SUBTITLES} in |
|
|
|
|
the master playlist with webvtt subtitle group name 'subtitle'. Please make sure |
|
|
|
|
the input file has one text subtitle stream at least. |
|
|
|
|
|
|
|
|
|
@item cc_stream_map |
|
|
|
|
@item cc_stream_map @var{cc_stream_map} |
|
|
|
|
Map string which specifies different closed captions groups and their |
|
|
|
|
attributes. The closed captions stream groups are separated by space. |
|
|
|
|
|
|
|
|
|
Expected string format is like this |
|
|
|
|
"ccgroup:<group name>,instreamid:<INSTREAM-ID>,language:<language code> ....". |
|
|
|
|
'ccgroup' and 'instreamid' are mandatory attributes. 'language' is an optional |
|
|
|
|
attribute. |
|
|
|
|
|
|
|
|
|
The closed captions groups configured using this option are mapped to different |
|
|
|
|
variant streams by providing the same 'ccgroup' name in the |
|
|
|
|
@code{var_stream_map} string. If @code{var_stream_map} is not set, then the |
|
|
|
|
first available ccgroup in @code{cc_stream_map} is mapped to the output variant |
|
|
|
|
stream. The examples for these two use cases are given below. |
|
|
|
|
@option{var_stream_map} string. |
|
|
|
|
|
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:v 1000k -b:a 64k -a53cc 1 -f hls \ |
|
|
|
|
-cc_stream_map "ccgroup:cc,instreamid:CC1,language:en" \ |
|
|
|
|
-master_pl_name master.m3u8 \ |
|
|
|
|
http://example.com/live/out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example adds @code{#EXT-X-MEDIA} tag with @code{TYPE=CLOSED-CAPTIONS} in |
|
|
|
|
the master playlist with group name 'cc', language 'en' (english) and |
|
|
|
|
INSTREAM-ID 'CC1'. Also, it adds @code{CLOSED-CAPTIONS} attribute with group |
|
|
|
|
name 'cc' for the output variant stream. |
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ |
|
|
|
|
-a53cc:0 1 -a53cc:1 1\ |
|
|
|
|
-a53cc:0 1 -a53cc:1 1 \ |
|
|
|
|
-map 0:v -map 0:a -map 0:v -map 0:a -f hls \ |
|
|
|
|
-cc_stream_map "ccgroup:cc,instreamid:CC1,language:en ccgroup:cc,instreamid:CC2,language:sp" \ |
|
|
|
|
-var_stream_map "v:0,a:0,ccgroup:cc v:1,a:1,ccgroup:cc" \ |
|
|
|
|
-master_pl_name master.m3u8 \ |
|
|
|
|
http://example.com/live/out_%v.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example adds two @code{#EXT-X-MEDIA} tags with @code{TYPE=CLOSED-CAPTIONS} in |
|
|
|
|
the master playlist for the INSTREAM-IDs 'CC1' and 'CC2'. Also, it adds |
|
|
|
|
will add two @code{#EXT-X-MEDIA} tags with @code{TYPE=CLOSED-CAPTIONS} in the |
|
|
|
|
master playlist for the INSTREAM-IDs 'CC1' and 'CC2'. Also, it will add |
|
|
|
|
@code{CLOSED-CAPTIONS} attribute with group name 'cc' for the two output variant |
|
|
|
|
streams. |
|
|
|
|
|
|
|
|
|
@item master_pl_name |
|
|
|
|
If @option{var_stream_map} is not set, then the first available ccgroup in |
|
|
|
|
@option{cc_stream_map} is mapped to the output variant stream. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -b:v 1000k -b:a 64k -a53cc 1 -f hls \ |
|
|
|
|
-cc_stream_map "ccgroup:cc,instreamid:CC1,language:en" \ |
|
|
|
|
-master_pl_name master.m3u8 \ |
|
|
|
|
http://example.com/live/out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
this will add @code{#EXT-X-MEDIA} tag with @code{TYPE=CLOSED-CAPTIONS} in the |
|
|
|
|
master playlist with group name 'cc', language 'en' (english) and INSTREAM-ID |
|
|
|
|
'CC1'. Also, it will add @code{CLOSED-CAPTIONS} attribute with group name 'cc' |
|
|
|
|
for the output variant stream. |
|
|
|
|
|
|
|
|
|
@item master_pl_name @var{name} |
|
|
|
|
Create HLS master playlist with the given name. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 http://example.com/live/out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
This example creates HLS master playlist with name master.m3u8 and it is |
|
|
|
|
published at http://example.com/live/ |
|
|
|
|
creates an HLS master playlist with name @file{master.m3u8} which is published |
|
|
|
|
at @url{http://example.com/live/}. |
|
|
|
|
|
|
|
|
|
@item master_pl_publish_rate |
|
|
|
|
@item master_pl_publish_rate @var{count} |
|
|
|
|
Publish master play list repeatedly every after specified number of segment intervals. |
|
|
|
|
|
|
|
|
|
For example: |
|
|
|
|
@example |
|
|
|
|
ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 \ |
|
|
|
|
-hls_time 2 -master_pl_publish_rate 30 http://example.com/live/out.m3u8 |
|
|
|
|
@end example |
|
|
|
|
|
|
|
|
|
This example creates HLS master playlist with name master.m3u8 and keep |
|
|
|
|
creates an HLS master playlist with name @file{master.m3u8} and keeps |
|
|
|
|
publishing it repeatedly every after 30 segments i.e. every after 60s. |
|
|
|
|
|
|
|
|
|
@item http_persistent |
|
|
|
|
@item http_persistent @var{bool} |
|
|
|
|
Use persistent HTTP connections. Applicable only for HTTP output. |
|
|
|
|
|
|
|
|
|
@item timeout |
|
|
|
|
@item timeout @var{timeout} |
|
|
|
|
Set timeout for socket I/O operations. Applicable only for HTTP output. |
|
|
|
|
|
|
|
|
|
@item ignore_io_errors |
|
|
|
|
@item ignore_io_errors @var{bool} |
|
|
|
|
Ignore IO errors during open, write and delete. Useful for long-duration runs with network output. |
|
|
|
|
|
|
|
|
|
@item headers |
|
|
|
|
@item headers @var{headers} |
|
|
|
|
Set custom HTTP headers, can override built in default headers. Applicable only for HTTP output. |
|
|
|
|
|
|
|
|
|
@end table |
|
|
|
|
|
|
|
|
|
@anchor{ico} |
|
|
|
|