[FFmpeg-devel] [PATCH] libavformat/hlsplaylist: add subtitle_varname for naming subtitle streams
Steven Liu
lingjiujianke at gmail.com
Fri Oct 4 13:09:29 EEST 2024
Jonathan Baecker <jonbae77 at gmail.com> 于2024年9月29日周日 05:56写道:
>
> If 'sname:*' is set in the var_stream_map variable, use it as
> the NAME attribute for subtitles. This improves the naming of
> subtitle streams in HTML players, providing clearer and more
> descriptive labels for users.
> ---
> doc/muxers.texi | 5 +++--
> libavformat/hlsenc.c | 7 ++++++-
> libavformat/hlsplaylist.c | 9 +++++++--
> libavformat/hlsplaylist.h | 2 +-
> 4 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/doc/muxers.texi b/doc/muxers.texi
> index ce93ba1488..04b7f20b7e 100644
> --- a/doc/muxers.texi
> +++ b/doc/muxers.texi
> @@ -2436,13 +2436,14 @@ ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
> @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.
> +'subtitle' and optional subtitle name, e.g. 'English'. 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 \
> -b:a:0 256k \
> -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,sname:English" \
> -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 \
> delete_segments+discont_start+split_by_time ./tmp/video.m3u8
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index 1e932b7b0e..7b2145f5bf 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -189,6 +189,7 @@ typedef struct VariantStream {
> const char *sgroup; /* subtitle group name */
> const char *ccgroup; /* closed caption group name */
> const char *varname; /* variant name */
> + const char *subtitle_varname; /* subtitle variant name */
> } VariantStream;
>
> typedef struct ClosedCaptionsStream {
> @@ -1533,7 +1534,8 @@ static int create_master_playlist(AVFormatContext *s,
> break;
> }
>
> - ff_hls_write_subtitle_rendition(hls->m3u8_out, sgroup, vtt_m3u8_rel_name, vs->language, i, hls->has_default_key ? vs->is_default : 1);
> + ff_hls_write_subtitle_rendition(hls->m3u8_out, sgroup, vtt_m3u8_rel_name, vs->language,
> + vs->subtitle_varname, i, hls->has_default_key ? vs->is_default : 1);
> }
>
> if (!hls->has_default_key || !hls->has_video_m3u8) {
> @@ -2107,6 +2109,9 @@ static int parse_variant_stream_mapstring(AVFormatContext *s)
> } else if (av_strstart(keyval, "name:", &val)) {
> vs->varname = val;
> continue;
> + } else if (av_strstart(keyval, "sname:", &val)) {
> + vs->subtitle_varname = val;
> + continue;
> } else if (av_strstart(keyval, "agroup:", &val)) {
> vs->agroup = val;
> continue;
> diff --git a/libavformat/hlsplaylist.c b/libavformat/hlsplaylist.c
> index f8a6977702..17b93a5ef1 100644
> --- a/libavformat/hlsplaylist.c
> +++ b/libavformat/hlsplaylist.c
> @@ -57,13 +57,18 @@ void ff_hls_write_audio_rendition(AVIOContext *out, const char *agroup,
>
> void ff_hls_write_subtitle_rendition(AVIOContext *out, const char *sgroup,
> const char *filename, const char *language,
> - int name_id, int is_default)
> + const char *sname, int name_id, int is_default)
> {
> if (!out || !filename)
> return;
>
> avio_printf(out, "#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"%s\"", sgroup);
> - avio_printf(out, ",NAME=\"subtitle_%d\",DEFAULT=%s,", name_id, is_default ? "YES" : "NO");
> + if (sname) {
> + avio_printf(out, ",NAME=\"%s\",", sname);
> + } else {
> + avio_printf(out, ",NAME=\"subtitle_%d\",", name_id);
> + }
> + avio_printf(out, "DEFAULT=%s,", is_default ? "YES" : "NO");
> if (language) {
> avio_printf(out, "LANGUAGE=\"%s\",", language);
> }
> diff --git a/libavformat/hlsplaylist.h b/libavformat/hlsplaylist.h
> index d7aa44d8dc..ec44e5a0ae 100644
> --- a/libavformat/hlsplaylist.h
> +++ b/libavformat/hlsplaylist.h
> @@ -41,7 +41,7 @@ void ff_hls_write_audio_rendition(AVIOContext *out, const char *agroup,
> int name_id, int is_default, int nb_channels);
> void ff_hls_write_subtitle_rendition(AVIOContext *out, const char *sgroup,
> const char *filename, const char *language,
> - int name_id, int is_default);
> + const char *sname, int name_id, int is_default);
> void ff_hls_write_stream_info(AVStream *st, AVIOContext *out, int bandwidth,
> int avg_bandwidth,
> const char *filename, const char *agroup,
> --
> 2.46.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
The modified api looks only be used by hlsenc, and it looks fine to me.
Will apply after 48 hours if there have no more comments.
Thanks
Steven
More information about the ffmpeg-devel
mailing list