[FFmpeg-cvslog] doc/muxers/hls: review, apply consistency fixes
Stefano Sabatini
git at videolan.org
Tue Apr 2 21:11:33 EEST 2024
ffmpeg | branch: master | Stefano Sabatini <stefasab at gmail.com> | Fri Mar 29 12:30:57 2024 +0100| [06f17cc9cec1f6c2f939b50c8647d3b44e4f3c1e] | committer: Stefano Sabatini
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.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=06f17cc9cec1f6c2f939b50c8647d3b44e4f3c1e
---
doc/muxers.texi | 404 +++++++++++++++++++++++++++++++-------------------------
1 file changed, 225 insertions(+), 179 deletions(-)
diff --git a/doc/muxers.texi b/doc/muxers.texi
index a10a8e216f..f300f8c45f 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -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
- at code{hls_list_size+1} will be deleted.
+ at option{hls_list_size+1} will be deleted.
- at item hls_start_number_source
+ at 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.
- at item hls_allow_cache @var{allowcache}
+ at 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,
- at 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
+ at 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.
- at 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.
+ at 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
- at 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
+ at 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.
- at 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.
+ at 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.
- at item strftime_mkdir
-Used together with -strftime_mkdir, it will create all subdirectories which
-is expanded in @var{filename}.
+ at 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:
- at file{20160215/file-20160215-1455569023.ts}, @file{20160215/file-20160215-1455569024.ts}, etc.
+ at file{20160215/file-20160215-1455569023.ts},
+ at 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:
- at 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:
+ at file{2016/02/15/file-20160215-1455569023.ts},
+ at 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
- at item -hls_enc @var{enc}
+ at 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.
- at item -hls_enc_key @var{key}
-16-octet key to encrypt the segments, by default it
-is randomly generated.
+ at item hls_enc_key @var{key}
+Specify a 16-octet key to encrypt the segments, by default it is randomly
+generated.
- at item -hls_enc_key_url @var{keyurl}
+ at item hls_enc_key_url @var{keyurl}
If set, @var{keyurl} is prepended instead of @var{baseurl} to the key filename
in the playlist.
- at item -hls_enc_iv @var{iv}
-16-octet initialization vector for every segment instead
-of the autogenerated ones.
+ at 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
- at file{1602678741_init.mp4}
+will produce init like this @file{1602678741_init.mp4}.
- at item hls_fmp4_init_resend
+ at 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
+ at option{hls_segment_filename} option expression besides date/time values when
+ at 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
+ at 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
+ at 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
+ at 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
- at item hls_playlist_type event
-Emit @code{#EXT-X-PLAYLIST-TYPE:EVENT} in the m3u8 header. Forces
- at option{hls_list_size} to 0; the playlist can only be appended to.
+ at 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.
- at item hls_playlist_type vod
-Emit @code{#EXT-X-PLAYLIST-TYPE:VOD} in the m3u8 header. Forces
- at 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.
- at item method
+ at 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
- at 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.
- at item http_user_agent
+ at item http_user_agent @var{agent}
Override User-Agent field in HTTP header. Applicable only for HTTP output.
- at 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.
+ at 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.
+
+ at itemize
+ at 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
+ at 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.
-
+ at 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.
-
+ at 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},
+ at 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.
+
+ at 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
+ 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}.
+
+ at item
+Create two audio only and two video only variant streams. In addition to the
+ at code{#EXT-X-STREAM-INF} tag for each variant stream in the master playlist, the
+ at 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.
+ at item
+Create two audio only and one video only variant streams. In addition to the
+ at code{#EXT-X-STREAM-INF} tag for each variant stream in the master playlist, the
+ at 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.
+ at item
+Create two audio only and one video only variant streams. In addition to the
+ at code{#EXT-X-STREAM-INF} tag for each variant stream in the master playlist, the
+ at 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.
+ at item
+Create a single variant stream. Add the @code{#EXT-X-MEDIA} tag with
+ at 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
+ at 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.
-
- at item cc_stream_map
+ at 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
- at 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.
+ at option{var_stream_map} string.
- at 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
- at 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.
- at item master_pl_name
+If @option{var_stream_map} is not set, then the first available ccgroup in
+ at option{cc_stream_map} is mapped to the output variant stream.
+
+For example:
+ at 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
+ at 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.
+
+ at 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/}.
- at item master_pl_publish_rate
+ at 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.
- at item http_persistent
+ at item http_persistent @var{bool}
Use persistent HTTP connections. Applicable only for HTTP output.
- at item timeout
+ at item timeout @var{timeout}
Set timeout for socket I/O operations. Applicable only for HTTP output.
- at item ignore_io_errors
+ at item ignore_io_errors @var{bool}
Ignore IO errors during open, write and delete. Useful for long-duration runs with network output.
- at item headers
+ at item headers @var{headers}
Set custom HTTP headers, can override built in default headers. Applicable only for HTTP output.
-
@end table
@anchor{ico}
More information about the ffmpeg-cvslog
mailing list