1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-29 22:00:58 +02:00

doc/muxers/hls: review, apply consistency fixes

Apply misc typo fixes, consistency fixes, and reformat the layout to provide more overall
internal and global consistency.
This commit is contained in:
Stefano Sabatini 2024-03-29 12:30:57 +01:00
parent 8f85f657d7
commit 06f17cc9ce

View File

@ -1900,9 +1900,6 @@ flexible implementation of a segmenter, and can be used to perform HLS
segmentation. segmentation.
@subsection Options @subsection Options
This muxer supports the following options:
@table @option @table @option
@item hls_init_time @var{duration} @item hls_init_time @var{duration}
Set the initial target segment length. Default value is @var{0}. 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, @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}. 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. Segment will be cut on the next key frame after this time has passed on the
After the initial playlist is filled @command{ffmpeg} will cut segments first m3u8 list. After the initial playlist is filled, @command{ffmpeg} will cut
at duration equal to @code{hls_time} segments at duration equal to @option{hls_time}.
@item hls_time @var{duration} @item hls_time @var{duration}
Set the target segment length. Default value is 2. 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} 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 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 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. 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 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 @code{hls_flags append_list} 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, is set and read playlist sequence number is greater than the specified start sequence number,
then that value will be used as start value. then that value will be used as start value.
@ -1943,26 +1940,25 @@ It accepts the following values:
@table @option @table @option
@item generic (default) @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 @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 @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 @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 @end table
@item start_number @var{number} @item start_number @var{number}
Start the playlist sequence number (@code{#EXT-X-MEDIA-SEQUENCE}) from the specified @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.) when @option{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. Unless @option{hls_flags single_file} is set, it also specifies starting sequence numbers of segment and subtitle filenames.
Default value is 0. 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. Explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments.
@item hls_base_url @var{baseurl} @item hls_base_url @var{baseurl}
@ -1975,29 +1971,37 @@ which can be cyclic, for example if the @option{wrap} option is
specified. specified.
@item hls_segment_filename @var{filename} @item hls_segment_filename @var{filename}
Set the segment filename. Unless @code{hls_flags single_file} is set, Set the segment filename. Unless the @option{hls_flags} option is set with
@var{filename} is used as a string format with the segment number: @samp{single_file}, @var{filename} is used as a string format with the
segment number appended.
For example:
@example @example
ffmpeg -i in.nut -hls_segment_filename 'file%03d.ts' out.m3u8 ffmpeg -i in.nut -hls_segment_filename 'file%03d.ts' out.m3u8
@end example @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. @file{file000.ts}, @file{file001.ts}, @file{file002.ts}, etc.
@var{filename} may contain full path or relative path specification, @var{filename} may contain a full path or relative path specification,
but only the file name part without any path info will be contained in the m3u8 segment list. 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 Should a relative path be specified, the path of the created segment
files will be relative to the current working directory. 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 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 @var{filename} pattern must contain the string "%v", and this string will be
the position of variant stream index in the generated segment file names. expanded to the position of variant stream index in the generated segment file
names.
For example:
@example @example
ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ 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" \ -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 -hls_segment_filename 'file_%v_%03d.ts' out_%v.m3u8
@end example @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_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. @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 sub-directories are created after expanding the directory name pattern. This
enables creation of segments corresponding to different variant streams in enables creation of segments corresponding to different variant streams in
subdirectories. subdirectories.
For example:
@example @example
ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ 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" \ -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 -hls_segment_filename 'vs%v/file_%03d.ts' vs%v/out.m3u8
@end example @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{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. @file{vs1/file_000.ts}, @file{vs1/file_001.ts}, @file{vs1/file_002.ts}, etc.
@item strftime @item strftime @var{bool}
Use strftime() on @var{filename} to expand the segment filename with localtime. Use @code{strftime()} on @var{filename} to expand the segment filename with
The segment number is also available in this mode, but to use it, you need to specify second_level_segment_index localtime. The segment number is also available in this mode, but to use it,
hls_flag and %%d will be the specifier. you need to set @samp{second_level_segment_index} in the @option{hls_flag} and
%%d will be the specifier.
For example:
@example @example
ffmpeg -i in.nut -strftime 1 -hls_segment_filename 'file-%Y%m%d-%s.ts' out.m3u8 ffmpeg -i in.nut -strftime 1 -hls_segment_filename 'file-%Y%m%d-%s.ts' out.m3u8
@end example @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. @file{file-20160215-1455569023.ts}, @file{file-20160215-1455569024.ts}, etc.
Note: On some systems/environments, the @code{%s} specifier is not available. See Note: On some systems/environments, the @code{%s} specifier is not
@code{strftime()} documentation. available. See @code{strftime()} documentation.
For example:
@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 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 @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. @file{file-20160215-0001.ts}, @file{file-20160215-0002.ts}, etc.
@item strftime_mkdir @item strftime_mkdir @var{bool}
Used together with -strftime_mkdir, it will create all subdirectories which Used together with @option{strftime}, it will create all subdirectories which
is expanded in @var{filename}. are present in the expanded values of option @option{hls_segment_filename}.
For example:
@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 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 @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: 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 @example
ffmpeg -i in.nut -strftime 1 -strftime_mkdir 1 -hls_segment_filename '%Y/%m/%d/file-%Y%m%d-%s.ts' out.m3u8 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 @end example
This example will create a directory hierarchy 2016/02/15 (if any of them do not exist), and then will create a directory hierarchy @file{2016/02/15} (if any of them do not
produce the playlist, @file{out.m3u8}, and segment files: 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. @file{2016/02/15/file-20160215-1455569023.ts},
@file{2016/02/15/file-20160215-1455569024.ts}, etc.
@item hls_segment_options @var{options_list} @item hls_segment_options @var{options_list}
Set output format options using a :-separated list of key=value 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) hexadecimal string to be used instead of the segment sequence number (default)
for encryption. Changes to @var{key_info_file} will result in segment 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 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: Key info file format:
@example @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 -hls_key_info_file file.keyinfo out.m3u8
@end example @end example
@item -hls_enc @var{enc} @item hls_enc @var{bool}
Enable (1) or disable (0) the AES128 encryption. Enable (1) or disable (0) the AES128 encryption.
When enabled every segment generated is encrypted and the encryption key When enabled every segment generated is encrypted and the encryption key
is saved as @var{playlist name}.key. is saved as @var{playlist name}.key.
@item -hls_enc_key @var{key} @item hls_enc_key @var{key}
16-octet key to encrypt the segments, by default it Specify a 16-octet key to encrypt the segments, by default it is randomly
is randomly generated. 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 If set, @var{keyurl} is prepended instead of @var{baseurl} to the key filename
in the playlist. in the playlist.
@item -hls_enc_iv @var{iv} @item hls_enc_iv @var{iv}
16-octet initialization vector for every segment instead Specify the 16-octet initialization vector for every segment instead of the
of the autogenerated ones. autogenerated ones.
@item hls_segment_type @var{flags} @item hls_segment_type @var{flags}
Possible values: Possible values:
@ -2139,23 +2155,23 @@ compatible with all HLS versions.
@item fmp4 @item fmp4
Output segment files in fragmented MP4 format, similar to MPEG-DASH. Output segment files in fragmented MP4 format, similar to MPEG-DASH.
fmp4 files may be used in HLS version 7 and above. fmp4 files may be used in HLS version 7 and above.
@end table @end table
@item hls_fmp4_init_filename @var{filename} @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 @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 @end example
This will produce init like this will produce init like this @file{1602678741_init.mp4}.
@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}. 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 @var{filename} pattern must contain the string "%v", this string specifies
the position of variant stream index in the generated init file names. 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 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 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 file, and will use byte ranges in the playlist. HLS playlists generated with
this way will have the version number 4. this way will have the version number 4.
For example: For example:
@example @example
ffmpeg -i in.nut -hls_flags single_file out.m3u8 ffmpeg -i in.nut -hls_flags single_file out.m3u8
@end example @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}. @file{out.ts}.
@item delete_segments @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 Round the duration info in the playlist file segment info to integer
values, instead of using floating point. values, instead of using floating point.
If there are no other features requiring higher HLS versions be used, 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 @item discont_start
Add the @code{#EXT-X-DISCONTINUITY} tag to the playlist, before the 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. including the file containing the AES encryption key.
@item independent_segments @item independent_segments
Add the @code{#EXT-X-INDEPENDENT-SEGMENTS} to playlists that has video segments 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. and when all the segments of that playlist are guaranteed to start with a key frame.
@item iframes_only @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. and can play only I-frames in the @code{#EXT-X-BYTERANGE} mode.
@item split_by_time @item split_by_time
Allow segments to start on frames other than keyframes. This improves Allow segments to start on frames other than key frames. This improves
behavior on some players when the time between keyframes is inconsistent, 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 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 @item program_date_time
Generate @code{EXT-X-PROGRAM-DATE-TIME} tags. Generate @code{EXT-X-PROGRAM-DATE-TIME} tags.
@item second_level_segment_index @item second_level_segment_index
Makes it possible to use segment indexes as %%d in hls_segment_filename expression Make it possible to use segment indexes as %%d in the
besides date/time values when strftime is on. @option{hls_segment_filename} option expression besides date/time values when
To get fixed width numbers with trailing zeroes, %%0xd format is available where x is the required width. @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 @item second_level_segment_size
Makes it possible to use segment sizes (counted in bytes) as %%s in hls_segment_filename Make it possible to use segment sizes (counted in bytes) as %%s in
expression besides date/time values when strftime is on. @option{hls_segment_filename} option expression besides date/time values when
To get fixed width numbers with trailing zeroes, %%0xs format is available where x is the required width. 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 @item second_level_segment_duration
Makes it possible to use segment duration (calculated in microseconds) as %%t in hls_segment_filename Make it possible to use segment duration (calculated in microseconds) as %%t in
expression besides date/time values when strftime is on. @option{hls_segment_filename} option expression besides date/time values when
To get fixed width numbers with trailing zeroes, %%0xt format is available where x is the required width. strftime is on. To get fixed width numbers with trailing zeroes, %%0xt format
is available where x is the required width.
For example:
@example @example
ffmpeg -i sample.mpeg \ ffmpeg -i sample.mpeg \
-f hls -hls_time 3 -hls_list_size 5 \ -f hls -hls_time 3 -hls_list_size 5 \
-hls_flags second_level_segment_index+second_level_segment_size+second_level_segment_duration \ -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 -strftime 1 -strftime_mkdir 1 -hls_segment_filename "segment_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts" stream.m3u8
@end example @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. @file{segment_20170102194334_0003_00122200_0000003000000.ts}, @file{segment_20170102194334_0004_00120072_0000003000000.ts} etc.
@item temp_file @item temp_file
Write segment data to filename.tmp and rename to filename only once the segment is complete. A webserver Write segment data to @file{filename.tmp} and rename to filename only once the
serving up segments can be configured to reject requests to *.tmp to prevent access to in-progress segments segment is complete.
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.
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 @end table
@item hls_playlist_type event @item hls_playlist_type @var{type}
Emit @code{#EXT-X-PLAYLIST-TYPE:EVENT} in the m3u8 header. Forces If type is @samp{event}, emit @code{#EXT-X-PLAYLIST-TYPE:EVENT} in the m3u8
@option{hls_list_size} to 0; the playlist can only be appended to. header. This forces @option{hls_list_size} to 0; the playlist can only be
appended to.
@item hls_playlist_type vod If type is @samp{vod}, emit @code{#EXT-X-PLAYLIST-TYPE:VOD} in the m3u8
Emit @code{#EXT-X-PLAYLIST-TYPE:VOD} in the m3u8 header. Forces header. This forces @option{hls_list_size} to 0; the playlist must not change.
@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. Use the given HTTP method to create the hls files.
For example:
@example @example
ffmpeg -re -i in.ts -f hls -method PUT http://example.com/live/out.m3u8 ffmpeg -re -i in.ts -f hls -method PUT http://example.com/live/out.m3u8
@end example @end example
This example will upload all the mpegts segment files to the HTTP will upload all the mpegts segment files to the HTTP server using the HTTP PUT
server using the HTTP PUT method, and update the m3u8 files every method, and update the m3u8 files every @code{refresh} times using the same
@code{refresh} times using the same method. method. Note that the HTTP server must support the given method for uploading
Note that the HTTP server must support the given method for uploading
files. files.
@item http_user_agent @item http_user_agent @var{agent}
Override User-Agent field in HTTP header. Applicable only for HTTP output. Override User-Agent field in HTTP header. Applicable only for HTTP output.
@item var_stream_map @item var_stream_map @var{stream_map}
Map string which specifies how to group the audio, video and subtitle streams Specify a map string defining how to group the audio, video and subtitle streams
into different variant streams. The variant stream groups are separated into different variant streams. The variant stream groups are separated by
by space. space.
Expected string format is like this "a:0,v:0 a:1,v:1 ....". Here a:, v:, s: are 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. the keys to specify audio, video and subtitle streams respectively.
Allowed values are 0 to 9 (limited just based on practical usage). 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 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 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 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 present in the directory name, then sub-directories are created after expanding
the directory name pattern. This enables creation of variant streams in the directory name pattern. This enables creation of variant streams in
subdirectories. 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 @example
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ 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" \ -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 http://example.com/live/out_%v.m3u8
@end example @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 @example
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ 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" \ -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 http://example.com/live/out_%v.m3u8
@end example @end example
This example creates two hls variant streams as in the previous one. @item
But here, the two media playlist with file names out_my_hd.m3u8 and Create three hls variant streams. The first variant stream will be a video only
out_my_sd.m3u8 will be created. 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 @example
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k \ 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" \ -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 http://example.com/live/out_%v.m3u8
@end example @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 @item
be an audio only stream with bitrate 64k and the third variant stream will be a Create the variant streams in subdirectories. Here, the first media playlist is
video only stream with bitrate 256k. Here, three media playlist with file names created at @file{http://example.com/live/vs_0/out.m3u8} and the second one at
out_0.m3u8, out_1.m3u8 and out_2.m3u8 will be created. @file{http://example.com/live/vs_1/out.m3u8}.
@example @example
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ 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" \ -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 http://example.com/live/vs_%v/out.m3u8
@end example @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 @item
the second one at @file{http://example.com/live/vs_1/out.m3u8}. 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 @example
ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k -b:v:1 3000k \ 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 \ -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 \ -master_pl_name master.m3u8 \
http://example.com/live/out_%v.m3u8 http://example.com/live/out_%v.m3u8
@end example @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'.
@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. By default, a single hls variant containing all the encoded streams is created.
@example @example
ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \ 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 \ -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 \ -master_pl_name master.m3u8 \
http://example.com/live/out_%v.m3u8 http://example.com/live/out_%v.m3u8
@end example @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 @example
ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \ 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 \ -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 \ -master_pl_name master.m3u8 \
http://example.com/live/out_%v.m3u8 http://example.com/live/out_%v.m3u8
@end example @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 @example
ffmpeg -y -i input_with_subtitle.mkv \ ffmpeg -y -i input_with_subtitle.mkv \
-b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \ -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 \ -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" \ -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 \ -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 delete_segments+discont_start+split_by_time ./tmp/video.m3u8
@end example @end example
@end itemize
This example adds @code{#EXT-X-MEDIA} tag with @code{TYPE=SUBTITLES} in @item cc_stream_map @var{cc_stream_map}
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
Map string which specifies different closed captions groups and their Map string which specifies different closed captions groups and their
attributes. The closed captions stream groups are separated by space. attributes. The closed captions stream groups are separated by space.
Expected string format is like this Expected string format is like this
"ccgroup:<group name>,instreamid:<INSTREAM-ID>,language:<language code> ....". "ccgroup:<group name>,instreamid:<INSTREAM-ID>,language:<language code> ....".
'ccgroup' and 'instreamid' are mandatory attributes. 'language' is an optional 'ccgroup' and 'instreamid' are mandatory attributes. 'language' is an optional
attribute. attribute.
The closed captions groups configured using this option are mapped to different The closed captions groups configured using this option are mapped to different
variant streams by providing the same 'ccgroup' name in the 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 @option{var_stream_map} string.
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.
@example For 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.
@example @example
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ 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 \ -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" \ -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" \ -var_stream_map "v:0,a:0,ccgroup:cc v:1,a:1,ccgroup:cc" \
-master_pl_name master.m3u8 \ -master_pl_name master.m3u8 \
http://example.com/live/out_%v.m3u8 http://example.com/live/out_%v.m3u8
@end example @end example
This example adds two @code{#EXT-X-MEDIA} tags with @code{TYPE=CLOSED-CAPTIONS} in will add two @code{#EXT-X-MEDIA} tags with @code{TYPE=CLOSED-CAPTIONS} in the
the master playlist for the INSTREAM-IDs 'CC1' and 'CC2'. Also, it adds 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 @code{CLOSED-CAPTIONS} attribute with group name 'cc' for the two output variant
streams. 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. Create HLS master playlist with the given name.
For example:
@example @example
ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 http://example.com/live/out.m3u8 ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 http://example.com/live/out.m3u8
@end example @end example
This example creates HLS master playlist with name master.m3u8 and it is creates an HLS master playlist with name @file{master.m3u8} which is published
published at http://example.com/live/ 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. Publish master play list repeatedly every after specified number of segment intervals.
For example:
@example @example
ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 \ 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 -hls_time 2 -master_pl_publish_rate 30 http://example.com/live/out.m3u8
@end example @end example
creates an HLS master playlist with name @file{master.m3u8} and keeps
This example creates HLS master playlist with name master.m3u8 and keep
publishing it repeatedly every after 30 segments i.e. every after 60s. 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. 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. 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. 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. Set custom HTTP headers, can override built in default headers. Applicable only for HTTP output.
@end table @end table
@anchor{ico} @anchor{ico}